diff --git a/setup/extensions.json b/setup/extensions.json index ce9127accd..dd16442ec0 100644 --- a/setup/extensions.json +++ b/setup/extensions.json @@ -73,6 +73,7 @@ }, { "name": "sqlite_extension", + "headers": "calibre/utils/cpp_binding.h", "sources": "calibre/db/sqlite_extension.cpp", "needs_c++11": true, "libraries": "icudata icui18n icuuc icuio", diff --git a/src/calibre/constants.py b/src/calibre/constants.py index b0b9002de2..5e347254a5 100644 --- a/src/calibre/constants.py +++ b/src/calibre/constants.py @@ -250,6 +250,7 @@ class ExtensionsImporter: 'matcher', 'tokenizer', 'certgen', + 'sqlite_extension', ) if iswindows: extra = ('winutil', 'wpd', 'winfonts', 'winsapi') diff --git a/src/calibre/db/sqlite_extension.cpp b/src/calibre/db/sqlite_extension.cpp index 1f8b7c3963..dd7a70e301 100644 --- a/src/calibre/db/sqlite_extension.cpp +++ b/src/calibre/db/sqlite_extension.cpp @@ -16,6 +16,8 @@ #include #include #include +#include +#include "../utils/cpp_binding.h" SQLITE_EXTENSION_INIT1 typedef int (*token_callback_func)(void *, int, const char *, int, int, int); @@ -250,8 +252,31 @@ calibre_sqlite_extension_init(sqlite3 *db, char **pzErrMsg, const sqlite3_api_ro } } +static PyObject* +get_locales_for_break_iteration(PyObject *self, PyObject *args) { + std::unique_ptr locs(icu::BreakIterator::getAvailableLocales()); + icu::ErrorCode status; + pyobject_raii ans(PyList_New(0)); + if (ans) { + const icu::UnicodeString *item; + while ((item = locs->snext(status))) { + std::string name; + item->toUTF8String(name); + pyobject_raii pn(PyUnicode_FromString(name.c_str())); + if (pn) PyList_Append(ans.ptr(), pn.ptr()); + } + if (status.isFailure()) { + PyErr_Format(PyExc_RuntimeError, "Failed to iterate over locales with error: %s", status.errorName()); + return NULL; + } + } + return ans.detach(); +} static PyMethodDef methods[] = { + {"get_locales_for_break_iteration", get_locales_for_break_iteration, METH_NOARGS, + "Get list of available locales for break iteration" + }, {NULL, NULL, 0, NULL} };