mod_dbd.c revision d66ac514cc15e99228d72c56c6c3daf25da8d360
/* Copyright 2003-5 WebThing Ltd
* Copyright 2005 The Apache Software Foundation or its licensors, as
* applicable.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* Overview of what this is and does:
* or
*/
/* Bump the version for committing to apache svn */
#define VERSION "0.2"
#include <ctype.h>
#include "http_protocol.h"
#include "http_config.h"
#include "http_log.h"
#include "apr_reslist.h"
#include "apr_strings.h"
#include "apr_dbd.h"
#include "mod_dbd.h"
/************ svr cfg: manage db connection pool ****************/
typedef struct dbd_prepared {
const char *label;
const char *query;
struct dbd_prepared *next;
} dbd_prepared;
typedef struct svr_cfg {
const char *name;
const char *params;
int persist;
#if APR_HAS_THREADS
int nmin;
int nkeep;
int nmax;
int exptime;
#else
#endif
} svr_cfg;
} cmd_parts;
for (p = val; *p; ++p) \
if (!isdigit(*p)) \
return "Argument must be numeric!"
{
const char *p;
case cmd_name:
/* loading the driver involves once-only dlloading that is
* best done at server startup. This also guarantees that
* load_driver won't return an error later.
*/
case APR_ENOTIMPL:
case APR_EDSOOPEN:
"DBD: Can't load driver file apr_dbd_%s.so",
case APR_ESYMNOTFOUND:
"DBD: Failed to load driver apr_dbd_%s_driver",
}
break;
case cmd_params:
break;
case cmd_persist:
break;
#if APR_HAS_THREADS
case cmd_min:
break;
case cmd_keep:
break;
case cmd_max:
break;
case cmd_exp:
break;
#endif
}
return NULL;
}
const char *label)
{
return NULL;
}
static const command_rec dbd_cmds[] = {
"SQL Driver"),
"SQL Driver Params"),
"Use persistent connection/pool"),
"Prepared SQL statement, label"),
#if APR_HAS_THREADS
"Minimum number of connections"),
"Maximum number of sustained connections"),
"Maximum number of connections"),
"Keepalive time for idle connections"),
#endif
{NULL}
};
#define COND_PARAM(x,val) \
}
#define COND_PARAM0(x) COND_PARAM(x,0)
#if APR_HAS_THREADS
#endif
return cfg;
}
{
return svr;
}
{
dbd_prepared *p;
}
else {
ret = APR_EGENERAL;
}
}
return ret;
}
#if APR_HAS_THREADS
/************ svr cfg: manage db connection pool ****************/
/* an apr_reslist_constructor for SQL connections */
{
switch (rv) {
case APR_EGENERAL:
return rv;
}
return rv;
}
{
}
{
if (rv == APR_SUCCESS) {
(void*)apr_reslist_destroy,
}
else {
"DBD Pool: failed to initialise");
}
return rv;
}
#endif
/* Functions we export for modules to use:
- open acquires a connection from the pool (opens one if necessary)
- close releases it back in to the pool
*/
#if APR_HAS_THREADS
{
const char *errmsg;
switch (rv) {
case APR_EGENERAL:
"DBD: Can't connect to %s[%s]",
return NULL;
}
return rec;
}
return NULL;
}
}
"Failed to acquire DBD connection from pool!");
return NULL;
}
if (!errmsg) {
errmsg = "(unknown)";
}
return NULL;
}
return rec;
}
#else
{
const char *errmsg;
switch (rv) {
case APR_EGENERAL:
"DBD: Can't connect to %s[%s]",
return NULL;
}
return rec;
}
/* since we're in nothread-land, we can mess with svr->conn with impunity */
if (!errmsg) {
errmsg = "(unknown)";
}
}
}
switch (rv) {
case APR_EGENERAL:
"DBD: Can't connect to %s[%s]",
return NULL;
}
}
}
#endif
{
}
#if APR_HAS_THREADS
else {
}
#endif
}
#if APR_HAS_THREADS
typedef struct {
} dbd_pool_rec;
{
return APR_SUCCESS;
}
{
if (!req) {
}
else {
}
}
}
}
#else
{
if (!ret) {
if ( ret ) {
}
/* if persist then dbd_open registered cleanup on proc pool */
}
}
return ret;
}
#endif
{
}
else {
}
return OK;
}
{
#if APR_HAS_THREADS
#endif
}
NULL,
NULL,
};