manywaypark's Blog
개발, 검색, 함수

예전에 원작자인 ttyerl에게 패치를 보낸적이 있는데 적용되지 않았다. 그래서 그냥 포크했다.
또한 새로운 버그도 발견!!
davisp이 ttyerl의 원본을 좀 매끄럽게 돌게 고쳤는데 버그는 그대로였다.
그래서 davisp의 fork를 내가 fork해서 수정했다.

버그들:
  1. table_info 버그
  2. query timeout 버그

작업 내역:
  1. 상기 버그 퇴치
  2. eunit test case 추가


URL: http://github.com/mwpark/sqlite-erlang/tree/master

happy hackin'
평소에 간편히 잘 사용하던 SQuirreL SQL Client에서 sqlite3 DB를 사용해보려 했는데 driver 목록에 sqlite3 용은 없었다. 대충 적당한 것을 찾아서 넣어 볼까 했는데 공식 driver가 아닌 것도 있었고, JNI등을 사용해서 복잡하게 컴파일을 해야되는 것들도 있었다. 나는 간단히 레코드 하나만 변경하면 되는데 일이 너무 복잡해지고 있는 느낌이었다. 그때 내 눈에 들어온 것은 driver 목록의 JDBC ODBC bridge!!

시스템 설치/설정
당연한 이야기지만 ODBC package가 안깔려있다면 깔아야한다(sudo apt-get install unixodbc).
SQLite3 ODBC Driver는 그냥 컴파일 하고 설치하면 되는 프로그램이었다 (./configure && makemake install).
컴파일/설치에 관한 자세한 것은 여기.
일단 컴파일/설치 후에는 dll(libsqlite3odbc.so)만 필요로한다.

이제 설정 파일 두개만 손보면 된다.

/etc/odbcinst.ini
[SQLite]
Description=SQLite ODBC Driver
Driver=/usr/local/lib/libsqlite3odbc.so
Setup=/usr/local/lib/libsqlite3odbc.so
Threading=2

~/.odbc.ini
[db1]
Description=test database 1
Driver=SQLite
Database=/tmp/db1.db
[db2]
Description=test database 2
Driver=SQLite
Database=/tmp/db2.db

SQuirreL SQL Client 설정
이제 SQuirreL SQL Client 설정(Aliases에 추가)시에,
Name: blahblah
Driver: JDBC ODBC Bridge
URL: jdbc:odbc:db1
으로 설정하고 연결하면 /tmp/db1.db sqlite3 파일을 사용할 수 있다.

happy hackin'
sqlite3 backend로 clsql을 쓸때 다음과 같은 에러가 나는 경우가 있다.
"Error 21 / library routine called out of sequence"
기본적으로 라이브러리를 잘못 사용하고 있다는 말인데, 현재 상황에 비추어 검색한 결과 thread safe 문제인듯했다. 아래 참고 링크에서 SQLite 사이트의 FAQ를 인용해 놓은 것을 보면,
It is never safe to use the same sqlite3 structure pointer in two or more threads.
라고 되어 있으나 현재의 FAQ에서는 찾아 볼 수 없다 (FAQ.6에 비슷한 말이 나온다. sqlite 3.3.1이전 버전은 sqlite3 structure를 같은 thread에서만 열어야하며 thread safe를 위해서는 3.3.1 이후 버전을 SQLITE_THREADSAFE = 1로 설정하고 컴파일을 해야만한다. 아쉽게도 dapper에 깔리는 sqlite3는 버전이 3.2.8-1ubuntu1로 좀 낮다).
개발 중인 프로그램이 multithread인데 이전 버전들(sbcl 1:0.9.14.0-2 + cl-sql 3.6.3-1 on edgy)의 조합에서는 나타나지 않던 문제였으나 얼마전 내가 만든 backport들 (sbcl 1.0 + cl-sql 3.7.8 on dapper)의 조합에서는 나타났다.

DB 연결부분을 다음과 같이 기존 연결이 있을 때는 경고를 내고 그것을 재사용하도록 한 것이 문제일 수도 있겠지만, 문제의 여지를 남겨두기 싫어서 필요할 때마다 연결하고 끊는 매크로를 사용하고, thread간에는 mutex를 사용해서 동기화 해버렸다.
(clsql:connect (list *db-file*) :database-type +DB-TYPE+ :if-exists :warn-old)

(기존 연결 재사용은  thread safe 버전의 sqlite3를 사용하면 간단히 해결될 수도 있을 것같다.)

참고:
http://trac.edgewall.org/ticket/2196

happy hackin'

1 
분류 전체보기 (306)
잡담 (20)
함수형 언어 (65)
emacs (16)
java (18)
tips & tricks (154)
사랑 (1)
가사 (0)
독서 (4)
mobile (6)
비함수형 언어 (2)

공지사항

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

04-30 13:37