| 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 |
| 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 { |
| 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)); |
| 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 |
} |
} |
| 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; |
| 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"), |
| 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"), |
| 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; |
| 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; |
| 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 |
|
|