Lines 39-44
Link Here
|
39 |
|
39 |
|
40 |
extern module AP_MODULE_DECLARE_DATA dbd_module; |
40 |
extern module AP_MODULE_DECLARE_DATA dbd_module; |
41 |
|
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 |
|
42 |
/************ svr cfg: manage db connection pool ****************/ |
47 |
/************ svr cfg: manage db connection pool ****************/ |
43 |
|
48 |
|
44 |
#define NMIN_SET 0x1 |
49 |
#define NMIN_SET 0x1 |
Lines 46-66
Link Here
|
46 |
#define NMAX_SET 0x4 |
51 |
#define NMAX_SET 0x4 |
47 |
#define EXPTIME_SET 0x8 |
52 |
#define EXPTIME_SET 0x8 |
48 |
|
53 |
|
49 |
typedef struct { |
|
|
50 |
server_rec *server; |
51 |
const char *name; |
52 |
const char *params; |
53 |
int persist; |
54 |
#if APR_HAS_THREADS |
55 |
int nmin; |
56 |
int nkeep; |
57 |
int nmax; |
58 |
int exptime; |
59 |
int set; |
60 |
#endif |
61 |
apr_hash_t *queries; |
62 |
} dbd_cfg_t; |
63 |
|
64 |
typedef struct dbd_group_t dbd_group_t; |
54 |
typedef struct dbd_group_t dbd_group_t; |
65 |
|
55 |
|
66 |
struct dbd_group_t { |
56 |
struct dbd_group_t { |
Lines 99-104
Link Here
|
99 |
#define DEFAULT_NMAX 10 |
89 |
#define DEFAULT_NMAX 10 |
100 |
#define DEFAULT_EXPTIME 300 |
90 |
#define DEFAULT_EXPTIME 300 |
101 |
|
91 |
|
|
|
92 |
#define DEFAULT_SQL_INIT_ARRAY_SIZE 5 |
93 |
|
102 |
static void *create_dbd_config(apr_pool_t *pool, server_rec *s) |
94 |
static void *create_dbd_config(apr_pool_t *pool, server_rec *s) |
103 |
{ |
95 |
{ |
104 |
svr_cfg *svr = apr_pcalloc(pool, sizeof(svr_cfg)); |
96 |
svr_cfg *svr = apr_pcalloc(pool, sizeof(svr_cfg)); |
Lines 115-120
Link Here
|
115 |
cfg->exptime = DEFAULT_EXPTIME; |
107 |
cfg->exptime = DEFAULT_EXPTIME; |
116 |
#endif |
108 |
#endif |
117 |
cfg->queries = apr_hash_make(pool); |
109 |
cfg->queries = apr_hash_make(pool); |
|
|
110 |
cfg->init_queries = apr_array_make(pool, DEFAULT_SQL_INIT_ARRAY_SIZE, |
111 |
sizeof(const char *)); |
118 |
|
112 |
|
119 |
return svr; |
113 |
return svr; |
120 |
} |
114 |
} |
Lines 137-146
Link Here
|
137 |
new->exptime = (add->set&EXPTIME_SET) ? add->exptime : base->exptime; |
131 |
new->exptime = (add->set&EXPTIME_SET) ? add->exptime : base->exptime; |
138 |
#endif |
132 |
#endif |
139 |
new->queries = apr_hash_overlay(pool, add->queries, base->queries); |
133 |
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); |
140 |
|
136 |
|
141 |
return svr; |
137 |
return svr; |
142 |
} |
138 |
} |
143 |
|
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 |
|
144 |
static const char *dbd_param(cmd_parms *cmd, void *dconf, const char *val) |
161 |
static const char *dbd_param(cmd_parms *cmd, void *dconf, const char *val) |
145 |
{ |
162 |
{ |
146 |
const apr_dbd_driver_t *driver = NULL; |
163 |
const apr_dbd_driver_t *driver = NULL; |
Lines 244-249
Link Here
|
244 |
return NULL; |
261 |
return NULL; |
245 |
} |
262 |
} |
246 |
|
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 |
|
247 |
static const command_rec dbd_cmds[] = { |
275 |
static const command_rec dbd_cmds[] = { |
248 |
AP_INIT_TAKE1("DBDriver", dbd_param, (void*)cmd_name, RSRC_CONF, |
276 |
AP_INIT_TAKE1("DBDriver", dbd_param, (void*)cmd_name, RSRC_CONF, |
249 |
"SQL Driver"), |
277 |
"SQL Driver"), |
Lines 254-259
Link Here
|
254 |
AP_INIT_TAKE12("DBDPrepareSQL", dbd_prepare, NULL, RSRC_CONF, |
282 |
AP_INIT_TAKE12("DBDPrepareSQL", dbd_prepare, NULL, RSRC_CONF, |
255 |
"SQL statement to prepare (or nothing, to override " |
283 |
"SQL statement to prepare (or nothing, to override " |
256 |
"statement inherited from main server) and label"), |
284 |
"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"), |
257 |
#if APR_HAS_THREADS |
287 |
#if APR_HAS_THREADS |
258 |
AP_INIT_TAKE1("DBDMin", dbd_param_int, (void*)cmd_min, RSRC_CONF, |
288 |
AP_INIT_TAKE1("DBDMin", dbd_param_int, (void*)cmd_min, RSRC_CONF, |
259 |
"Minimum number of connections"), |
289 |
"Minimum number of connections"), |
Lines 430-435
Link Here
|
430 |
return rv; |
460 |
return rv; |
431 |
} |
461 |
} |
432 |
|
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 |
|
433 |
static apr_status_t dbd_close(void *data) |
484 |
static apr_status_t dbd_close(void *data) |
434 |
{ |
485 |
{ |
435 |
ap_dbd_t *rec = data; |
486 |
ap_dbd_t *rec = data; |
Lines 551-556
Link Here
|
551 |
return rv; |
602 |
return rv; |
552 |
} |
603 |
} |
553 |
|
604 |
|
|
|
605 |
dbd_run_post_connect(prepared_pool, cfg, rec); |
606 |
|
554 |
*data_ptr = rec; |
607 |
*data_ptr = rec; |
555 |
|
608 |
|
556 |
return APR_SUCCESS; |
609 |
return APR_SUCCESS; |
Lines 921-926
Link Here
|
921 |
APR_REGISTER_OPTIONAL_FN(ap_dbd_acquire); |
974 |
APR_REGISTER_OPTIONAL_FN(ap_dbd_acquire); |
922 |
APR_REGISTER_OPTIONAL_FN(ap_dbd_cacquire); |
975 |
APR_REGISTER_OPTIONAL_FN(ap_dbd_cacquire); |
923 |
|
976 |
|
|
|
977 |
APR_OPTIONAL_HOOK(dbd, post_connect, dbd_init_sql_init, |
978 |
NULL, NULL, APR_HOOK_MIDDLE); |
979 |
|
924 |
apr_dbd_init(pool); |
980 |
apr_dbd_init(pool); |
925 |
} |
981 |
} |
926 |
|
982 |
|