diff options
Diffstat (limited to 'cdr/cdr_pgsql.c')
-rw-r--r-- | cdr/cdr_pgsql.c | 64 |
1 files changed, 26 insertions, 38 deletions
diff --git a/cdr/cdr_pgsql.c b/cdr/cdr_pgsql.c index 310411cd3..37bc08406 100644 --- a/cdr/cdr_pgsql.c +++ b/cdr/cdr_pgsql.c @@ -75,6 +75,7 @@ static char *encoding; static char *tz; static int connected = 0; +/* Optimization to reduce number of memory allocations */ static int maxsize = 512, maxsize2 = 512; static time_t connect_time = 0; static int totalrecords = 0; @@ -453,6 +454,15 @@ static int pgsql_log(struct ast_cdr *cdr) records++; } PQclear(result); + + /* Next time, just allocate buffers that are that big to start with. */ + if (ast_str_strlen(sql) > maxsize) { + maxsize = ast_str_strlen(sql); + } + if (ast_str_strlen(sql2) > maxsize2) { + maxsize2 = ast_str_strlen(sql2); + } + ast_free(sql); ast_free(sql2); } @@ -670,42 +680,20 @@ static int config_module(int reload) version = PQserverVersion(conn); if (version >= 70300) { - char *schemaname, *tablename; + char *schemaname, *tablename, *tmp_schemaname, *tmp_tablename; if (strchr(table, '.')) { - schemaname = ast_strdupa(table); - tablename = strchr(schemaname, '.'); - *tablename++ = '\0'; + tmp_schemaname = ast_strdupa(table); + tmp_tablename = strchr(tmp_schemaname, '.'); + *tmp_tablename++ = '\0'; } else { - schemaname = ""; - tablename = table; + tmp_schemaname = ""; + tmp_tablename = table; } + tablename = ast_alloca(strlen(tmp_tablename) * 2 + 1); + PQescapeStringConn(conn, tablename, tmp_tablename, strlen(tmp_tablename), NULL); - /* Escape special characters in schemaname */ - if (strchr(schemaname, '\\') || strchr(schemaname, '\'')) { - char *tmp = schemaname, *ptr; - - ptr = schemaname = ast_alloca(strlen(tmp) * 2 + 1); - for (; *tmp; tmp++) { - if (strchr("\\'", *tmp)) { - *ptr++ = *tmp; - } - *ptr++ = *tmp; - } - *ptr = '\0'; - } - /* Escape special characters in tablename */ - if (strchr(tablename, '\\') || strchr(tablename, '\'')) { - char *tmp = tablename, *ptr; - - ptr = tablename = ast_alloca(strlen(tmp) * 2 + 1); - for (; *tmp; tmp++) { - if (strchr("\\'", *tmp)) { - *ptr++ = *tmp; - } - *ptr++ = *tmp; - } - *ptr = '\0'; - } + schemaname = ast_alloca(strlen(tmp_schemaname) * 2 + 1); + PQescapeStringConn(conn, schemaname, tmp_schemaname, strlen(tmp_schemaname), NULL); snprintf(sqlcmd, sizeof(sqlcmd), "SELECT a.attname, t.typname, a.attlen, a.attnotnull, d.adsrc, a.atttypmod FROM (((pg_catalog.pg_class c INNER JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace AND c.relname = '%s' AND n.nspname = %s%s%s) INNER JOIN pg_catalog.pg_attribute a ON (NOT a.attisdropped) AND a.attnum > 0 AND a.attrelid = c.oid) INNER JOIN pg_catalog.pg_type t ON t.oid = a.atttypid) LEFT OUTER JOIN pg_attrdef d ON a.atthasdef AND d.adrelid = a.attrelid AND d.adnum = a.attnum ORDER BY n.nspname, c.relname, attnum", tablename, @@ -801,9 +789,9 @@ static int reload(void) } AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "PostgreSQL CDR Backend", - .support_level = AST_MODULE_SUPPORT_EXTENDED, - .load = load_module, - .unload = unload_module, - .reload = reload, - .load_pri = AST_MODPRI_CDR_DRIVER, - ); + .support_level = AST_MODULE_SUPPORT_EXTENDED, + .load = load_module, + .unload = unload_module, + .reload = reload, + .load_pri = AST_MODPRI_CDR_DRIVER, +); |