[tracker] libtracker-data: Implement fn:upper-case/UCASE



commit 902446d92aec0e53c1dd9c6c90dc1a9a470c3af8
Author: Carlos Garnacho <carlosg gnome org>
Date:   Tue May 31 01:15:21 2016 +0200

    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.

 src/libtracker-data/tracker-db-interface-sqlite.c  |   71 ++++++++++++++++++++
 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 0b0bb99..6fdc3bb 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 aca536d..96270cf 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 (");


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]