cel/cel_odbc: Provide microsecond precision in 'eventtime' column when possible

This patch adds microsecond precision when inserting a CEL record into a table
with an "eventtime" column of type timestamp, instead of second precision. The
documentation (configs/cel_odbc.conf.sample) was already saying that the
eventtime column included microseconds precision, but that was not the case.

Also, without this patch, if you had a table with an "eventtime" column of
type varchar, you had millisecond precision. With this patch, you also get
microsecond precision in this case.

Review: https://reviewboard.asterisk.org/r/3980

ASTERISK-24283 #close
Reported by: Etienne Lessard
patches:
  cel_odbc_time_precision.patch uploaded by Etienne Lessard (License 6394)
........

Merged revisions 427952 from http://svn.asterisk.org/svn/asterisk/branches/11
........

Merged revisions 427953 from http://svn.asterisk.org/svn/asterisk/branches/12
........

Merged revisions 427954 from http://svn.asterisk.org/svn/asterisk/branches/13


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@428010 65c4cc65-6c06-0410-ace0-fbb531ad65f3
changes/42/42/1
Matthew Jordan 11 years ago
parent ece61f5ed1
commit 6993743b1f

@ -436,7 +436,7 @@ static void odbc_log(struct ast_event *event)
This should be ok, however, as nobody is going to store just event This should be ok, however, as nobody is going to store just event
date or just time for CDR purposes. date or just time for CDR purposes.
*/ */
ast_strftime(colbuf, sizeof(colbuf), "%Y-%m-%d %H:%M:%S.%q", &tm); ast_strftime(colbuf, sizeof(colbuf), "%Y-%m-%d %H:%M:%S.%6q", &tm);
colptr = colbuf; colptr = colbuf;
} else { } else {
if (strcmp(entry->celname, "userdeftype") == 0) { if (strcmp(entry->celname, "userdeftype") == 0) {
@ -615,7 +615,7 @@ static void odbc_log(struct ast_event *event)
if (ast_strlen_zero(colptr)) { if (ast_strlen_zero(colptr)) {
continue; continue;
} else { } else {
int year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0; int year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0, fraction = 0;
if (strcasecmp(entry->name, "eventdate") == 0) { if (strcasecmp(entry->name, "eventdate") == 0) {
struct ast_tm tm; struct ast_tm tm;
ast_localtime(&record.event_time, &tm, tableptr->usegmtime ? "UTC" : NULL); ast_localtime(&record.event_time, &tm, tableptr->usegmtime ? "UTC" : NULL);
@ -625,17 +625,18 @@ static void odbc_log(struct ast_event *event)
hour = tm.tm_hour; hour = tm.tm_hour;
minute = tm.tm_min; minute = tm.tm_min;
second = (tableptr->allowleapsec || tm.tm_sec < 60) ? tm.tm_sec : 59; second = (tableptr->allowleapsec || tm.tm_sec < 60) ? tm.tm_sec : 59;
fraction = tm.tm_usec;
} else { } else {
int count = sscanf(colptr, "%4d-%2d-%2d %2d:%2d:%2d", &year, &month, &day, &hour, &minute, &second); int count = sscanf(colptr, "%4d-%2d-%2d %2d:%2d:%2d.%6d", &year, &month, &day, &hour, &minute, &second, &fraction);
if ((count != 3 && count != 5 && count != 6) || year <= 0 || if ((count != 3 && count != 5 && count != 6 && count != 7) || year <= 0 ||
month <= 0 || month > 12 || day < 0 || day > 31 || month <= 0 || month > 12 || day < 0 || day > 31 ||
((month == 4 || month == 6 || month == 9 || month == 11) && day == 31) || ((month == 4 || month == 6 || month == 9 || month == 11) && day == 31) ||
(month == 2 && year % 400 == 0 && day > 29) || (month == 2 && year % 400 == 0 && day > 29) ||
(month == 2 && year % 100 == 0 && day > 28) || (month == 2 && year % 100 == 0 && day > 28) ||
(month == 2 && year % 4 == 0 && day > 29) || (month == 2 && year % 4 == 0 && day > 29) ||
(month == 2 && year % 4 != 0 && day > 28) || (month == 2 && year % 4 != 0 && day > 28) ||
hour > 23 || minute > 59 || second > (tableptr->allowleapsec ? 60 : 59) || hour < 0 || minute < 0 || second < 0) { hour > 23 || minute > 59 || second > (tableptr->allowleapsec ? 60 : 59) || hour < 0 || minute < 0 || second < 0 || fraction < 0) {
ast_log(LOG_WARNING, "CEL variable %s is not a valid timestamp ('%s').\n", entry->name, colptr); ast_log(LOG_WARNING, "CEL variable %s is not a valid timestamp ('%s').\n", entry->name, colptr);
continue; continue;
} }
@ -647,7 +648,7 @@ static void odbc_log(struct ast_event *event)
ast_str_append(&sql, 0, "%s%s", first ? "" : ",", entry->name); ast_str_append(&sql, 0, "%s%s", first ? "" : ",", entry->name);
LENGTHEN_BUF2(27); LENGTHEN_BUF2(27);
ast_str_append(&sql2, 0, "%s{ts '%04d-%02d-%02d %02d:%02d:%02d'}", first ? "" : ",", year, month, day, hour, minute, second); ast_str_append(&sql2, 0, "%s{ts '%04d-%02d-%02d %02d:%02d:%02d.%d'}", first ? "" : ",", year, month, day, hour, minute, second, fraction);
} }
break; break;
case SQL_INTEGER: case SQL_INTEGER:

Loading…
Cancel
Save