View | Details | Raw Unified | Return to bug 46827
Collapse All | Expand All

(-)/home/knight/micex/distr/httpd-git/modules/database/mod_dbd.h (+20 lines)
Lines 55-60 Link Here
55
#include <httpd.h>
55
#include <httpd.h>
56
#include <apr_optional.h>
56
#include <apr_optional.h>
57
#include <apr_hash.h>
57
#include <apr_hash.h>
58
#include <apr_hooks.h>
59
60
typedef struct {
61
    server_rec *server;
62
    const char *name;
63
    const char *params;
64
    int persist;
65
#if APR_HAS_THREADS
66
    int nmin;
67
    int nkeep;
68
    int nmax;
69
    int exptime;
70
    int set;
71
#endif
72
    apr_hash_t *queries;
73
    apr_array_header_t *init_queries;
74
} dbd_cfg_t;
58
75
59
typedef struct {
76
typedef struct {
60
    apr_dbd_t *handle;
77
    apr_dbd_t *handle;
Lines 98-103 Link Here
98
APR_DECLARE_OPTIONAL_FN(ap_dbd_t*, ap_dbd_cacquire, (conn_rec*));
115
APR_DECLARE_OPTIONAL_FN(ap_dbd_t*, ap_dbd_cacquire, (conn_rec*));
99
APR_DECLARE_OPTIONAL_FN(void, ap_dbd_prepare, (server_rec*, const char*, const char*));
116
APR_DECLARE_OPTIONAL_FN(void, ap_dbd_prepare, (server_rec*, const char*, const char*));
100
117
118
APR_DECLARE_EXTERNAL_HOOK(dbd, AP, apr_status_t, post_connect,
119
                          (apr_pool_t *, dbd_cfg_t *, ap_dbd_t *));
120
101
#endif
121
#endif
102
/** @} */
122
/** @} */
103
123
(-)/home/knight/micex/distr/httpd-git/modules/database/mod_dbd.c (-15 / +71 lines)
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

Return to bug 46827