← Архив: Common Lisp

clsql & sbcl

Author: · 15.12.2010 11:19
· original author: erazer
Здрасьте!
Желаю общаться из sbcl с mysql. Поставил необходимые пакеты с помощью clbuild.
Далее делаю
(require :asdf)
(asdf:operate 'asdf:load-op 'clsql)
(use-package :clsql-user)
(connect `("host" "dbname" "root" "password") :database-type :mysql)


В ответ получаю



debugger invoked on a TYPE-ERROR in thread #<THREAD "initial thread" RUNNING
                                             {1002DA3EA1}>:
  The value
    (BABEL:STRING-SIZE-IN-OCTETS "SET SESSION sql_mode='ANSI'" :ENCODING
                                 (OR NIL CFFI:*DEFAULT-FOREIGN-ENCODING*))
  is not of type
    (UNSIGNED-BYTE 32).
Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.
((FLET #:G386) #.(SB-SYS:INT-SAP #X00641B80))
0] 0



Пробовал делать так


* (setf cffi:*default-foreign-encoding* :cp1251)
:CP1251



Кодировку подставлял любую на выбор: utf8,cp1251,ansi - не имеет значения, результат одинаковый.


Собственно, вопрос: зачем он так со мной и что он хочет мне сказать? Помогите разобраться с затруднением.



p.s. пакеты ставил через clbuild - все свежее с сайтов разработчиков. Пробовал на убунте и на федоре. Через asdf у меня вообще так и не получилось пакеты даже поставить. Через clbuild все ставится, но результат идентичный на всех ОС.


· original author: archimag
Хм, у нас тут есть крайняя права кнопка, которая позволяет вставлять в сообщения код, например:(require :asdf)
(asdf:operate 'asdf:load-op 'clsql)
(use-package :clsql-user)
(connect `("host" "dbname" "root" "password") :database-type :mysql)
debugger invoked on a TYPE-ERROR in thread #<THREAD "initial thread" RUNNING
                                            {1002DA3EA1}>:
 The value
   (BABEL:STRING-SIZE-IN-OCTETS "SET SESSION sql_mode='ANSI'" :ENCODING
                                 (OR NIL CFFI:*DEFAULT-FOREIGN-ENCODING*)
)

 is not of type
   (UNSIGNED-BYTE 32).
Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
 0: [ABORT] Exit debugger, returning to top level.
((FLET #:G386) #.(SB-SYS:INT-SAP #X00641B80))
0] 0
:))
· original author: artem
> Желаю общаться из sbcl с mysql. 
Насколько я знаю, sbcl с mysql через clsql дружит плохо, даже если вы заведете clsql без ошибок. Там какие-то глубокие проблемы между sbcl и mysql были. Во всяком случае в начале этого года было так.
· original author: erazer
ладно, а как же тогда общаться? у кого какие решения? должен же lisp как-то с БД общаться...
· original author: erazer
...собственно говоря, может есть какая-то другая реализация лиспа, где подобных проблем меньше? Строго говоря, я в лиспе ноль. SBCL взял потому как везде пишут буд-то это самый современный оптимальный вариант - из доступных бесплатно, имеется ввиду, lispworks сотоварищи рассматривать априори не будем.
· original author: archimag
> может есть какая-то другая реализация лиспа
Думаю лучше взять какую-нибудь другую либу для доступа к базе данных, ибо проблемы с CLSQL перманентны :) Например, поиск находит cl-mysql (я не работаю с MySQL, поэтому не ориентируюсь в вопросе). А оптимальный вариант - сменить СУБД на PostgreSQL, для которой есть postmodern.
P.S. Вместо clbuild сейчас лучше использовать quicklisp .
· original author: erazer
Воспользовался quicklisp'ом и cl-mysql
Пытаюсь делать коннект к базе
(cl-mysql:connect "127.0.0.1" "dbname" "root" "password")
В ответ получаю
debugger invoked on a SB-INT:SIMPLE-PROGRAM-ERROR in thread #<THREAD
"initial thread" RUNNING
{1002DA3E41}>:
unknown &KEY argument: "127.0.0.1"
Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT] Exit debugger, returning to top level.
(COM.HACKINGHAT.CL-MYSQL-SYSTEM:CONNECT)[:EXTERNAL]
0] 0
По документации функция connect описана как
connect &key host database user password port socket client-flag
Документацию читал здесь: http://www.hackinghat.com/index.php/cl-mysql
Что я не так делаю? Не могу понять, как функцией пользоваться. Займите ума кто-нибудь, а?
· original author: Love5an
http://www.lispworks.com/documentation/HyperSpec/Body/03_da.htm
· original author: erazer
Спасибо! Оказывается, это самые начала языка :)
Пока все получилось. Всех благодарю.
· original author: archimag
> Займите ума кто-нибудь, а?
На этом сайте есть перевод Practical Common Lisp. Конкретно именованные параметры функций обсуждаются здесь.
· original author: artem
Общается. Про проблему с sbcl и mysql я знаю от человека, который ее обнаружил. Там нужно было или падчить sbcl, или mysqllib. Решил тот человек эти пролебы отказавшись от clsql и от mysqllib полностью. Решение заключалось в адаптировании кода с LW под sbcl который работает с mysql напрямую через сокеты. Знаю я это все, так как адаптировали мой код, который я писал и использую под LW. Ссылки не код даю, так как по неопытности и незнанию опубликовал в прошлом коду код без лицензии, и его стали тянуть в проекты с GNU/GPL лицензиями, а мне это вообще не понравилось (я противник GNU/GPL и на это у меня есть свои обоснованные причины; в open source я поддерживаю BSD, или public domain).
· original author: dmitry_vk
А что за проблема в SBCL + clsql + mysqllib, если не секрет?
· original author: artem
Я в детали не вникал, так как не пользуюсь ни тем, ни тем, просто читал в рассылке (это все можно найти при желании, в рассылке clsql есть). Если в кратце то там так было (проблема не то что совсем фундаменальная, но при нектором раскладе есть проблема):
1) "...I find that sb-ext:timout no longer works after connecting to a database using clsql. If I run the following test case, the first with-timeout works fine, while the one following the clsql:connect fails. Timeouts remain broken, even after disconnecting the database. ..."
2) "...It ends up that libmysql installs its own signal handler for SIGALRM, overriding the sbcl signal handler, and doesn't reinstall the sbcl signal handler when it is done. This is a bug in the libmysql library, and not the fault of clsql, as such. ..."
То есть может работать, а может и не работать, если будешь использовать нечтно, где возникает конфликт между signal handlers.
· original author: dmitry_vk
Теперь понятно. Переустановка обработчика сигналов - штука неприятная.
· original author: erazer
Может кому интересно будет...
Итого по работе с mysql имеем следующее:
sbcl --load quicklisp.lisp
(quicklisp-quickstart:install)
(ql:quickload "cl-mysql")
(cl-mysql:connect :host "localhost" :database "dbname" :user "root" :password "password")
(cl-mysql:query "select ip,mac from status where mac is not null limit 10")
CLSQL у меня так и не заработал. 
CL-MYSQL вроде бы работает исправно.
Осталось найти чем работать с MSSQL...
· original author: archimag
> Осталось найти чем работать с MSSQL...
Мне надо по работе брать данные из MSSQL, так что для себя сделал cl-mssql на базе FreeTDS - но библиотека развита довольно слабо, просто мои потребности в этой области весьма ограниченны. 
· original author: erazer
Я ее видел. Только readme не нашел никакого.
Не сочтите за наглость - но, может быть, можно было бы черкнуть здесь пару строк в стиле как я написал выше под cl-mysql: как законнкетиться и выполнить простейший запрос? Я с лиспом знакомлюсь 3-й день - мне пока тяжеловато по коду понять как правильно использовать те или иные библиотеки.
Дальше обещаю не задалбывать.
· original author: archimag
> Только readme не нашел никакого.
Потому что его нет )
> как законнкетиться и выполнить простейший запрос?
Вот реальный код, которым я выбираю данные из 1С
CL-USER> (mssql:with-connection (dbname user password server) (mssql:query "select CODE as shop_id, DESCR as name from sc61 where sp18115<>0 order by CODE" :format :plists)) Changed language setting to us_english. Changed database context to 'master'. Changed database context to 'dbname'. ((:SHOP-ID "1" :NAME "01 (Красная, 202)") (:SHOP-ID "2" :NAME "02 (Ставропольская, 213)") (:SHOP-ID "3" :NAME "03 (Сормовская, 108/1)") (:SHOP-ID "4" :NAME "04 (Московская, 54)") (:SHOP-ID "5" :NAME "05 (Ставропольская, 222)") (:SHOP-ID "6" :NAME "06 (40-лет Победы, 144/5)") (:SHOP-ID "7" :NAME "07 (Красных Партизан 173)") (:SHOP-ID "8" :NAME "08 (Тургенева 138/6)") (:SHOP-ID "9" :NAME "09 (Новороссийск)"))
> Дальше обещаю не задалбывать.
"Задалбывать" можно. На самом деле, я заинтересован в том, что бы найти человека, имеющего более развитиые потребности по работе с MSSQL, ибо лично я не имею каких-либо стимулов для дальнейшего развития библиотеки.
· original author: juna
> CL-MYSQL вроде бы работает исправно.
А как в нем установить utf8, не подскажите?