summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2016-05-31 01:15:21 +0200
committerCarlos Garnacho <carlosg@gnome.org>2016-05-31 01:18:09 +0200
commit902446d92aec0e53c1dd9c6c90dc1a9a470c3af8 (patch)
tree36c92f3e3ead3c6465081c49a991ef0b47eeb228
parent15aa74452cd4cde9a1d4b16cc57dddf7407ff833 (diff)
downloadtracker-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.c71
-rw-r--r--src/libtracker-data/tracker-sparql-expression.vala5
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 (");