D言語でSQLite触ってみる。

あけましておめでとうございます。
今年も何卒、よろしくお願いいたします。


新年初書きです。
あまりにもスローペース^^




さて本題。
D言語でちまちまpixiv用ツールを作りまして。
指定したユーザー(複数指定可)が投稿した画像を全てDLするという
なんとサーバーに負担の掛かるプログラム…


一度だけ公開したんだけど、とんでもミスを見つけて即消去。
(ソースにIDとパスを直書きしてたから、リクエストが全部僕のIDで付いてしまう。)


その部分を修正(ユーザー側へ入力を求める仕様へ)して、
とりあえず自己満足は出来たので、次のステップに向かうためにSQLiteを触ってみる。


皆さんお馴染みのdsource.org、この中に幾つか
SQLiteのポーティングがあるようなのですが、なんだかどれも微妙に更新されてない。
(最新SQLite3.6.9に対して3.5.1までしか対応していないとか・・・)


なんだかそれも微妙なので、自分で最新版対応を作ってみるテスト。




1、まずSQLite公式から、
  『sqlitedll-3_6_9.zip』『sqlite-source-3_6_9.zip』
  を落として解凍。


2、"sqlite3.dll"、"sqlite3.def"、"swlite3.h"以外は破棄。
  ↑3つを[sqlite3-d]というフォルダを作ってその中に入れる。


3、dsource.orgの
  http://www.dsource.org/projects/bindings/browser/trunk/sqlite3-d
  から、『sqlite3.d』を落とし、[sqlite3-d]フォルダに入れる。


4、"sqlite3.h"を見ながら、"sqlite3.d"を書き換える。
  (ここがミソ?自分でも上手く出来てるか分からない。)


5、implibを使って、"sqlite3.dll"から"sqlite3.lib"を作る。
  ( C:\~~~\sqlite3-d>implib /system sqlite3.lib sqlite3.dll )


6、↓のようなソースを準備。

 //main.d
 import std.stdio;
 import sqlite3;

 int main( string[] args ) {
   sqlite3* db;
   int check = sqlite3_open( "hoge.db", &db);

   if( SQLITE_OK==check)
     writefln("Success!");
   else
     writefln("Faild!");

  sqlite3_close(db);

  return 0;
 }

7、"sqlite3.dll"を"main.d"と同じフォルダにコピーして、
  それからコンパイル
  ( ex. C:\~~~\>dmd main.d -I../../sqlite3-d ../../sqlite3-d/sqlite3.lib )


8、出来たexeを実行して、"Success!"の文字と共に
  同フォルダ内に"hoge.db"が出来てれば成功!



こんな感じでした。
忘れない内にメモしておくだけなので、間違っている可能性大。
これから使ってみて検証しようと思う。

あ、もし 欲しい方 or 修正してくれる方 、いらっしゃいましたら連絡ください。
コメント全削除したsqlite3.dとその他一式プレゼントします


2009/01/15 10:17 若干修正


2012/05/07 06:41 追記修正
もう3年も前の記事なのに某所に URLとか貼られてるの見かけてしまったので…。
この記事書いた時のソースは紛失してしまったので
どんな書き方したか覚えてないのですが、
http://www.kmonos.net/alang/d/2.0/interfaceToC.html
に書いてある事に気をつけながら sqlite3.d編集していけばどうにか使える筈。
もしくは
http://www.dprogramming.com/sqlite.php
に zip落ちてるからそれ使ってみるとか…
(これに関しては触ってないので何とも言えませんが


特に気をつけなければならない事と言ったら、
D言語の文字列は NULL終端付いてないから
SQLite側に渡す時には加工してやらないといけない事。
後はいつの更新だったか、 Dの stringは immutable(char)[]になってるので
http://www.kmonos.net/alang/d/2.0/arrays.html
の一番下、文字列の所読んでおくと Cとの連携で詰まる所減らせるかも。