Let LC_COLLATE influence string-comparison operations

By default this will be set to the C locale, but set it to the user's
locale when string comparisons are performed from mdb-sql. Note that
this can be overridden with the LC_COLLATE environment variable.

We could infer the collation locale from the file itself, but this will
likely require a big ball of glue between the Windows locales and Unix
ones.
This commit is contained in:
Evan Miller 2021-01-19 21:24:31 -05:00
parent f99c5539e7
commit 615b625d79
4 changed files with 5 additions and 4 deletions

View File

@ -64,6 +64,7 @@ NOTES
The -i command can be passed the string 'stdin' to test entering text as if using a pipe.
ENVIRONMENT
LC_COLLATE Defines the locale for string-comparison operations. See locale(1).
MDB_JET3_CHARSET Defines the charset of the input JET3 (access 97) file. Default is CP1252. See iconv(1).
MDBICONV Defines the output charset. Default is UTF-8. mdbtools must have been compiled with iconv.
MDBOPTS Colon-separated list of options:

View File

@ -46,7 +46,7 @@ int rc;
if (node->op == MDB_LIKE) {
return mdb_like_cmp(s,node->value.s);
}
rc = strncmp(node->value.s, s, 255);
rc = strcoll(node->value.s, s);
switch (node->op) {
case MDB_EQUAL:
if (rc==0) return 1;

View File

@ -426,7 +426,7 @@ mdb_sql_eval_expr(MdbSQL *sql, char *const1, int op, char *const2)
MdbSargNode *node;
if (const1[0]=='\'' && const2[0]=='\'') {
value = strcmp(const1, const2);
value = strcoll(const1, const2);
switch (op) {
case MDB_EQUAL: compar = (value ? 0 : 1); break;
case MDB_GT: compar = (value > 0); break;
@ -984,4 +984,4 @@ mdb_sql_dump_results(MdbSQL *sql)
/* the column and table names are no good now */
mdb_sql_reset(sql);
}
/** @}*/
/** @}*/

View File

@ -401,7 +401,7 @@ main(int argc, char **argv)
}
}
setlocale(LC_COLLATE, "");
/* initialize the SQL engine */
sql = mdb_sql_init();
if (argc == 2) {