On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение



Пост N: 100
Зарегистрирован: 05.06.07
ссылка на сообщение  Отправлено: 08.04.09 02:57. Заголовок: Еще раз о Sqlite3


Задумал я написать полноценное десктопное приложение на базе SQLite3.
Оказалось не все так просто как виделось изначально.
А конкретно - не смог добиться безрегистрового (NOCASE) поиска/сравнения русских строковых полей.
Например в LIKE
"select...where FName LIKE '%"+mFnam+"%' ordered by ..."
Поиск срабатывает но регистрозависимый. Если задано "Б" - найдет все строки с "Б", но не найдет с "б". И наоборот.
Всякие хитрости и тонкости типа COLLATE NOCASE
"select...where FName LIKE '%"+mFnam+"%' COLLATE NOCASE ordered by ..."
или upper()
"select...where upper(FName) LIKE '%"+upper(mFnam)+"%' ordered by ..."
только ухудшают результат.

Вычитал в документации что есть возможность создавать пользовательские функции (например - свою upper() или MyUpper())
и пользовательские колэйшины. Для этого используются функции API sqlite3_create_function(...) и ..._create_collation(...).

Однако проверить этот вариант не удалось, т.к. в имеющейся библиотеке sqlite3.lib (судя по тексту sqlite3.c в исходниках) доступ
к этим функциям не реализован.

В связи с вышеизложенным вопросы.
1. решил ли кто из присутствующих описанную проблему?
2. не могли бы монстры Сишного программирования подсказать конкретно как реализовать вызов (и использование) вышеупомянутых функций?




Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 10 [только новые]


постоянный участник


Пост N: 627
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 08.04.09 12:34. Заголовок: Пока монстры молчат..


Ясно, что вы ходите использовать движок SqLite3 для хранения данных, неясно только как.
Вы приверженец "чистого Харбора" или plain C?

Все что написано дальше подразумевает первый вариант.

Какую библиотеку-обертку используете? Ту, что поставляется с MiniGUI? Но там по известной причине нет sqlite3.c в поставке ( по крайнем мере для версии 1.64 ). Или что-то другое (приложив усилия вы можете найти не менее 4 библиотек для Harbour, а еще использовать ADO или ODBC)?
Я вам рекомендую hbsqlit3.lib из harbour\contrib (не путать с hbsqlite3.lib из МiniGUI), и совсем не потому, что я ее использую. Просто это наиболее полная реализация библиотеки функций-оберток для Harbour, находится в актуальном состоянии и вы можете использовать ее с последней версией sqlite3 3.6.12.
К тому же не представляю полноценного приложение без использования callback функций.

SADSTAR2 пишет:

 цитата:
решил ли кто из присутствующих описанную проблему?


Эта проблема решается именно так, как вы описали с использованием пользовательских функций и sqlite3_create_function, которая пока не реализована в публичной версии. Реализация каких-то титанических усилий не требует. Просто это немного небезопасно и работать с такими функциями нужно аккуратно.


Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 978
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 08.04.09 12:52. Заголовок: Петр пишет: Я вам р..


Петр пишет:

 цитата:
Я вам рекомендую hbsqlit3.lib из harbour\contrib (не путать с hbsqlite3.lib из МiniGUI), и совсем не потому, что я ее использую. Просто это наиболее полная реализация библиотеки функций-оберток для Harbour, находится в актуальном состоянии и вы можете использовать ее с последней версией sqlite3 3.6.12.


Небольшой анонс: именно эта библиотека (со всеми примерами использования из harbour\contrib\hbsqlit3\tests) будет включена в состав следующей сборки расширенного релиза библиотеки МиниГуи.
Петр, большое спасибо за Ваш вклад!

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 629
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 08.04.09 17:42. Заголовок: Спасибо, Григорий. ..


Спасибо, Григорий.

Если кому-то будет интересно, через выходным я могу здесь опубликовать реализацию sqlite3_create_function, некоторые рекомендации по сборке sqlite3.lib и безопасном использовании callback функций hbsqlit3.lib

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 101
Зарегистрирован: 05.06.07
ссылка на сообщение  Отправлено: 09.04.09 00:08. Заголовок: Петр пишет: Какую ..



Петр пишет:

 цитата:
Какую библиотеку-обертку используете? Ту, что поставляется с MiniGUI? Но там по известной причине нет sqlite3.c в поставке ( по крайнем мере для версии 1.64 ).


Я смотрел здесь
C:\MiniGUI63\SOURCE\HbSQLite3\hb_sqlite3.c

Петр пишет:

 цитата:
Если кому-то будет интересно, через выходным я могу здесь опубликовать реализацию sqlite3_create_function, некоторые рекомендации по сборке sqlite3.lib и безопасном использовании callback функций hbsqlit3.lib



Не только интересно но и необходимо. По крайней мере мне.



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 982
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 30.10.10 21:40. Заголовок: Не прошло и 3 года....


Не прошло и 3 года..

С учетом моего сегодняшнего опыта использования SQLite3, я бы рекомендовал использовать библиотеку ICU - International Components for Unicode.

Далее я опишу как собрать sqlite3i.dll с поддержкой ICU.
Исходные данные Windows XP SP3, mingw 4.5.1, sqlite 3.7.3, ICU 4.4.2

SQLite берем с страницы закачки http://sqlite.org/download.html<\/u><\/a>
Нам нужен sqlite-amalgamation-3_7_3.zip

Страница для скачки ICU
http://icu-project.org/download/4.4.html#ICU4C<\/u><\/a>
Прямая ссылка<\/u><\/a>

И еще нужна утилита pexports.exe.
Взять можно здесь<\/u><\/a> или поискать более свежую версию на SF

Распаковываем бинарники ICU. Допустим на диск C:

Распаковываем sqlite3, например в папку C:\sqlite373
Собственно нам нужны только sqlite3.c, sqlite3.h, sqlite3ext.h, остальное можно удалить.
Туда же помещаем pexports.exe

В этой же папке создаем make_dll.bat сл. содержания
Скрытый текст

Не забываем указать правильный путь доступа к mingw и ICU, и запускаем его на выполнение с параметром /b

Если вы просто скопировали вышеуказанный текст через буфер обмена - не забудьте удалить концевые пробелы, если ваш редактор добавляет их.
В случае если вы все сделали правильно, в папке появятся sqlite3i.dll и библиотека импорта libsqlite3i.a.

Далее любым приемлемым для вас методом перекомпилируете библиотеку hbsqlit3 (последнюю версию -из Harbour SVN или Harbour MiniGUI 1.8 Extended Edition (Build 89), объявив предварительно SQLITE_ENABLE_COLUMN_METADATA.
Проще всего это сделать добавив в начало файла hbsqlit3.c
#define SQLITE_ENABLE_COLUMN_METADATA 1
Или передавая соответствующий параметр утилите hbmk2 или C компилятору.

Ну и тестовая программка
#include "common.ch" 
#include "hbsqlit3.ch"

#define _DB_FLAGS_ (SQLITE_OPEN_CREATE + SQLITE_OPEN_READWRITE + SQLITE_OPEN_EXCLUSIVE)

/**
*/
FUNCTION main()
LOCAL cSQLTEXT, pDb
//
QOut( "SQLite ver.", sqlite3_libversion() )
QOut( "~~~~~~~~~~~~~~~~~~~" )
//
IF ! sqlite3_compileoption_used( "SQLITE_ENABLE_ICU" )
QOut( "Oops.. ICU is not enabled, isn't it?" )

RETURN 1
ENDIF
//
pDb := sqlite3_open_v2( ":memory:", _DB_FLAGS_ )

IF Empty( pDb )
QOut( "Can't open database : ':memory:'" )

RETURN 1
ENDIF

// load and show avaible collation list
QOut( (cSQLTEXT := "SELECT icu_load_collation('uk_UA', 'ukrainian')") )
sqlite3_exec(pDb, cSQLTEXT)

QOut( (cSQLTEXT := "SELECT icu_load_collation('ru_RU', 'russian')") )
sqlite3_exec(pDb, cSQLTEXT)

QOut( (cSQLTEXT := "SELECT icu_load_collation('pl_PL', 'polish')") )
sqlite3_exec(pDb, cSQLTEXT)

QOut( "~~~~~~~~~~~~~~~~~~~" )

cSQLTEXT := "PRAGMA collation_list"
QOut( cSQLTEXT )
sqlite3_exec( pDb, cSQLTEXT, @ShowCollationList() )

sqlite3_sleep( 3000 )

pDb := NIL

RETURN 0

/**
*/
FUNCTION ShowCollationList( nColCount, aValue, aColName )
LOCAL cStr := hb_StrFormat( "%1$s || %2$s", aValue[1], aValue[2])

HB_SYMBOL_UNUSED( nColCount )
HB_SYMBOL_UNUSED( aColName )

QOut( cStr )
//
RETURN 0

Не забудьте при построении программы подключать библиотеки hbsqlit3 и sqlite3i. А также сделать доступными для ваших приложений динамические библиотеки sqlite3i.dll, icuuc44.dll, icuin44.dll, icudt44.dll
Общим весом около 18 Mb, из них icudt44.dll - около 14 Mb. Но для теперешних времен - это не проблема. Во первых - это все хорошо "ужимается" всем известной утилитой UPX, где-то до 5-6 Mb в зависимости от использованных опций; во вторых - когда нибудь вы сможете научиться собирать icudt44.dll только с нужными вам Charset и прочими прибамбасами ( см. )<\/u><\/a>
UPX рекомендую брать 3.07w и выше, он уже с mingw 4.5 научился корректно работать и даже (!) harbour-xx.dll корректно упаковывает.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 983
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 30.10.10 22:03. Заголовок: Ну и еще один пример..


Ну и еще один пример. Обратите внимание текстовые данные должны хранится в базе SQLite в формате UTF-8. Для этого мы используем связку hb_strToUTF8/hb_UTF8ToStr. Конечно это увеличивает время доступа к данным, но, надеюсь когда-нибудь Harbour получит нативную поддержку Unicode.
Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 984
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 30.10.10 22:31. Заголовок: Ну и последний штрих..


Ну и последний штрих. Почему MinGW?
Потому, что я его использую. Можно сказать, что он мне нравится
А с другой стороны - это самый "сложный" случай. Если вы используете MS VC то какие могут быть проблемы - библиотеки импорта все в поставке ICU - бери и используй. По идее и MinGW 4.5 может использовать библиотеки от VC, а вот на практике..
А для BCC есть утилита implib и никаких особых трудностей я не вижу.. OW с ICU работать пока не может, а PellesC, DM и прочие я не рассматривал вообще (и не хочу ).

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 988
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 01.11.10 01:18. Заголовок: Сбросил в Harbour SV..


Сбросил в Harbour SVN сл. изменения

 цитата:
Revision: 15721
http://harbour-project.svn.sourceforge.net/harbour-project/?rev=15721&view=rev<\/u><\/a>
Author: petr_ch
Date: 2010-10-31 22:06:54 +0000 (Sun, 31 Oct 2010)

Log Message:
-----------
2010-11-01 00:05 UTC+0200 Petr Chornyj (myorg63 at mail.ru)
* harbour/contrib/hbsqlit3/hbsqlit3.c
* Changed syntax of sqlite3_exec() to
sqlite3_exec( db, cSQLTEXT, [pCallbackFunc]|[cCallbackFunc],
[lConvertSQLTextToUTF8], "cCDP" ) -> nResultCode
From now we can replace
cSQLTEXT := hb_strToUTF8( cSQLTEXT, "RU1251" )
sqlite3_exec( db, cSQLTEXT )
with
sqlite3_exec( db, cSQLTEXT, , .t., "RU1251" )
* Changed syntax of sqlite3_bind_text(), sqlite3_column_text()
in such way
* Changed sqlite3_bind_blob() according to sqlite3 docs.

Modified Paths:
--------------
trunk/harbour/ChangeLog
trunk/harbour/contrib/hbsqlit3/hbsqlit3.c



Теперь пример из поста №983 можно переписать вот так
Скрытый текст




Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 989
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 02.11.10 21:09. Заголовок: Петр пишет: Сбросил..


Петр пишет:

 цитата:
Сбросил в Harbour SVN сл. изменения



 цитата:
2010-11-01 13:53 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* contrib/hbsqlit3/hbsqlit3.c
- Reverted UTF8 patch in 2010-11-01 00:05 UTC+0200.
+ Replaced above solution with transparent one, using
Str API usage and extended it for all places where UTF8
strings are expected or returned by sqlite3 API.
Please test. This clears an old TOFIX.



 цитата:
2010-11-02 18:55 UTC+0200 Petr Chornyj (myorg63 at mail.ru)
* harbour/contrib/hbsqlit3/hbsqlit3.c
* Changed to use STR API for UTF8 conversions in few places.
Lightly tested - seems now it's works as expected.
+ Added sqlite_sourceid()


Объясняю суть изменений. Теперь все данные (текстовые естественно) автоматически транслируются библиотекой hbsqlit3 в UTF8 при сохранении в БД и соответственно в ANSI при чтении из базы. Никаких дополнительных ухищрений делать не нужно.
Честно мне не очень нравится обязательность такой процедуры. Здесь и вопросы по сопровождению уже существующих баз могут возникнуть, и отрезали поддержку старых версий Harbour (до 12/2009), как раньше поддержку xHarbour, и китайцев фактически обидели.
Но в таком подходе и достоинств достаточно много. Да и с Viktor- ом препираться не хочется


Спасибо: 1 
ПрофильЦитата Ответить



Пост N: 21
Зарегистрирован: 27.07.10
ссылка на сообщение  Отправлено: 27.05.16 10:50. Заголовок: Вариант решения из с..


Вариант решения из статьи SQLite и UNICODE.
Оформлено в виде библиотеки HbSQLite3u для MinGW и MSVC10 с тестовым примером. Библиотека включает sqlite3_unicode.c и функции инициализации/выгрузки.

Подключение выполняется функцией SQLite3_Unicode_Load() перед открытием базы SQLite3_Open(), после чего для кирилицы в SQLite заработают lower(), upper() и регистронезависимый LIKE.

Из замеченного, в запросе LIKE буквы со сходным начертанием считаются одинаковыми (Ё(ё) = Е(е), Ї(ї) = І(і), Ґ(ґ) = Г(г)). Т.е., LIKE "%ё%" выдаст слова и с "Ё", и с "Е" (LIKE "Петр" - покажет "Петр" и "Пётр").

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 50
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет