|
SQLite: sqlite3_stmt - комплексный вопрос
|
|||
---|---|---|---|
#18+
Товарищи я sqlite только недавно начал копать, так что сильно не пинайте Вопрос такой: У меня есть объект sqlite3_stmt*, представляющий запрос (select). Выполняя этот запрос, я сохраняю список sqlite3_value* объектов в некую глобальную структуру. После того, как все данные получены мне стейтмент больше не нужен и я вызываю для него sqlite3_finalize. Далее я пытаюсь выгрести непосредственно значения из объектов sqlite3_value* (скажем вызываю sqlite3_text_value), но как результат получаю ассерт на этом вызове. Правильно ли я понимаю, что когда я "финализирую" стейтмент все связанные с ним объекты sqlite3_value* тоже уничтожаются? И если да - то как этого избежать (не нашел пока операции копирования для sqlite3_value*)? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2008, 13:51 |
|
SQLite: sqlite3_stmt - комплексный вопрос
|
|||
---|---|---|---|
#18+
GlobusERВыполняя этот запрос, я сохраняю список sqlite3_value* объектов в некую глобальную структуру.Вот это и есть твоя ошибка. Надо сохранять не указатели на sqlite3_value, а конкретные значения. sqlite3_value имеет смысл только "здесь и сейчас". Это по существу указатель на внутреннюю структуру внутри библиотеки. Читай эту главу: http://www.sqlite.org/capi3ref.html#sqlite3_column_blob GlobusERПосле того, как все данные получены мне стейтмент больше не нужен и я вызываю для него sqlite3_finalize. Далее я пытаюсь выгрести непосредственно значения из объектов sqlite3_value* (скажем вызываю sqlite3_text_value), но как результат получаю ассерт на этом вызове. Правильно ли я понимаю, что когда я "финализирую" стейтмент все связанные с ним объекты sqlite3_value* тоже уничтожаются?Да, правильно. Читай ту самую главу что я показал, третий абзац. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2008, 18:02 |
|
SQLite: sqlite3_stmt - комплексный вопрос
|
|||
---|---|---|---|
#18+
White Owl GlobusERВыполняя этот запрос, я сохраняю список sqlite3_value* объектов в некую глобальную структуру.Вот это и есть твоя ошибка. Надо сохранять не указатели на sqlite3_value, а конкретные значения. sqlite3_value имеет смысл только "здесь и сейчас". Это по существу указатель на внутреннюю структуру внутри библиотеки. Читай эту главу: http://www.sqlite.org/capi3ref.html#sqlite3_column_blob GlobusERПосле того, как все данные получены мне стейтмент больше не нужен и я вызываю для него sqlite3_finalize. Далее я пытаюсь выгрести непосредственно значения из объектов sqlite3_value* (скажем вызываю sqlite3_text_value), но как результат получаю ассерт на этом вызове. Правильно ли я понимаю, что когда я "финализирую" стейтмент все связанные с ним объекты sqlite3_value* тоже уничтожаются?Да, правильно. Читай ту самую главу что я показал, третий абзац. Спасибо за ответ! И сразу вопрос. Другими словами, нет сопсоба сохранить копию sqlite3_value? Просто сейчас я использую boost::any (а точнее ввел вообще промежуточную сущность) чтобы в едином виде хранить значения разных типов в моих контейнерах. Получилось довольно стройно, но мне это не очень нравится чисто с религиозной точки зрения (хотелось бы иметь в программе 1 тип для такого вида данных, а не два и постоянно заморачиваясь с переходом sqlite3_value -> boost::any)? Я просто покопал сорцы и нашел разные функции вида sqlite3VdbeMemCopy и т.п., но на них у меня ругается линкощик, говорят что unresolved external symbol. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2008, 12:12 |
|
SQLite: sqlite3_stmt - комплексный вопрос
|
|||
---|---|---|---|
#18+
GlobusERИ сразу вопрос. Другими словами, нет сопсоба сохранить копию sqlite3_value?Ну почему же, теоретически есть... Только смысла в этом нет. Ты в любом случае для реально работы с данными будешь переконвертировать sqlite3_value в char[] или int. Так какая разница будешь ты это делать сразу после прочтения данных из базы или только перед расчетами и/или отображением их пользователю? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2008, 18:02 |
|
SQLite: sqlite3_stmt - комплексный вопрос
|
|||
---|---|---|---|
#18+
GlobusERИ сразу вопрос. Другими словами, нет сопсоба сохранить копию sqlite3_value? Просто сейчас я использую boost::any (а точнее ввел вообще промежуточную сущность) чтобы в едином виде хранить значения разных типов в моих контейнерах. Получилось довольно стройно, но мне это не очень нравится чисто с религиозной точки зрения (хотелось бы иметь в программе 1 тип для такого вида данных, а не два и постоянно заморачиваясь с переходом sqlite3_value -> boost::any)? Я просто покопал сорцы и нашел разные функции вида sqlite3VdbeMemCopy и т.п., но на них у меня ругается линкощик, говорят что unresolved external symbol. Данные из базы стоит брать непосредственно тогда, когда они нужны и не делать слой промежуточного хранения - вы расходуете лишнюю память, выполняете лишние преобразования, пишите лишний код... Для клиент-сервера промежуточный слой зачастую имеет смысл, но для встраиваемой СУБД - явно излишен. Если нужно временное хранилище - замечательно подходит in-memory база и репликация данных в обоих направлениях выполняется стандартными sql-командами. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2008, 19:04 |
|
SQLite: sqlite3_stmt - комплексный вопрос
|
|||
---|---|---|---|
#18+
А можно глупый вопрос не по теме: Как произвести репликацию данных между базами одними запросами. (Применительно к SQLite3) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2009, 10:57 |
|
|
start [/forum/topic.php?fid=54&msg=35884963&tid=2009459]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
176ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 283ms |
0 / 0 |