SQLite на PocketBook

 
Libroom Forum IndexPocketBookPocketBook Free
AuthorMessage

blackbird
Зрелый участник форума

Зрелый участник форума



Joined: 02 Oct 2009
Posts: 28



Posted: 31.10.2009 23:53    

подключил к программе SQLite в виде амальгамации,
скомпилировал. К эмуляторе всё ок, на книжке ведёт себе очень странно, например сортирует ORDER BY в обратном порядке. И не записывает в базу, такое ощущение, что не флашит буфер, т.е. после нексольких успешных вызовов типа "update table set bla-bla-bla" видны последствия только первого. хотя перед выходом делаю честный sqlite3_close(). Я еще не вполне понял механику возникновения упомянутых проблем, но может какой-то тоже пробовал SQLite с аналогичными проблемами и знает простой ответ?
 
View user's profile ^

blackbird
Зрелый участник форума

Зрелый участник форума



Joined: 02 Oct 2009
Posts: 28



Posted: 02.11.2009 01:03    

Итого, простая база:
Code:
CREATE TABLE cards (
   text TEXT NOT NULL,
   due FLOAT NOT NULL
);
INSERT INTO cards VALUES('second',1255355329.671);
INSERT INTO cards VALUES('first', 1255355260.546);

в ответ на запрос "select * from cards order by due"
выдаёт в эмуляторе и в любой другой среде на десктопе
Code:
text = first
due = 1255355260.546

text = second
due = 1255355329.671
, на книжке -
Code:
text = second
due = -3.34648431592573e+233

text = first
due = -1.93784766618264e+150

пример вызывающей программы http://dumpz.org/13898/
 
View user's profile ^

Finom1
Член клуба The eBook

Член клуба The eBook



Joined: 08 May 2008
Posts: 1855


Location: Одесса

Posted: 02.11.2009 02:22    

Может я что-то не понимаю, но после order by due можно указать порядок сдедования desc или asc.
blackbird wrote:
в виде амальгамации
Что это?
 
View user's profile ^

blackbird
Зрелый участник форума

Зрелый участник форума



Joined: 02 Oct 2009
Posts: 28



Posted: 02.11.2009 13:11    

FINoM wrote:
Может я что-то не понимаю, но после order by due можно указать порядок сдедования desc или asc.

Да, можно указать, но по умолчанию asc.
В любом случае добавления явного указания направления сортировки в запрос ничего не изменило.

FINoM wrote:
blackbird wrote:
в виде амальгамации
Что это?

Это когда все файлы собраны в обин большой инклуд, который просто подключается к проекту и компилируется вместе с ним. По крайней мере так это называют сами SQLite-овцы, самый, в общем, кроссплатформенный вариант.
 
View user's profile ^

a_lone
Член клуба The eBook

Член клуба The eBook



Joined: 16 Sep 2004
Posts: 1724



Posted: 02.11.2009 17:11    

blackbird
по выборке похоже, что order by игнорируется, или сортирует по какому-то другому due
попробуйте отсортировать по text asc & desc, работает ли так, а кроме того, избегайте таких названий полей, они могут значить нечто другое, или подвязывайте к алиасам (кто знает, что в данной инкарнации базы данных значит due)
_________________
Palm T|X -> V3Ext -> Kindle 3 3G -> Sony PRS-650BC -> Nook Touch -> KPW -> Kindle Oasis 2
 
View user's profile ^

blackbird
Зрелый участник форума

Зрелый участник форума



Joined: 02 Oct 2009
Posts: 28



Posted: 02.11.2009 18:01    

a_lone wrote:
blackbird
по выборке похоже, что order by игнорируется, или сортирует по какому-то другому due
попробуйте отсортировать по text asc & desc, работает ли так, а кроме того, избегайте таких названий полей, они могут значить нечто другое, или подвязывайте к алиасам (кто знает, что в данной инкарнации базы данных значит due)

По какому, пардон, другому due? в таблице всего две строки и два столбца. Один с текстом, другой с вещественными числами, трудно представить более прозрачный пример. Не называть же их SAMPLE_COLUMN_OF_BIG_FLOATS Smile
Сортировка по тексту работает, только непонятно чем это помогает. В принципе видно, что проблема с обработкой больших чисел - sqlite возвращает все значения select-a в виде строк, и в них, как видно на примере выше - числа уже исковерканы. Какой уж тут order by
 
View user's profile ^

a_lone
Член клуба The eBook

Член клуба The eBook



Joined: 16 Sep 2004
Posts: 1724



Posted: 03.11.2009 11:36    

blackbird wrote:

По какому, пардон, другому due? в таблице всего две строки и два столбца. Один с текстом, другой с вещественными числами, трудно представить более прозрачный пример. Не называть же их SAMPLE_COLUMN_OF_BIG_FLOATS Smile
Сортировка по тексту работает, только непонятно чем это помогает. В принципе видно, что проблема с обработкой больших чисел - sqlite возвращает все значения select-a в виде строк, и в них, как видно на примере выше - числа уже исковерканы. Какой уж тут order by


я имел в виду понятие "зарезервированные слова".
Используйте тип данных Numeric и будет вам счастье

Posted after 2 minutes 22 seconds:

Если, конечно, он есть в SQLLite. В Sybase это помогло решить проблему

Posted after 10 minutes 10 seconds:

Почитал доку SQLLite - непонятно.
Может, стоит использовать DOUBLE - это двойной FLOAT, или REAL - если только он 8-байтовый.
В любом случае у Вас банальное переполнение данных
 
View user's profile ^

blackbird
Зрелый участник форума

Зрелый участник форума



Joined: 02 Oct 2009
Posts: 28



Posted: 03.11.2009 12:01    

Да, в SQLite есть NUMERIC, но, к великому сожалению, базы генерирует не моё приложение, я делаю только вьювер для книжки.

И да, похоже на переполнение, но очень бы хотелось понять какой именно нюанс компиляции/ в каком месте библиотеки приводит к таким печальным последствиям, чтобы написать либо авторам базы, либо в SQLite, либо, в идеале - исправить самостоятельно.

Ибо писать "ребята, тут ваша библиотека че-то не работает у меня на книжке" будет менее продуктивно Smile

Posted after 7 minutes 38 seconds:

кстати сейчас проверю с numeric этот же пример

Posted after 10 minutes 54 seconds:

вообще интересно: с NUMERIC сортирует (если это не случайность), но данные возвращает также испорченные.
 
View user's profile ^

a_lone
Член клуба The eBook

Член клуба The eBook



Joined: 16 Sep 2004
Posts: 1724



Posted: 03.11.2009 12:59    

А DOUBLE здесь нет?
Говоря про NUMERIC, Я имел в виду тип данных NUMERIC(v, n), где v - кол-во знаков до запятой, n - после.
_________________
Palm T|X -> V3Ext -> Kindle 3 3G -> Sony PRS-650BC -> Nook Touch -> KPW -> Kindle Oasis 2
 
View user's profile ^

blackbird
Зрелый участник форума

Зрелый участник форума



Joined: 02 Oct 2009
Posts: 28



Posted: 03.11.2009 20:07    

и DOUBLE тут есть, только толку от него нет. Прежде всего я не могу формат базы менять, а вообще попробовал и дабл - всё равно значение портится. Размер интов/флоатов на книжке такой же, странно, что один и тот же код ведёт себя по-разному. Может быть они используют какой-то библиотечный вызов для конвертации строк во флоаты, который как раз и сбоит на длинных числах :-\

Posted after 1 minute 18 seconds:

собственно double\float представляют разницу в точности, показатель-то должен одинаковый быть...

Posted after 10 minutes 56 seconds:

точнее будет сказать, что он понимает double в запросах, а в документации написано, что есть один тип real, но он умеет записывать данные в виде текста, если видет, что точность теряется. В любом случае проблема в том, как их оттуда прочитать.

Posted after 47 minutes 4 seconds:

в общем ни numeric ни float ни double ни real не сортируются и не возвращают данные. Там где выше я написал, что numeric поля отсортировались - это неверно.
из числа 1000000000.1 получается 1.78e-308. ох...

Posted after 8 minutes 45 seconds:

Ха-ха, а я сделал числа поменьше - и он всё равно не работает.
Поменьше - это типа 100.1, т.е. проблема не с переполнением
 
View user's profile ^

RedUser
Член клуба The eBook

Член клуба The eBook



Joined: 22 Jan 2009
Posts: 569


Location: Мурманск

Posted: 03.11.2009 21:18    

blackbird wrote:
...... странно, что один и тот же код ведёт себя по-разному. Может быть они используют какой-то библиотечный вызов для конвертации строк во флоаты, который как раз и сбоит на длинных числах ...
Хе-хе, конкретно по теме ничего сказать не могу, но я тут намеревался сделать типа упрощенный библиотекарь, так в эмуляторе все идет на ура. Раскладывает книжки по жанрам и так, как мне надо еще... А на книжке тот же код вываливается. На обработке определенной книги (может и дальше так, пока одну нашел). Рядом сотни таких же - нормально проходят. А эта.... Уже всю ее вдоль и поперек изучил - ничего особенного. Вобщем забросил это дело...

А по теме. Не мое дело, конечно, но может проще сделать внешний конвертор? Из базы во что-то понимаемое книгой?
_________________
PocketBook 301+ ‹14.2› | PocketBook 360 ‹14.2›
Ищется работа. Мурманск
 
View user's profile ^

blackbird
Зрелый участник форума

Зрелый участник форума



Joined: 02 Oct 2009
Posts: 28



Posted: 03.11.2009 21:25    

еще пара несложных экспериментов показала, что портятся те числа, у которых есть что-то отличное от нуля после десятичной точки: 100 -ok, 100.0 - ок, 100.1 - fail

Posted after 4 minutes 40 seconds:

RedUser wrote:

А по теме. Не мое дело, конечно, но может проще сделать внешний конвертор? Из базы во что-то понимаемое книгой?

ох, ну это самый крайний вариант, но пользователю будет ощутимо менее удобно. Обидно то, что на эмуляторе всё (по крайней мере в черновом варианте) уже работает. Решить проблему с SQLite - и можно было бы предоставлять на суд общественности.
 
View user's profile ^

blackbird
Зрелый участник форума

Зрелый участник форума



Joined: 02 Oct 2009
Posts: 28



Posted: 04.11.2009 21:52    

из SQLite-а пишут
Quote:
I'm guessing that your hardward does not implement IEEE 754 floating point correctly. We've seen that sort of thing before, especially with GCC. There are some options to GCC (which escape my memory right now) that can force it to use strict IEEE 754 floating point rather than its preferred, speedier but non-standard alternative.

поскольку базу менять не вариант, осталось найти эту волшебную опцию

Posted after 16 minutes 56 seconds:

если это -msoft-float - то на книжке нет libfloat :-\
 
View user's profile ^

ni4
Недавний участник форума

Недавний участник форума



Joined: 31 Aug 2009
Posts: 15



Posted: 09.11.2009 01:08    

А зачем собственно привязка к float? Поставьте уже int, если это вызывает такие проблемы.
 
View user's profile ^

a_lone
Член клуба The eBook

Член клуба The eBook



Joined: 16 Sep 2004
Posts: 1724



Posted: 09.11.2009 12:25    

ni4
автор же ясно написал "..поскольку базу менять не вариант.."
_________________
Palm T|X -> V3Ext -> Kindle 3 3G -> Sony PRS-650BC -> Nook Touch -> KPW -> Kindle Oasis 2
 
View user's profile ^

t.t
Член клуба The eBook

Член клуба The eBook



Joined: 20 Oct 2008
Posts: 431


Location: Киев

Posted: 10.11.2009 11:44    

В ядре включён умолчательный эмулятор FPU. С float и double никаких проблем не было. От DmitryZ поступило предложение попробовать опцию -static-libgcc.
 
View user's profile ^

blackbird
Зрелый участник форума

Зрелый участник форума



Joined: 02 Oct 2009
Posts: 28



Posted: 10.11.2009 17:28    

t.t wrote:
В ядре включён умолчательный эмулятор FPU. С float и double никаких проблем не было. От DmitryZ поступило предложение попробовать опцию -static-libgcc.

c -static-libgcc тоже не работает Sad
И только что вышедший sqlite 3.6.20 также не принёс облегчения.
Где-то видел тест на совместимость с этим самым стандартом, попробую найти еще раз и запустить на книжке.
 
View user's profile ^

Ian Gore
Новенький участник форума

Новенький участник форума



Joined: 15 Dec 2009
Posts: 1



Posted: 15.12.2009 15:38    

Не знаю, актуальна ли ещё тема для автора топика, но меня проблема заинтересовала, и я кое-что нашел. А так как реального устройства у меня нет, то сам проверить мысль не могу.

В общем так - попробуйте поставить следующий define в своем примере перед sqlite
Code:
#define SQLITE_MIXED_ENDIAN_64BIT_FLOAT
#include "libs/sqlite3.h"

в sqlite3.с про этот define написано, что его надо использовать, если в числе используется другой порядок байтов (в вашем примере такое предположение напрашивается). Сначала грешили на архитектуру ARM, но в поздних комментариях указывается на ядро Linux, которое эмулирует 48 битное кодирование флоата на некоторых процессорах с 32 мантиссой.

Как говорится - возможно, это наш случай. Попробуйте.
 
View user's profile ^

blackbird
Зрелый участник форума

Зрелый участник форума



Joined: 02 Oct 2009
Posts: 28



Posted: 16.12.2009 01:25    

Code:

#define SQLITE_MIXED_ENDIAN_64BIT_FLOAT
#include "libs/sqlite3.h"

не пойдёт, если sqlite.c компилируется отдельно, но можно передать в gcc опцию -DSQLITE_MIXED_ENDIAN_64BIT_FLOAT - и да, ОНО РАБОТАЕТ!!!!!!!
спасибо огромное, я уже было отчаялся Smile

Posted after 22 minutes 42 seconds:

на самом деле у меня тоже нет устройства, я надеюсь что я правильно написал тест и человек его правильно понял....
и осталось разобраться с почему таки часть изменения не сохраняется :-\
 
View user's profile ^

blackbird
Зрелый участник форума

Зрелый участник форума



Joined: 02 Oct 2009
Posts: 28



Posted: 17.12.2009 01:39    

так, с буферизацией - мой косяк был.
с вещественными числами - всё ок,
Code:
-DSQLITE_MIXED_ENDIAN_64BIT_FLOAT
помогает
проблему можно считать решенной
спасибо еще раз!
 
View user's profile ^
Libroom Forum IndexPocketBookPocketBook FreeAll times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum

© Libroom, 2021