Code cleanup, saner way of stripping chars from string
This commit is contained in:
parent
a0d36d8f9d
commit
0e31a974d4
|
@ -187,32 +187,35 @@ static void write_cdr(const char *path, const char *log_line)
|
||||||
|
|
||||||
static int save_cdr(const char * const table, const char * const template, const char * const cdr)
|
static int save_cdr(const char * const table, const char * const template, const char * const cdr)
|
||||||
{
|
{
|
||||||
char* columns;
|
char *columns, *values;
|
||||||
char* values;
|
char *p, *q;
|
||||||
char* p;
|
|
||||||
unsigned clen;
|
|
||||||
unsigned vlen;
|
unsigned vlen;
|
||||||
char *query;
|
char *query;
|
||||||
const char* const query_template = "INSERT INTO %s (%s) VALUES (%s);";
|
|
||||||
PGresult *res;
|
PGresult *res;
|
||||||
char *spaceColumns, *pt, *nullValues, *temp, *tp;
|
char *nullValues, *temp, *tp;
|
||||||
int spaceCounter = 0, nullCounter = 0, charCounter = 0;
|
int nullCounter = 0, charCounter = 0;
|
||||||
|
|
||||||
if (!table || !*table || !template || !*template || !cdr || !*cdr) {
|
if (!table || !*table || !template || !*template || !cdr || !*cdr) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Bad parameter\n");
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Bad parameter\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Build comma-separated list of field names by dropping $ { } ; chars */
|
||||||
columns = strdup(template);
|
columns = strdup(template);
|
||||||
for (p = columns; *p; ++p) {
|
for (p = columns, q = columns; *p; ++p) {
|
||||||
switch (*p) {
|
switch (*p) {
|
||||||
case '$': case '"': case '{': case '}': case ';':
|
case '$': case '"': case '{': case '}': case ';':
|
||||||
*p = ' ';
|
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
*q++ = *p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
clen = p - columns;
|
*q = '\0';
|
||||||
|
|
||||||
|
/* In the expanded vars, replace double quotes (") with single quotes (')
|
||||||
|
* for corect PostgreSQL syntax, and replace semi-colon with space to
|
||||||
|
* prevent SQL injection attacks.
|
||||||
|
*/
|
||||||
values = strdup(cdr);
|
values = strdup(cdr);
|
||||||
for (p = values; *p; ++p) {
|
for (p = values; *p; ++p) {
|
||||||
switch(*p) {
|
switch(*p) {
|
||||||
|
@ -227,31 +230,9 @@ static int save_cdr(const char* const table, const char* const template, const c
|
||||||
vlen = p - values;
|
vlen = p - values;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Patch for changing spaces (; ;) in the template paterns to NULL
|
* Patch for changing empty strings ('') in the expanded variables to
|
||||||
* (eg.) ; ; --PATCH--> null
|
* Postgresql null
|
||||||
* - added new functionality - space removing
|
|
||||||
*/
|
*/
|
||||||
for (p = columns; *p; ++p) {
|
|
||||||
if (*p == ' ') {
|
|
||||||
spaceCounter++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
spaceColumns = (char *) malloc(clen - spaceCounter + 1);
|
|
||||||
pt = spaceColumns;
|
|
||||||
|
|
||||||
for (p = columns; *p; ++p) {
|
|
||||||
if (*p != ' ') {
|
|
||||||
*pt=*p;
|
|
||||||
pt++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*pt = 0;
|
|
||||||
pt = columns;
|
|
||||||
columns = spaceColumns;
|
|
||||||
free(pt);
|
|
||||||
|
|
||||||
for (p = values; *p; ++p) {
|
for (p = values; *p; ++p) {
|
||||||
if (*p == ',') {
|
if (*p == ',') {
|
||||||
if (charCounter == 0) {
|
if (charCounter == 0) {
|
||||||
|
@ -331,8 +312,8 @@ static int save_cdr(const char* const table, const char* const template, const c
|
||||||
|
|
||||||
//----------------------------- END_OF_PATCH -------------------------------
|
//----------------------------- END_OF_PATCH -------------------------------
|
||||||
|
|
||||||
query = malloc(strlen(query_template) - 6 + strlen(table) + clen + vlen + 1);
|
query = switch_mprintf("INSERT INTO %s (%s) VALUES (%s);", table, columns, values);
|
||||||
sprintf(query, query_template, table, columns, values);
|
assert(query);
|
||||||
free(columns);
|
free(columns);
|
||||||
free(values);
|
free(values);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue