Класс-обёртка для SQLite

Планы, идеология, архитектура и т.п.

Модератор: Модераторы

Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

можно узнать плюсы данного компонента перед стандартным? По текстам в теме не понял различия. Какую версию sqlite3.dll данный компонент поддерживает?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Odyssey писал(а):SQLiteTable3.pas, строка 120, используется тип TDate. В текущем релизе FPC 2.4.0 этот тип не определён в модуле System.

Odyssey писал(а):Там же, строка 173. UTF8String -- это тот же string

Граждане! Не смешивайте в одну кучу FPC и Lazarus!
String, типа UTF8 - это в Lazarus, а не в FPC. FPC то, пока ещё, не "юникодный" и не "утьфувосьмезированный". Вы убеждены, что если компиляция будет не в среде Lazarus, то с вашими строками ничего не случится без такого преобразования?
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

FPC то, пока ещё, не "юникодный" и не "утьфувосьмезированный".

Ща-а-с :)
Текстовый редактор с сохранением в UTF8 + компиляция таких исходников с опцией "-Fcutf8".
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

Vadim писал(а):
Odyssey писал(а):Там же, строка 173. UTF8String -- это тот же string

Граждане! Не смешивайте в одну кучу FPC и Lazarus!
String, типа UTF8 - это в Lazarus, а не в FPC. FPC то, пока ещё, не "юникодный" и не "утьфувосьмезированный". Вы убеждены, что если компиляция будет не в среде Lazarus, то с вашими строками ничего не случится без такого преобразования?

Убеждён. В библиотеке есть такой код:

Код: Выделить всё

constructor TSQLiteDatabase.Create(const FileName: string);
...
utf8FileName := UTF8String(FileName);

Если заглянуть в <fpc>/source/rtl/inc/systemh.inc, то увидим:

Код: Выделить всё

UTF8String          = type ansistring;

В режиме {$H+} (который в данном случае включен) String = Ansistring, следовательно String = UTF8String, следовательно данное приведение типов не делает ровным счётом ничего, вне зависимости от того, откуда происходит компиляция (через IDE или чистым FPC). При этом код выглядит так, как будто автор хотел преобразовать входной String в кодировку utf-8. Поскольку реально этого не происходит, я и посоветовал убрать приведение, чтобы не вводить в заблуждение тех, кто не читает systemh.inc.

Более того, на данный момент приведение Utf8String(SomeStr) физически не может сделать никакого преобразования, поскольку не знает исходную кодировку SomeStr. Вот когда/если FPC будет "юникодный", и в строках будет храниться информация о кодировке, тогда эта конструкция, может быть, сработает, но не сейчас. Поэтому при работе с библиотекой в любом случае нужно самому позаботиться о том, чтобы FileName, передаваемый в конструктор, был в кодировке utf-8. Потому что именно эту кодировку ожидает SQLite.

Добавлено спустя 19 минут 18 секунд:
Padre_Mortius писал(а):можно узнать плюсы данного компонента перед стандартным? По текстам в теме не понял различия. Какую версию sqlite3.dll данный компонент поддерживает?

Если имеются в виду отличия от SQLite(3)DataSet, то навскидку можно назвать:
* другой API, при отсутствии опыта работы с Dataset'ами он может оказаться проще;
* возможность работы с blob'ами (насколько я знаю, в Dataset'ах её нет); вот тут я ошибся, значит этот пункт вычёркиваем.
* это не компонент, а набор из двух классов -- "база данных" и "таблица".
Поддерживает версии SQLite начиная с 3.x точно, возможно работает для версий 2.x, только нужно помнить об изменении кодировки строк передаваемых через API.
Последний раз редактировалось Odyssey 27.07.2010 11:34:58, всего редактировалось 1 раз.
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

Vadim
Ваше замечание справедливо для fpc 2.4.0. В SVN уже давно добавлен тип UTF8String
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

Padre_Mortius писал(а):Vadim
Ваше замечание справедливо для fpc 2.4.0. В SVN уже давно добавлен тип UTF8String

Вообще говоря, Utf8String есть и в 2.4.0, и даже раньше, при этом везде он эквивалентен AnsiString.
modjo
новенький
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Сообщение modjo »

Я тут вопрос задал, но он наверное утонул в ваших размышлениях :D

Не подскажите возможно ли обновить ячейку не считывая заранее значения? Что-то типа этого:

Код: Выделить всё

update users set username=username+" егоров" where uid="1"


При таком подходе пишется 0 в ячейку.
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

http://www.webmasterworld.com/forum88/5049.htm
И наверное это зависит от СУБД.
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

update users set username=username+" егоров" where uid="1"

Не уверен, что такой запрос в случае с SQLite корректен (хотя сам не пробовал). Читайте документацию.


можно узнать плюсы данного компонента перед стандартным? По текстам в теме не понял различия. Какую версию sqlite3.dll данный компонент поддерживает?

Если вы для себя с первого взгляда плюсов не нашли, скорее всего для вас их просто нет. Подбирал/изменял под себя - если кому-то ещё он пригодится, пользуйтесь, если нет - стандартный компонент Lazarus никуда не делся :)
Что касается версии библиотеки, то всё проверено на версиях 3.6.x. Буквально на днях вышла версия 3.7.0 - на ней ещё не проверял (только сегодня добрался до компа после недельного отпуска).
Аватара пользователя
evd
новенький
Сообщения: 21
Зарегистрирован: 13.09.2009 09:42:28
Откуда: Вологда
Контактная информация:

Сообщение evd »

modjo писал(а):Я тут вопрос задал, но он наверное утонул в ваших размышлениях :D

Не подскажите возможно ли обновить ячейку не считывая заранее значения? Что-то типа этого:

Код: Выделить всё

update users set username=username+" егоров" where uid="1"


При таком подходе пишется 0 в ячейку.


Надо делать не сложение, а конкатенацию строк

Код: Выделить всё

update users set username=username || " егоров" where uid="1"
modjo
новенький
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Сообщение modjo »

evd
Оно самое, спасибо!
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

Odyssey писал(а):
Padre_Mortius писал(а):можно узнать плюсы данного компонента перед стандартным? .../quote]
...
* возможность работы с blob'ами (насколько я знаю, в Dataset'ах её нет); вот тут я ошибся, значит этот пункт вычёркиваем.
...

Судя по этой ветке форума, работа с блобами в SQLite(3)DataSet всё же не поддерживается. Т.е. интерфейс есть, а реализации нет.
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

Возникла интересная проблема. Есть сабжевые компоненты (собственно, с другими примерно та же ситуация). Отправляем к базе запрос, скажем, типа "SELECT * FROM table". Результаты запроса лежат в таблице TSQLiteTable. Требуется каким-то образом сохранить эти результаты в файл, а затем загрузить их из файла в другой TSQLiteTable.

Своих методов для сохранения/загрузки данных у этого класса нет. Пока пытаюсь решить проблему путём работы с переменной fResults, которая хранит внутри класса TSQLiteTable результаты выборки. Сама эта переменная имеет тип TList, и хранит данные в виде разномастных указателей (pstring, pint64 и ещё нескольких).

Собственно, вопрос к знатокам: как все эти указатели записать в файл, а потом считать обратно так, чтобы получился точно такой же TList, какой был в оригинале? Возможно ли это вообще, или стоит копать в другую сторону?

PS. Записать в файл, вроде бы как, получается через TFileStream (write(str^)), но пока нет внятных мыслей как эту массу прочитать обратно. Писать для каждой записи её размер?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Nik
TStringList не подойдёт?
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

Vadim писал(а):Nik
TStringList не подойдёт?

А есть простой способ преобразовать TList в TStringList и обратно? Я, увы, не знаю такого :(
Ответить