проблема с clsql в SBCL

Я пытаюсь заставить работать clsql (раньше использовал cl-mysql, но ищу альтернативы). Просто пытаюсь поиграть в этот момент, и меня останавливают на connect

(connect '("localhost" "test" "user" "password") :database-type :mysql)

получает меня

erred while invoking #<COMPILE-OP (:VERBOSE NIL) {BDFF0B9}> on
#<CLSQL-UFFI-SOURCE-FILE "clsql-uffi" "uffi" "clsql_uffi">
   [Condition of type ASDF:OPERATION-ERROR]

Backtrace:
  0: ((SB-PCL::FAST-METHOD ASDF:PERFORM (ASDF:COMPILE-OP CLSQL-UFFI-SYSTEM::CLSQL-UFFI-SOURCE-FILE)) ..)
  1: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0. SB-PCL::.ARG1.)) ..)
  2: ((LAMBDA ()))
  3: ((FLET SB-THREAD::WITH-RECURSIVE-LOCK-THUNK))
  4: ((FLET #:WITHOUT-INTERRUPTS-BODY-[CALL-WITH-RECURSIVE-LOCK]324))
  5: (SB-THREAD::CALL-WITH-RECURSIVE-LOCK ..)
  6: ((FLET SB-C::WITH-IT))
  7: ((SB-PCL::FAST-METHOD ASDF:OPERATE (T T)) #<unavailable argument> #<unavailable argument> ASDF:LOAD-OP :CLSQL-MYSQL)[:EXTERNAL]
  8: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0. SB-PCL::.ARG1. SB-INT:&MORE SB-PCL::.DFUN-MORE-CONTEXT. SB-PCL::.DFUN-MORE-COUNT.)) ..)
  9: (CONNECT ("localhost" "test" "user" "password"))[:EXTERNAL]
 10: (SB-INT:SIMPLE-EVAL-IN-LEXENV (CONNECT '("localhost" "test" "user" "password") :DATABASE-TYPE :MYSQL) #<NULL-LEXENV>)
 11: ((LAMBDA ()))
 --more--

Если я буду следовать accept перезапускам (обрезанным выше для краткости) на всем пути, я в конечном итоге доберусь до

Attempt to call an undefined alien function.
   [Condition of type SB-KERNEL::UNDEFINED-ALIEN-FUNCTION-ERROR]

Restarts:
 0: [RETRY] Retry SLIME interactive evaluation request.
 1: [ABORT] Return to SLIME's top level.
 2: [TERMINATE-THREAD] Terminate this thread (#<THREAD "worker" RUNNING {BD63789}>)

Backtrace:
  0: (SB-KERNEL::UNDEFINED-ALIEN-FUNCTION-ERROR)
  1: ("foreign function: #x806774B")
  2: ("foreign function: #x8052F2D")
  3: ("foreign function: #x80565C9")
  4: ((SB-PCL::FAST-METHOD CLSQL-SYS:DATABASE-CONNECT (T (EQL :MYSQL))) #<unavailable argument> #<unavailable argument> ("localhost" "test" "user" "password") :MYSQL)
  5: (CONNECT ("localhost" "test" "user" "password"))[:EXTERNAL]
  6: (SB-INT:SIMPLE-EVAL-IN-LEXENV (CONNECT '("localhost" "test" "user" "password") :DATABASE-TYPE :MYSQL) #<NULL-LEXENV>)
  7: ((LAMBDA ()))
 --more--

Я использую SBCL 1.0.40.0, Debian 6.0, clsql был установлен с использованием quicklisp и mysql v14.14 (хотя я сомневаюсь, что это проблема с mysql).


person Inaimathi    schedule 17.02.2011    source источник


Ответы (2)


Не используйте перезапуск accept. Это означает «Продолжайте идти, даже если что-то облажалось», и это редко, если вообще когда-либо, то, что вы хотите делать.

У вас установлены библиотеки разработки mysql? У вас есть libmysqlclient.so?

Одна вещь, которую можно попробовать: запустите новый sbcl и быстро загрузите «clsql-uffi», затем проследите clsql-uffi::find-and-load-foreign-library, затем (clsql:connect nil :database-type 'mysql), чтобы увидеть, находит ли он то, что вам нужно, на основе вывода трассировки.

person Xach    schedule 17.02.2011
comment
У меня установлено libmysqlclient-dev, find -name libmysqlclient.so возвращает совпадение в /usr/lib/. Быстрая загрузка clsql-uffi на чистом SBCL завершается ошибкой с теми же ошибками, что и выше (быстрая загрузка uffi завершается успешно, а быстрая загрузка clsql_uffi выдает ошибку System not found. Если я попытаюсь быстро загрузить clsql-uffi после clsql_uffi, мне сообщат об ошибках, что CLSQL-UFFI:ATOL64 не определено). - person Inaimathi; 17.02.2011
comment
Загрузка clsql-uffi-loader.lisp вручную тоже выдает ошибку; Couldn't load foreign library "clsql_uffi". (searched CLSQL-SYS:*FOREIGN-LIBRARY-SEARCH-PATHS*). CLSQL-SYS:*FOREIGN-LIBRARY-SEARCH-PATHS* оценивается как (#P"/home/inaimathi/quicklisp/dists/quicklisp/software/clsql-20101207-git/uffi/") (что правильно, и этот каталог содержит clsql_uffi файлы lib, c и dll). У меня такое чувство, что я упускаю что-то маленькое и очевидное. - person Inaimathi; 17.02.2011

Оказывается, я должен был сделать

apt-get install cl-sql

Это было необходимо, несмотря на то, что у меня уже был libmysqlclient-dev и я установил clsql через quicklisp (который выглядел так, будто с ним были все правильные файлы c). После этого я смог подключиться к локальному серверу mysql, используя

(connect '("localhost" "test" "user" "password") :database-type :mysql)

В качестве примечания, он по-прежнему выдавал пару предупреждений в моей 64-битной системе (на моей 32-битной машине проблем не было); с помощью accept перезапуска (извините, Xach) довел его до вроде бы рабочего состояния.

Я понятия не имею, как в деталях это решило проблему; если кто-то может это объяснить, ответьте, и я проголосую + приму (при условии, что ваше объяснение верно).

РЕДАКТИРОВАТЬ: аналогичная проблема на другой машине расстроила меня примерно на 30 минут. Кажется, что это должно быть допущено, но если вы собираете систему с нуля, обязательно установите gcc. Если вы этого не сделаете, это не позволит clsql-uffi скомпилировать свои компоненты по очевидным причинам. Когда процесс терпит неудачу таким образом, вы получаете ту же ошибку компиляции, что и в вопросе, поэтому прикройте свои базы.

person Inaimathi    schedule 18.02.2011
comment
В общем, Debian изменяет библиотеки CL способами, которые я нахожу запутанными и трудными для устранения неполадок. Я использую системы Debian, но для библиотек и реализации Lisp я получаю все от апстрима или Quicklisp. Не совсем объяснение, извините. - person Xach; 18.02.2011