/[Apache-SVN]/httpd/httpd/trunk/modules/database/mod_dbd.c
ViewVC logotype

Diff of /httpd/httpd/trunk/modules/database/mod_dbd.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 708820, Wed Oct 29 08:10:21 2008 UTC revision 766938, Tue Apr 21 01:29:15 2009 UTC
# Line 39  Line 39 
39    
40  extern module AP_MODULE_DECLARE_DATA dbd_module;  extern module AP_MODULE_DECLARE_DATA dbd_module;
41    
42    APR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(dbd, AP, apr_status_t, post_connect,
43                                        (apr_pool_t *pool, dbd_cfg_t *cfg,
44                                        ap_dbd_t *dbd),
45                                        (pool, cfg, dbd), OK, DECLINED)
46    
47  /************ svr cfg: manage db connection pool ****************/  /************ svr cfg: manage db connection pool ****************/
48    
49  #define NMIN_SET     0x1  #define NMIN_SET     0x1
# Line 46  extern module AP_MODULE_DECLARE_DATA dbd Line 51  extern module AP_MODULE_DECLARE_DATA dbd
51  #define NMAX_SET     0x4  #define NMAX_SET     0x4
52  #define EXPTIME_SET  0x8  #define EXPTIME_SET  0x8
53    
 typedef struct {  
     server_rec *server;  
     const char *name;  
     const char *params;  
     int persist;  
 #if APR_HAS_THREADS  
     int nmin;  
     int nkeep;  
     int nmax;  
     int exptime;  
     int set;  
 #endif  
     apr_hash_t *queries;  
 } dbd_cfg_t;  
   
54  typedef struct dbd_group_t dbd_group_t;  typedef struct dbd_group_t dbd_group_t;
55    
56  struct dbd_group_t {  struct dbd_group_t {
# Line 99  static const char *const no_dbdriver = " Line 89  static const char *const no_dbdriver = "
89  #define DEFAULT_NMAX 10  #define DEFAULT_NMAX 10
90  #define DEFAULT_EXPTIME 300  #define DEFAULT_EXPTIME 300
91    
92    #define DEFAULT_SQL_INIT_ARRAY_SIZE 5
93    
94  static void *create_dbd_config(apr_pool_t *pool, server_rec *s)  static void *create_dbd_config(apr_pool_t *pool, server_rec *s)
95  {  {
96      svr_cfg *svr = apr_pcalloc(pool, sizeof(svr_cfg));      svr_cfg *svr = apr_pcalloc(pool, sizeof(svr_cfg));
# Line 115  static void *create_dbd_config(apr_pool_ Line 107  static void *create_dbd_config(apr_pool_
107      cfg->exptime = DEFAULT_EXPTIME;      cfg->exptime = DEFAULT_EXPTIME;
108  #endif  #endif
109      cfg->queries = apr_hash_make(pool);      cfg->queries = apr_hash_make(pool);
110        cfg->init_queries = apr_array_make(pool, DEFAULT_SQL_INIT_ARRAY_SIZE,
111                                           sizeof(const char *));
112    
113      return svr;      return svr;
114  }  }
# Line 137  static void *merge_dbd_config(apr_pool_t Line 131  static void *merge_dbd_config(apr_pool_t
131      new->exptime = (add->set&EXPTIME_SET) ? add->exptime : base->exptime;      new->exptime = (add->set&EXPTIME_SET) ? add->exptime : base->exptime;
132  #endif  #endif
133      new->queries = apr_hash_overlay(pool, add->queries, base->queries);      new->queries = apr_hash_overlay(pool, add->queries, base->queries);
134        new->init_queries = apr_array_append(pool, add->init_queries,
135                                             base->init_queries);
136    
137      return svr;      return svr;
138  }  }
139    
140    static void ap_dbd_sql_init(server_rec *s, const char *query)
141    {
142        svr_cfg *svr;
143        const char **arr_item;
144    
145        svr = ap_get_module_config(s->module_config, &dbd_module);
146        if (!svr) {
147             /* some modules may call from within config directive handlers, and
148              * if these are called in a server context that contains no mod_dbd
149              * config directives, then we have to create our own server config
150              */
151             svr = create_dbd_config(config_pool, s);
152             ap_set_module_config(s->module_config, &dbd_module, svr);
153        }
154    
155        if (query) {
156            arr_item = apr_array_push(svr->cfg->init_queries);
157            *arr_item = query;
158        }
159    }
160    
161  static const char *dbd_param(cmd_parms *cmd, void *dconf, const char *val)  static const char *dbd_param(cmd_parms *cmd, void *dconf, const char *val)
162  {  {
163      const apr_dbd_driver_t *driver = NULL;      const apr_dbd_driver_t *driver = NULL;
# Line 244  static const char *dbd_prepare(cmd_parms Line 261  static const char *dbd_prepare(cmd_parms
261      return NULL;      return NULL;
262  }  }
263    
264    static const char *dbd_init_sql(cmd_parms *cmd, void *dconf, const char *query)
265    {
266        if (!query || *query == '\n') {
267            return "You should specify SQL statement";
268        }
269    
270        ap_dbd_sql_init(cmd->server, query);
271    
272        return NULL;
273    }
274    
275  static const command_rec dbd_cmds[] = {  static const command_rec dbd_cmds[] = {
276      AP_INIT_TAKE1("DBDriver", dbd_param, (void*)cmd_name, RSRC_CONF,      AP_INIT_TAKE1("DBDriver", dbd_param, (void*)cmd_name, RSRC_CONF,
277                    "SQL Driver"),                    "SQL Driver"),
# Line 254  static const command_rec dbd_cmds[] = { Line 282  static const command_rec dbd_cmds[] = {
282      AP_INIT_TAKE12("DBDPrepareSQL", dbd_prepare, NULL, RSRC_CONF,      AP_INIT_TAKE12("DBDPrepareSQL", dbd_prepare, NULL, RSRC_CONF,
283                     "SQL statement to prepare (or nothing, to override "                     "SQL statement to prepare (or nothing, to override "
284                     "statement inherited from main server) and label"),                     "statement inherited from main server) and label"),
285        AP_INIT_TAKE1("DBDInitSQL", dbd_init_sql, NULL, RSRC_CONF,
286                       "SQL statement to be executed after connection is created"),
287  #if APR_HAS_THREADS  #if APR_HAS_THREADS
288      AP_INIT_TAKE1("DBDMin", dbd_param_int, (void*)cmd_min, RSRC_CONF,      AP_INIT_TAKE1("DBDMin", dbd_param_int, (void*)cmd_min, RSRC_CONF,
289                    "Minimum number of connections"),                    "Minimum number of connections"),
# Line 430  static apr_status_t dbd_prepared_init(ap Line 460  static apr_status_t dbd_prepared_init(ap
460      return rv;      return rv;
461  }  }
462    
463    static apr_status_t dbd_init_sql_init(apr_pool_t *pool, dbd_cfg_t *cfg,
464                                          ap_dbd_t *rec)
465    {
466        int i;
467        apr_status_t rv = APR_SUCCESS;
468    
469        for (i = 0; i < cfg->init_queries->nelts; i++) {
470            int nrows;
471            char **query_p;
472    
473            query_p = (char **)cfg->init_queries->elts + i;
474    
475            if (apr_dbd_query(rec->driver, rec->handle, &nrows, *query_p)) {
476                rv = APR_EGENERAL;
477                break;
478            }
479        }
480    
481        return rv;
482    }
483    
484  static apr_status_t dbd_close(void *data)  static apr_status_t dbd_close(void *data)
485  {  {
486      ap_dbd_t *rec = data;      ap_dbd_t *rec = data;
# Line 551  static apr_status_t dbd_construct(void * Line 602  static apr_status_t dbd_construct(void *
602          return rv;          return rv;
603      }      }
604    
605        dbd_run_post_connect(prepared_pool, cfg, rec);
606    
607      *data_ptr = rec;      *data_ptr = rec;
608    
609      return APR_SUCCESS;      return APR_SUCCESS;
# Line 921  static void dbd_hooks(apr_pool_t *pool) Line 974  static void dbd_hooks(apr_pool_t *pool)
974      APR_REGISTER_OPTIONAL_FN(ap_dbd_acquire);      APR_REGISTER_OPTIONAL_FN(ap_dbd_acquire);
975      APR_REGISTER_OPTIONAL_FN(ap_dbd_cacquire);      APR_REGISTER_OPTIONAL_FN(ap_dbd_cacquire);
976    
977        APR_OPTIONAL_HOOK(dbd, post_connect, dbd_init_sql_init,
978                          NULL, NULL, APR_HOOK_MIDDLE);
979    
980      apr_dbd_init(pool);      apr_dbd_init(pool);
981  }  }
982    

Legend:
Removed from v.708820  
changed lines
  Added in v.766938

apache@apache.org
ViewVC Help
Powered by ViewVC 1.1.2