А то тут похоже нужно написать backend с не posix-совместимому file-storage.
А то тут похоже нужно написать backend с не posix-совместимому file-storage.
% dist/build/stupid/stupid
with SqliteConn!!
reset !!!!!!!!
reset !!!!!!!!
reset !!!!!!!!
Migrating: CREATE TABLE "persist"("id" INTEGER PRIMARY KEY,"pico" NUMERIC(22,12) NOT NULL)
reset !!!!!!!!
reset !!!!!!!!
insert !!!!
reset !!!!!!!!
reset !!!!!!!!
reset !!!!!!!!
reset !!!!!!!!
select !!!1111
"get PersistInt64 1: Expected Rational, received: PersistDouble 24.44455524"
reset !!!!!!!!
reset !!!!!!!!
close connection !!11!111
reset !!!!!!!!
zsh: segmentation fault dist/build/stupid/stupid
А вот код проекта
bpaste.net
Как такое может быть я просто не понимаю, ведь reset вызывается лишь один раз — внутри bracketP в функции get ... Ну ладно вызовы ДО "select !!!!!" там я не сильно смотрел да и миграция базы и все такое, пусть там дохрена запросов, но после вызова select делается два reset, да еще один после закрытия конекта, я нихуя не понимаю как так то !!!
Сегфолт возникает в функции sqlite3_reset, когда withConnection запускается внутри ResourceT, а не наоборот, как и должно быть. Сегфолт вызывается ошибкой конвертирования данных из PersistValue в целевой тип во время селекта, вернее не самой этой ошибкой, конечно, а происходит при возникновении этой ошибки. При чем, если внутри ResourceT просто вручную сделать error "blabla", то ошибка не вызывает сегфолта.
Сам сегфолт возникает в функции sqlite3_reset (биндинг), скорее всего из-за того, что соединение закрывается раньше, чем финализируется Statement (ведь ResourceT снаружи WithConnection, правда финализация все равно должна происходить в bracketP). Другое предположение: Statement финализируется дважды, один раз, при возникновении ошибки внутри bracketP, второй раз в runResourceT по каким — то мистическим причинам. Только не ясно при чем сдесь тогда withConnection.
Короче до конца еще не разобрался, кому интересно вот github.com код. В ветке fixedval мой код поверх Сноймановского master.
Есть предложения как отлаживать кроме отладочной печати ?
linux.org.ru
дискач
дискач
paste.in.ua
Пример использования: paste.in.ua
Для тех кто не в теме — persistent это такая «ORM» на haskell, используемая в yesod. Её проблема на сегодняшний день в том, что она вообще не умеет делать сложные sql-запросы иначе как «ручками» (с выписыванием запросов в виде строк, аля php). Данный модуль пытается решить эту проблему.