diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2016-05-31 01:15:21 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2016-05-31 01:18:09 +0200 |
commit | 902446d92aec0e53c1dd9c6c90dc1a9a470c3af8 (patch) | |
tree | 36c92f3e3ead3c6465081c49a991ef0b47eeb228 | |
parent | 15aa74452cd4cde9a1d4b16cc57dddf7407ff833 (diff) | |
download | tracker-902446d92aec0e53c1dd9c6c90dc1a9a470c3af8.tar.gz |
libtracker-data: Implement fn:upper-case/UCASE
UCASE() was implemented over a nonexisting function, fix that. Impls
for both libunistring and libicu have been added.
-rw-r--r-- | src/libtracker-data/tracker-db-interface-sqlite.c | 71 | ||||
-rw-r--r-- | src/libtracker-data/tracker-sparql-expression.vala | 5 |
2 files changed, 76 insertions, 0 deletions
diff --git a/src/libtracker-data/tracker-db-interface-sqlite.c b/src/libtracker-data/tracker-db-interface-sqlite.c index 0b0bb9921..6fdc3bbce 100644 --- a/src/libtracker-data/tracker-db-interface-sqlite.c +++ b/src/libtracker-data/tracker-db-interface-sqlite.c @@ -779,6 +779,31 @@ function_sparql_lower_case (sqlite3_context *context, } static void +function_sparql_upper_case (sqlite3_context *context, + int argc, + sqlite3_value *argv[]) +{ + const uint16_t *zInput; + uint16_t *zOutput; + size_t written = 0; + int nInput; + + g_assert (argc == 1); + + zInput = sqlite3_value_text16 (argv[0]); + + if (!zInput) { + return; + } + + nInput = sqlite3_value_bytes16 (argv[0]); + + zOutput = u16_toupper (zInput, nInput / 2, NULL, NULL, NULL, &written); + + sqlite3_result_text16 (context, zOutput, written * 2, free); +} + +static void function_sparql_case_fold (sqlite3_context *context, int argc, sqlite3_value *argv[]) @@ -920,6 +945,48 @@ function_sparql_lower_case (sqlite3_context *context, } static void +function_sparql_upper_case (sqlite3_context *context, + int argc, + sqlite3_value *argv[]) +{ + const UChar *zInput; + UChar *zOutput; + int nInput; + int nOutput; + UErrorCode status = U_ZERO_ERROR; + + g_assert (argc == 1); + + zInput = sqlite3_value_text16 (argv[0]); + + if (!zInput) { + return; + } + + nInput = sqlite3_value_bytes16 (argv[0]); + + nOutput = nInput * 2 + 2; + zOutput = sqlite3_malloc (nOutput); + + if (!zOutput) { + return; + } + + u_strToUpper (zOutput, nOutput / 2, zInput, nInput / 2, NULL, &status); + + if (!U_SUCCESS (status)){ + char zBuf[128]; + sqlite3_snprintf (128, zBuf, "ICU error: u_strToUpper(): %s", u_errorName (status)); + zBuf[127] = '\0'; + sqlite3_free (zOutput); + sqlite3_result_error (context, zBuf, -1); + return; + } + + sqlite3_result_text16 (context, zOutput, -1, sqlite3_free); +} + +static void function_sparql_case_fold (sqlite3_context *context, int argc, sqlite3_value *argv[]) @@ -1362,6 +1429,10 @@ open_database (TrackerDBInterface *db_interface, SQLITE_ANY | SQLITE_DETERMINISTIC, db_interface, &function_sparql_lower_case, NULL, NULL); + sqlite3_create_function (db_interface->db, "SparqlUpperCase", 1, + SQLITE_ANY | SQLITE_DETERMINISTIC, + db_interface, &function_sparql_upper_case, + NULL, NULL); sqlite3_create_function (db_interface->db, "SparqlCaseFold", 1, SQLITE_ANY | SQLITE_DETERMINISTIC, diff --git a/src/libtracker-data/tracker-sparql-expression.vala b/src/libtracker-data/tracker-sparql-expression.vala index aca536d9d..96270cfc5 100644 --- a/src/libtracker-data/tracker-sparql-expression.vala +++ b/src/libtracker-data/tracker-sparql-expression.vala @@ -532,6 +532,11 @@ class Tracker.Sparql.Expression : Object { translate_expression_as_string (sql); sql.append (")"); return PropertyType.STRING; + } else if (uri == FN_NS + "upper-case") { + sql.append ("SparqlUpperCase ("); + translate_expression_as_string (sql); + sql.append (")"); + return PropertyType.STRING; } else if (uri == TRACKER_NS + "normalize") { // conversion to string sql.append ("SparqlNormalize ("); |