Hello,
On 5/19/12 10:39 PM, Timo Teräs wrote:
Search for keywords case insensitively instead of using strstr(). SQlite stores decltype as-is, and does the affinity type testing case insensitively too.
Perhaps you should push it asap, so it gets some testing before 3.3.0 is released.
Thanks, Daniel
modules_k/db_sqlite/dbase.c | 53 +++++++++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 17 deletions(-)
I'm testing currently this patch. Unless something comes up, I will push this shortly.
diff --git a/modules_k/db_sqlite/dbase.c b/modules_k/db_sqlite/dbase.c index 67db13b..f69192a 100644 --- a/modules_k/db_sqlite/dbase.c +++ b/modules_k/db_sqlite/dbase.c @@ -237,28 +237,47 @@ static int db_sqlite_submit_query(const db1_con_t* _h, const str* _s) return 0; }
+#define H3(a,b,c) ((a<<16) + (b<<8) + c) +#define H4(a,b,c,d) ((a<<24) + (b<<16) + (c<<8) + d)
- static int decltype_to_dbtype(const char *decltype) { /* SQlite3 has dynamic typing. It does not store the actual
- exact type, instead it uses 'affinity' depending on the
- value. We have to go through the declaration types to see
* what to return. */
- if (strstr(decltype, "INT") != NULL ||
strncasecmp(decltype, "SERIAL", 6) == 0)
return DB1_INT;
- if (strstr(decltype, "CHAR") != NULL)
return DB1_STRING;
- if (strstr(decltype, "TEXT") != NULL)
return DB1_STR;
- if (strstr(decltype, "REAL") != NULL ||
strstr(decltype, "FLOA") != NULL ||
strstr(decltype, "DOUB") != NULL)
return DB1_DOUBLE;
- if (strstr(decltype, "BLOB") != NULL)
return DB1_BLOB;
- if (strncasecmp(decltype, "TIME", 4) == 0 ||
strncasecmp(decltype, "DATE", 4) == 0)
return DB1_DATETIME;
* what to return. This differs from SQlite affinity type, as
* we want to match with srdb type. */
uint32_t h = 0;
for (; *decltype; decltype++) {
h <<= 8;
h += toupper(*decltype);
switch (h & 0x00ffffff) {
case H3('I','N','T'):
return DB1_INT;
}
switch (h) {
case H4('S','E','R','I'): /* SERIAL */
return DB1_INT;
case H4('C','H','A','R'):
return DB1_STRING;
case H4('T','E','X','T'):
return DB1_STR;
case H4('R','E','A','L'):
case H4('F','L','O','A'):
case H4('D','O','U','B'):
return DB1_DOUBLE;
case H4('B','L','O','B'):
case H4('B','Y','T','E'):
return DB1_BLOB;
case H4('T','I','M','E'):
case H4('D','A','T','E'):
return DB1_DATETIME;
}
}
LM_ERR("sqlite decltype '%s' not recognized, defaulting to int", decltype);