Чтобы добавлять сообщения и комментарии, .

@qnikst:
qnikst

А кто-нить может в общих словах показать и ткнуть в документацию того, что нужно сделать, чтобы написать backend для персистента? Т.е. какое апи он должен предоставлять и какими свойствами должен обладать?
А то тут похоже нужно написать backend с не posix-совместимому file-storage.

@segfault:
segfault

А как делать транзакции то? В древних версиях была runSqlite для sqlite, а сейчас как ?

@segfault:
segfault

а мне наконец-то снойман ответил и пофиксил мой сегфолт, правда опять совсем не красиво, но работает вроде

@segfault:
segfault

Не придумал лучшего способа отладить, кроме как навтыкать трейсов, хотите посмотреть ?
% 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, да еще один после закрытия конекта, я нихуя не понимаю как так то !!!

@segfault:
segfault

Отписываюсь про вчерашние изыскания моего сегфолта в персистенте.
Сегфолт возникает в функции sqlite3_reset, когда withConnection запускается внутри ResourceT, а не наоборот, как и должно быть. Сегфолт вызывается ошибкой конвертирования данных из PersistValue в целевой тип во время селекта, вернее не самой этой ошибкой, конечно, а происходит при возникновении этой ошибки. При чем, если внутри ResourceT просто вручную сделать error "blabla", то ошибка не вызывает сегфолта.
Сам сегфолт возникает в функции sqlite3_reset (биндинг), скорее всего из-за того, что соединение закрывается раньше, чем финализируется Statement (ведь ResourceT снаружи WithConnection, правда финализация все равно должна происходить в bracketP). Другое предположение: Statement финализируется дважды, один раз, при возникновении ошибки внутри bracketP, второй раз в runResourceT по каким — то мистическим причинам. Только не ясно при чем сдесь тогда withConnection.
Короче до конца еще не разобрался, кому интересно вот github.com код. В ветке fixedval мой код поверх Сноймановского master.
Есть предложения как отлаживать кроме отладочной печати ?

@segfault:
segfault

кто-то мне давал ссылку на ишус в репозитории persistent по поводу полей с произвольной точностью, кто-то русский, не ты, жуик ? Руками найти не могу в этих ебанутых ишусах ни по каким ключевым словам, точно помню, что отписывался снойману в этом ишусе, как найти то теперь ?

@segfault:
segfault

linux.org.ru
дискач

@qnikst:
qnikst

а как-нить можно увидеть то, что TH нагенерировал?

@arrowdodger:
arrowdodger

Тут, случаем, нет специалистов по тегам? Как в перзистенте из Entity MyData получить значения поля MyData?

@iportnov:
iportnov

Написал модуль, который позволяет более-менее просто выполнять средствами persistent сложные sql-запросы. На hackage пока не выложил, так что вот исходник:
paste.in.ua
Пример использования: paste.in.ua

Для тех кто не в теме — persistent это такая «ORM» на haskell, используемая в yesod. Её проблема на сегодняшний день в том, что она вообще не умеет делать сложные sql-запросы иначе как «ручками» (с выписыванием запросов в виде строк, аля php). Данный модуль пытается решить эту проблему.