summaryrefslogtreecommitdiff
path: root/src/libtracker-sparql/core/tracker-db-interface-sqlite.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libtracker-sparql/core/tracker-db-interface-sqlite.c')
-rw-r--r--src/libtracker-sparql/core/tracker-db-interface-sqlite.c366
1 files changed, 45 insertions, 321 deletions
diff --git a/src/libtracker-sparql/core/tracker-db-interface-sqlite.c b/src/libtracker-sparql/core/tracker-db-interface-sqlite.c
index 36f4fdcc9..9e372e408 100644
--- a/src/libtracker-sparql/core/tracker-db-interface-sqlite.c
+++ b/src/libtracker-sparql/core/tracker-db-interface-sqlite.c
@@ -35,23 +35,7 @@
#include <libtracker-sparql/tracker-private.h>
#include "tracker-fts.h"
-
-
-#ifdef HAVE_LIBUNISTRING
-/* libunistring versions prior to 9.1.2 need this hack */
-#define _UNUSED_PARAMETER_
-#include <unistr.h>
-#include <unicase.h>
-#elif defined(HAVE_LIBICU)
-#include <unicode/utypes.h>
-#include <unicode/uregex.h>
-#include <unicode/ustring.h>
-#include <unicode/ucol.h>
-#include <unicode/unorm2.h>
-#endif
-
#include "tracker-collation.h"
-
#include "tracker-db-interface-sqlite.h"
#include "tracker-db-manager.h"
#include "tracker-data-enum-types.h"
@@ -971,97 +955,18 @@ function_sparql_replace (sqlite3_context *context,
g_free (unescaped);
}
-#ifdef HAVE_LIBUNISTRING
-
static void
function_sparql_lower_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_tolower (zInput, nInput/2, NULL, NULL, NULL, &written);
-
- sqlite3_result_text16 (context, zOutput, written * 2, free);
-}
-
-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[])
-{
- 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_casefold (zInput, nInput/2, NULL, NULL, NULL, &written);
-
- sqlite3_result_text16 (context, zOutput, written * 2, free);
-}
-
-static void
-function_sparql_normalize (sqlite3_context *context,
- int argc,
- sqlite3_value *argv[])
-{
- const gchar *fn = "tracker:normalize";
- const gchar *nfstr;
- const uint16_t *zInput;
- uint16_t *zOutput;
- size_t written = 0;
+ const gchar *fn = "fn:lower-case";
+ const gunichar2 *zInput;
+ gunichar2 *zOutput;
int nInput;
- uninorm_t nf;
+ gsize nOutput;
- if (argc != 2) {
+ if (argc != 1) {
result_context_function_error (context, fn, "Invalid argument count");
return;
}
@@ -1072,98 +977,10 @@ function_sparql_normalize (sqlite3_context *context,
return;
}
- nfstr = sqlite3_value_text (argv[1]);
- if (g_ascii_strcasecmp (nfstr, "nfc") == 0)
- nf = UNINORM_NFC;
- else if (g_ascii_strcasecmp (nfstr, "nfd") == 0)
- nf = UNINORM_NFD;
- else if (g_ascii_strcasecmp (nfstr, "nfkc") == 0)
- nf = UNINORM_NFKC;
- else if (g_ascii_strcasecmp (nfstr, "nfkd") == 0)
- nf = UNINORM_NFKD;
- else {
- result_context_function_error (context, fn, "Invalid normalization specified, options are 'nfc', 'nfd', 'nfkc' or 'nfkd'");
- return;
- }
-
nInput = sqlite3_value_bytes16 (argv[0]);
- zOutput = u16_normalize (nf, zInput, nInput/2, NULL, &written);
-
- sqlite3_result_text16 (context, zOutput, written * 2, free);
-}
-
-static void
-function_sparql_unaccent (sqlite3_context *context,
- int argc,
- sqlite3_value *argv[])
-{
- const gchar *zInput;
- gchar *zOutput;
- gsize written = 0;
- int nInput;
-
- g_assert (argc == 1);
-
- zInput = sqlite3_value_text (argv[0]);
-
- if (!zInput) {
- return;
- }
-
- nInput = sqlite3_value_bytes (argv[0]);
-
- zOutput = u8_normalize (UNINORM_NFKD, zInput, nInput, NULL, &written);
-
- /* Unaccenting is done in place */
- tracker_parser_unaccent_nfkd_string (zOutput, &written);
-
- sqlite3_result_text (context, zOutput, written, free);
-}
-
-#elif defined(HAVE_LIBICU)
-
-static void
-function_sparql_lower_case (sqlite3_context *context,
- int argc,
- sqlite3_value *argv[])
-{
- const gchar *fn = "fn:lower-case";
- 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_strToLower (zOutput, nOutput/2, zInput, nInput/2, NULL, &status);
-
- if (!U_SUCCESS (status)){
- char zBuf[128];
- sqlite3_snprintf (128, zBuf, "ICU error: u_strToLower(): %s", u_errorName (status));
- zBuf[127] = '\0';
- sqlite3_free (zOutput);
- result_context_function_error (context, fn, zBuf);
- return;
- }
-
- sqlite3_result_text16 (context, zOutput, -1, sqlite3_free);
+ zOutput = tracker_parser_tolower (zInput, nInput, &nOutput);
+ sqlite3_result_text16 (context, zOutput, -1, free);
}
static void
@@ -1172,13 +989,15 @@ function_sparql_upper_case (sqlite3_context *context,
sqlite3_value *argv[])
{
const gchar *fn = "fn:upper-case";
- const UChar *zInput;
- UChar *zOutput;
+ const gunichar2 *zInput;
+ gunichar2 *zOutput;
int nInput;
- int nOutput;
- UErrorCode status = U_ZERO_ERROR;
+ gsize nOutput;
- g_assert (argc == 1);
+ if (argc != 1) {
+ result_context_function_error (context, fn, "Invalid argument count");
+ return;
+ }
zInput = sqlite3_value_text16 (argv[0]);
@@ -1188,25 +1007,8 @@ function_sparql_upper_case (sqlite3_context *context,
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);
- result_context_function_error (context, fn, zBuf);
- return;
- }
-
- sqlite3_result_text16 (context, zOutput, -1, sqlite3_free);
+ zOutput = tracker_parser_toupper (zInput, nInput, &nOutput);
+ sqlite3_result_text16 (context, zOutput, -1, free);
}
static void
@@ -1215,13 +1017,15 @@ function_sparql_case_fold (sqlite3_context *context,
sqlite3_value *argv[])
{
const gchar *fn = "tracker:case-fold";
- const UChar *zInput;
- UChar *zOutput;
+ const gunichar2 *zInput;
+ gunichar2 *zOutput;
int nInput;
- int nOutput;
- UErrorCode status = U_ZERO_ERROR;
+ gsize nOutput;
- g_assert (argc == 1);
+ if (argc != 1) {
+ result_context_function_error (context, fn, "Invalid argument count");
+ return;
+ }
zInput = sqlite3_value_text16 (argv[0]);
@@ -1231,59 +1035,8 @@ function_sparql_case_fold (sqlite3_context *context,
nInput = sqlite3_value_bytes16 (argv[0]);
- nOutput = nInput * 2 + 2;
- zOutput = sqlite3_malloc (nOutput);
-
- if (!zOutput) {
- return;
- }
-
- u_strFoldCase (zOutput, nOutput/2, zInput, nInput/2, U_FOLD_CASE_DEFAULT, &status);
-
- if (!U_SUCCESS (status)){
- char zBuf[128];
- sqlite3_snprintf (128, zBuf, "ICU error: u_strFoldCase: %s", u_errorName (status));
- zBuf[127] = '\0';
- sqlite3_free (zOutput);
- result_context_function_error (context, fn, zBuf);
- return;
- }
-
- sqlite3_result_text16 (context, zOutput, -1, sqlite3_free);
-}
-
-static gunichar2 *
-normalize_string (const gunichar2 *string,
- gsize string_len, /* In gunichar2s */
- const UNormalizer2 *normalizer,
- gsize *len_out, /* In gunichar2s */
- UErrorCode *status)
-{
- int nOutput;
- gunichar2 *zOutput;
-
- nOutput = (string_len * 2) + 1;
- zOutput = g_new0 (gunichar2, nOutput);
-
- nOutput = unorm2_normalize (normalizer, string, string_len, zOutput, nOutput, status);
-
- if (*status == U_BUFFER_OVERFLOW_ERROR) {
- /* Try again after allocating enough space for the normalization */
- *status = U_ZERO_ERROR;
- zOutput = g_renew (gunichar2, zOutput, nOutput);
- memset (zOutput, 0, nOutput * sizeof (gunichar2));
- nOutput = unorm2_normalize (normalizer, string, string_len, zOutput, nOutput, status);
- }
-
- if (!U_SUCCESS (*status)) {
- g_clear_pointer (&zOutput, g_free);
- nOutput = 0;
- }
-
- if (len_out)
- *len_out = nOutput;
-
- return zOutput;
+ zOutput = tracker_parser_casefold (zInput, nInput, &nOutput);
+ sqlite3_result_text16 (context, zOutput, -1, free);
}
static void
@@ -1293,12 +1046,11 @@ function_sparql_normalize (sqlite3_context *context,
{
const gchar *fn = "tracker:normalize";
const gchar *nfstr;
- const uint16_t *zInput;
- uint16_t *zOutput = NULL;
+ const gunichar2 *zInput;
+ gunichar2 *zOutput = NULL;
+ GNormalizeMode mode;
int nInput;
gsize nOutput;
- const UNormalizer2 *normalizer;
- UErrorCode status = U_ZERO_ERROR;
if (argc != 2) {
result_context_function_error (context, fn, "Invalid argument count");
@@ -1311,35 +1063,24 @@ function_sparql_normalize (sqlite3_context *context,
return;
}
+ nInput = sqlite3_value_bytes16 (argv[0]);
+
nfstr = (gchar *)sqlite3_value_text (argv[1]);
if (g_ascii_strcasecmp (nfstr, "nfc") == 0)
- normalizer = unorm2_getNFCInstance (&status);
+ mode = G_NORMALIZE_NFC;
else if (g_ascii_strcasecmp (nfstr, "nfd") == 0)
- normalizer = unorm2_getNFDInstance (&status);
+ mode = G_NORMALIZE_NFD;
else if (g_ascii_strcasecmp (nfstr, "nfkc") == 0)
- normalizer = unorm2_getNFKCInstance (&status);
+ mode = G_NORMALIZE_NFKC;
else if (g_ascii_strcasecmp (nfstr, "nfkd") == 0)
- normalizer = unorm2_getNFKDInstance (&status);
+ mode = G_NORMALIZE_NFKD;
else {
result_context_function_error (context, fn, "Invalid normalization specified");
return;
}
- if (U_SUCCESS (status)) {
- nInput = sqlite3_value_bytes16 (argv[0]);
- zOutput = normalize_string (zInput, nInput / 2, normalizer, &nOutput, &status);
- }
-
- if (!U_SUCCESS (status)) {
- char zBuf[128];
- sqlite3_snprintf (128, zBuf, "ICU error: unorm_normalize: %s", u_errorName (status));
- zBuf[127] = '\0';
- g_free (zOutput);
- result_context_function_error (context, fn, zBuf);
- return;
- }
-
- sqlite3_result_text16 (context, zOutput, nOutput * sizeof (gunichar2), g_free);
+ zOutput = tracker_parser_normalize (zInput, mode, nInput, &nOutput);
+ sqlite3_result_text16 (context, zOutput, nOutput * sizeof (gunichar2), free);
}
static void
@@ -1348,45 +1089,28 @@ function_sparql_unaccent (sqlite3_context *context,
sqlite3_value *argv[])
{
const gchar *fn = "tracker:unaccent";
- const uint16_t *zInput;
- uint16_t *zOutput = NULL;
+ const gunichar2 *zInput;
+ gunichar2 *zOutput = NULL;
int nInput;
gsize nOutput;
- const UNormalizer2 *normalizer;
- UErrorCode status = U_ZERO_ERROR;
-
- g_assert (argc == 1);
- zInput = sqlite3_value_text16 (argv[0]);
-
- if (!zInput) {
+ if (argc != 1) {
+ result_context_function_error (context, fn, "Invalid argument count");
return;
}
- normalizer = unorm2_getNFKDInstance (&status);
-
- if (U_SUCCESS (status)) {
- nInput = sqlite3_value_bytes16 (argv[0]);
- zOutput = normalize_string (zInput, nInput / 2, normalizer, &nOutput, &status);
- }
+ zInput = sqlite3_value_text16 (argv[0]);
- if (!U_SUCCESS (status)) {
- char zBuf[128];
- sqlite3_snprintf (128, zBuf, "ICU error: unorm_normalize: %s", u_errorName (status));
- zBuf[127] = '\0';
- g_free (zOutput);
- result_context_function_error (context, fn, zBuf);
+ if (!zInput) {
return;
}
- /* Unaccenting is done in place */
- tracker_parser_unaccent_nfkd_string (zOutput, &nOutput);
+ nInput = sqlite3_value_bytes16 (argv[0]);
- sqlite3_result_text16 (context, zOutput, nOutput * sizeof (gunichar2), g_free);
+ zOutput = tracker_parser_unaccent (zInput, nInput, &nOutput);
+ sqlite3_result_text16 (context, zOutput, nOutput * sizeof (gunichar2), free);
}
-#endif
-
static void
function_sparql_strip_punctuation (sqlite3_context *context,
int argc,