Concurrent Clean : SQLite3

SQLite3を使おうと思ってひさしぶりに試してみたら、バインド変数のところが正しく動作していないことに気づいて修正中。ていうか、エラーになる原因が全然分からないのですが・・・

      • -

エラーメッセージの一覧に抜けがあったらしい。
不足しているものを補ったら原因が分かった。
sql_bind_*関数のインデックスは 1 ベースだったらしい・・・

      • -

もう一つ、どうにも分からないエラーがあったのだけれど、ようやく分かった。
SQL文の最後に'\0'が付いていたのだけれど、これをSQL文に含めるとエラーになることがあるみたい。文字列の長さの指定を1文字少なくしたら、エラーが起きなくなった。

      • -

なんか、"datatime('now')"が変な時間になるのだけれど・・・

5874656-12-17 -596:-31:-23

という時刻になる。

      • -

date.cというファイルにdatetime()のソースがあるので、それを追いかけることにした。

      • -

os_unix.cで、sqlite3UnixCurrentTime()という関数があって、

int sqlite3UnixCurrentTime(double *prNow){
#ifdef NO_GETTOD
  time_t t;
  time(&t);
  *prNow = t/86400.0 + 2440587.5;
#else
  struct timeval sNow;
  struct timezone sTz;  /* Not used */
  gettimeofday(&sNow, &sTz);
  *prNow = 2440587.5 + sNow.tv_sec/86400.0 + sNow.tv_usec/86400000000.0;
#endif
#ifdef SQLITE_TEST
  if( sqlite3_current_time ){
    *prNow = sqlite3_current_time/86400.0 + 2440587.5;
  }
#endif
  return 0;
}

となっていたのだけれど、gettimeofday()を使っていると正しくない結果になっていたようで、

gcc -DNO_GETTOD -c os_unix.c

としてリコンパイルしたら正しく動作するようになった。