clsql проблема в SBCL - PullRequest
       84

clsql проблема в SBCL

2 голосов
/ 17 февраля 2011

Я пытаюсь заставить работать 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).

Ответы [ 2 ]

2 голосов
/ 18 февраля 2011

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

apt-get install cl-sql

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

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

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

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

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

2 голосов
/ 17 февраля 2011

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

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

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

...