I know that AsyncIO is now superseded by WAL [1], but according to
Richard it should still work for existing applications [2].

However, I experience the opposite.

The small C application below runs well when linked against SQLite
3.7.14. With SQLite 3.7.15, it mysteriously fails. I see two types of
outcomes:

1. Error SQLITE_IOERR, followed by SQLITE_ERROR. Nothing is written to
the target database.

2. No errors, but nothing is written to the target database.

Both which happen randomly with no obvious pattern. Could this hint at a
missing memory initialization or overrun?

Even though AsyncIO is no longer actively maintained, can anyone
reproduce my findings? I am running on Windows and have limited testing
capabilities like no Valgrind, etc.

Ralf

[1] http://www.sqlite.org/src/info/3d548db7eb
[2] http://www.mail-archive.com/sqlite-users@sqlite.org/msg74170.html

----------------

#include <stdio.h>
#include <tchar.h>

#include <windows.h>

#include "sqlite3.h"
#include "sqlite3async.h"

#pragma hdrstop

sqlite3 *db;

void sqlite3_check(int e) {
  if (e != SQLITE_OK) {
        printf("Error %d\n", e);
  }
}

#ifdef SQLITE_ENABLE_ASYNCIO

int StopThread = 0;

DWORD WINAPI MyThreadFunction( LPVOID lpParam )
{
  do {
        printf ("sqlite3async_run() ...");
        sqlite3async_run();
        sqlite3_sleep (0);
        printf ("OK\n");
  }
  while (!StopThread);

  return 0;
}

#endif /* SQLITE_ENABLE_ASYNCIO */

char* FILE_NAME = "test.db3";


int main(int argc, _TCHAR* argv[])
{
  int i;
  #ifdef SQLITE_ENABLE_ASYNCIO
  HANDLE  ThreadHandle;
  #endif /* SQLITE_ENABLE_ASYNCIO */

  if (!DeleteFile(FILE_NAME)) {
        printf("Error deleting file %s\n", FILE_NAME);
  }

  #ifdef SQLITE_ENABLE_ASYNCIO
  sqlite3_check(sqlite3async_initialize(NULL, 1));
  sqlite3async_control(SQLITEASYNC_HALT, SQLITEASYNC_HALT_IDLE);

  ThreadHandle = CreateThread(
        NULL,                   // default security attributes
        0,                      // use default stack size
        MyThreadFunction,       // thread function name
        NULL,                   // argument to thread function
        0,                      // use default creation flags
        NULL);                  // returns the thread identifier
  #endif /* SQLITE_ENABLE_ASYNCIO */

  sqlite3_check(sqlite3_open_v2 (FILE_NAME, &db,
        SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL));
  sqlite3_check(sqlite3_exec(db, "create table if not exists t (a)",
        NULL, NULL, NULL));

  for (i = 0; i < 10; i++) {
        char *s = sqlite3_mprintf("insert into t values (%d);", i);
    sqlite3_check(sqlite3_exec(db, s, NULL, NULL, NULL));
    sqlite3_free(s);
  }

  sqlite3_check(sqlite3_close(db));

  #ifdef SQLITE_ENABLE_ASYNCIO
  StopThread = 1;
  WaitForSingleObject(ThreadHandle, INFINITE);

  CloseHandle(ThreadHandle);
  sqlite3async_shutdown();
  #endif /* SQLITE_ENABLE_ASYNCIO */

  printf("Done.\nPress enter a number to quit.\n");
  scanf("%d", &i);
  return 0;
}
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to