/* * cmd_defineconnection: takes all information about a database * connection and stores it for later use. * * Inputs: * cmd->argv[0]: connection name * cmd->argv[1]: username portion of the SQLConnectInfo directive * cmd->argv[2]: password portion of the SQLConnectInfo directive * cmd->argv[3]: info portion of the SQLConnectInfo directive * Optional: * cmd->argv[4]: time-to-live in seconds * * Returns: * either a properly filled error modret_t if the connection could not * defined, or a simple non-error modret_t. * * Notes: * time-to-live is the length of time to allow a connection to remain unused; * once that amount of time has passed, a connection should be closed and * it's connection count should be reduced to 0. If ttl is 0, or ttl is not * a number or ttl is negative, the connection will be assumed to have no * associated timer. */ MODRET cmd_defineconnection(cmd_rec *cmd) { char *info = NULL; char *name = NULL; char *db = NULL; char *host = NULL; char *port = NULL; char *havehost = NULL; char *haveport = NULL; char *connectstring = NULL; conn_entry_t *entry = NULL; db_conn_t *conn = NULL; sql_log(DEBUG_FUNC, "%s", "entering \tpostgres cmd_defineconnection"); _sql_check_cmd(cmd, "cmd_defineconnection"); if ((cmd->argc < 4) || (cmd->argc > 5) || (!cmd->argv[0])) { sql_log(DEBUG_FUNC, "%s", "exiting \tpostgres cmd_defineconnection"); return PR_ERROR_MSG(cmd, MOD_SQL_POSTGRES_VERSION, "badly formed request"); } if (!conn_pool) { pr_log_pri(PR_LOG_WARNING, "warning: the mod_sql_postgres module has not " "been properly initialized. Please make sure your --with-modules " "configure option lists mod_sql *before* mod_sql_postgres, and " "recompile."); sql_log(DEBUG_FUNC, "%s", "The mod_sql_postgres module has not been " "properly initialized. Please make sure your --with-modules configure " "option lists mod_sql *before* mod_sql_postgres, and recompile."); sql_log(DEBUG_FUNC, "%s", "exiting \tpostgres cmd_defineconnection"); return PR_ERROR_MSG(cmd, MOD_SQL_POSTGRES_VERSION, "uninitialized module"); } conn = (db_conn_t *) pcalloc(conn_pool, sizeof(db_conn_t)); name = pstrdup(conn_pool, cmd->argv[0]); conn->user = pstrdup(conn_pool, cmd->argv[1]); conn->pass = pstrdup(conn_pool, cmd->argv[2]); info = cmd->argv[3]; db = pstrdup(cmd->tmp_pool, info); havehost = strchr(db, '@'); haveport = strchr(db, ':'); /* * if haveport, parse it, otherwise default it. * if haveport, set it to '\0' * * if havehost, parse it, otherwise default it. * if havehost, set it to '\0' */ if (haveport) { port = haveport + 1; *haveport = '\0'; } else { port = _POSTGRES_PORT; } if (havehost) { host = havehost + 1; *havehost = '\0'; } else { host = "localhost"; } conn->host = pstrdup(conn_pool, host); conn->db = pstrdup(conn_pool, db); conn->port = pstrdup(conn_pool, port); /* setup the connect string the way postgres likes it */ connectstring = pstrcat(cmd->tmp_pool, "host='", conn->host, "' port='", conn->port,"' dbname='", conn->db, "' user='******' password='******'", NULL); conn->connectstring = pstrdup(conn_pool, connectstring); /* insert the new conn_info into the connection hash */ if (!(entry = _sql_add_connection(conn_pool, name, (void *) conn))) { sql_log(DEBUG_FUNC, "%s", "exiting \tpostgres cmd_defineconnection"); return PR_ERROR_MSG(cmd, MOD_SQL_POSTGRES_VERSION, "named connection already exists"); } if (cmd->argc == 5) { entry->ttl = (int) strtol(cmd->argv[4], (char **) NULL, 10); if (entry->ttl >= 1) { pr_sql_conn_policy = SQL_CONN_POLICY_TIMER; } else { entry->ttl = 0; } } entry->timer = 0; entry->connections = 0; sql_log(DEBUG_INFO, " name: '%s'", entry->name); sql_log(DEBUG_INFO, " user: '******'", conn->user); sql_log(DEBUG_INFO, " host: '%s'", conn->host); sql_log(DEBUG_INFO, " db: '%s'", conn->db); sql_log(DEBUG_INFO, " port: '%s'", conn->port); sql_log(DEBUG_INFO, " ttl: '%d'", entry->ttl); sql_log(DEBUG_FUNC, "%s", "exiting \tpostgres cmd_defineconnection"); return PR_HANDLED(cmd); }
/* * cmd_defineconnection: takes all information about a database * connection and stores it for later use. * * Inputs: * cmd->argv[0]: connection name * cmd->argv[1]: username portion of the SQLConnectInfo directive * cmd->argv[2]: password portion of the SQLConnectInfo directive * cmd->argv[3]: info portion of the SQLConnectInfo directive * Optional: * cmd->argv[4]: time-to-live in seconds * * Returns: * either a properly filled error modret_t if the connection could not * defined, or a simple non-error modret_t. * * Notes: * time-to-live is the length of time to allow a connection to remain unused; * once that amount of time has passed, a connection should be closed and * it's connection count should be reduced to 0. If ttl is 0, or ttl is not * a number or ttl is negative, the connection will be assumed to have no * associated timer. */ MODRET cmd_defineconnection(cmd_rec *cmd) { char *info = NULL; char *name = NULL; char *db = NULL; char *host = NULL; char *port = NULL; char *havehost = NULL; char *haveport = NULL; char *connectstring = NULL; conn_entry_t *entry = NULL; db_conn_t *conn = NULL; sql_log(DEBUG_FUNC, "%s", "entering \tpostgres cmd_defineconnection"); _sql_check_cmd(cmd, "cmd_defineconnection"); if ((cmd->argc < 4) || (cmd->argc > 5) || (!cmd->argv[0])) { sql_log(DEBUG_FUNC, "%s", "exiting \tpostgres cmd_defineconnection"); return ERROR_MSG(cmd, MOD_SQL_POSTGRES_VERSION, "badly formed request"); } conn = (db_conn_t *) palloc(conn_pool, sizeof(db_conn_t)); name = pstrdup(conn_pool, cmd->argv[0]); conn->user = pstrdup(conn_pool, cmd->argv[1]); conn->pass = pstrdup(conn_pool, cmd->argv[2]); info = cmd->argv[3]; db = pstrdup(cmd->tmp_pool, info); havehost = strchr(db, '@'); haveport = strchr(db, ':'); /* * if haveport, parse it, otherwise default it. * if haveport, set it to '\0' * * if havehost, parse it, otherwise default it. * if havehost, set it to '\0' */ if (haveport) { port = haveport + 1; *haveport = '\0'; } else { port = _POSTGRES_PORT; } if (havehost) { host = havehost + 1; *havehost = '\0'; } else { host = "localhost"; } conn->host = pstrdup(conn_pool, host); conn->db = pstrdup(conn_pool, db); conn->port = pstrdup(conn_pool, port); /* setup the connect string the way postgres likes it */ connectstring = pstrcat(cmd->tmp_pool, "host='", conn->host, "' port='", conn->port,"' dbname='", conn->db, "' user='******' password='******'", NULL); conn->connectstring = pstrdup(conn_pool, connectstring); /* insert the new conn_info into the connection hash */ if (!(entry = _sql_add_connection(conn_pool, name, (void *) conn))) { sql_log(DEBUG_FUNC, "%s", "exiting \tpostgres cmd_defineconnection"); return ERROR_MSG(cmd, MOD_SQL_POSTGRES_VERSION, "named connection already exists"); } entry->ttl = (cmd->argc == 5) ? (int) strtol(cmd->argv[4], (char **)NULL, 10) : 0; if (entry->ttl < 0) entry->ttl = 0; entry->timer = 0; entry->connections = 0; sql_log(DEBUG_INFO, " name: '%s'", entry->name); sql_log(DEBUG_INFO, " user: '******'", conn->user); sql_log(DEBUG_INFO, " host: '%s'", conn->host); sql_log(DEBUG_INFO, " db: '%s'", conn->db); sql_log(DEBUG_INFO, " port: '%s'", conn->port); sql_log(DEBUG_INFO, " ttl: '%d'", entry->ttl); sql_log(DEBUG_FUNC, "%s", "exiting \tpostgres cmd_defineconnection"); return HANDLED(cmd); }