<HTML>
<HEAD>
<!-- GENERATED WITH OPTION "USE_OLD_HTML_INSTEAD_OF_VALID_XHTML_1.1" -->
<TITLE>C++ code colored by C++2HTML</TITLE>
<META NAME="generator" CONTENT="C++2HTML by Jasper Bedaux">
<!-- To generate your own colored code visit http://www.bedaux.net/cpp2html/ -->
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<PRE><I><FONT COLOR="#009900"> /***************************************************/
/** SQLITE 3 Thread Test Program **/
/** by Marcus Grimm **/
/** mgrimm<at>medcom-online.de **/
/***************************************************/
/** This program basically simulates a server **/
/** that opens multible DB connections that are **/
/** within multible threads. Each thread uses **/
/** his dedicated DB pointer. **/
/** The reader threads only parse some data of **/
/** some tables. **/
/** The write threads updates or inserts new data **/
/** in some tables randomly. **/
/** All writes into the DB are covered with **/
/** an exclusive transaction to lock the reader **/
/** threads and/or other writer threads **/
/** I don't use busy callback or busy timeout **/
/** settings here, since I do the busy handling **/
/** 'manually'. However, my handling here should **/
/** equivalent to what sqlite would do with its **/
/** internal busy handlers. **/
/***************************************************/</FONT></I><FONT COLOR="#000099">
#include <windows.h>
#include <stdio.h>
#include <time.h>
#include <process.h>
#include "sqlite3.h"
</FONT><I><FONT COLOR="#009900">
/** sqlite DB Filename **/</FONT></I><FONT COLOR="#000099">
#define DBFILENAME "C:\\testdb.db"
#define MAX_OPENDBS 10 /** Total number of open DB == number of running threads **/
#define NUM_WRITE_THREADS 2 /** Number of running writing threads. **/
</FONT><I><FONT COLOR="#009900">
/** DB Connection pool **/</FONT></I>
sqlite3<B><FONT COLOR="#663300"> *</FONT></B>DBPool<B><FONT COLOR="#663300">[</FONT></B>MAX_OPENDBS<B><FONT COLOR="#663300">];</FONT></B><I><FONT COLOR="#009900"> /** used within the threads **/</FONT></I>
sqlite3<B><FONT COLOR="#663300"> *</FONT></B>MainDB<B><FONT COLOR="#663300"> =</FONT></B> NULL<B><FONT COLOR="#663300">;</FONT></B><I><FONT COLOR="#009900"> /** used by main process only. **/
/** To have clear fprintfs in threads we use a lock for this **/</FONT></I>
CRITICAL_SECTION stderr_lock<B><FONT COLOR="#663300">;</FONT></B><FONT COLOR="#FF6633">
int</FONT> global_run<B><FONT COLOR="#663300">;</FONT></B><FONT COLOR="#FF6633">
int</FONT> global_sql_error<B><FONT COLOR="#663300"> =</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">;</FONT></B><I><FONT COLOR="#009900">
/** Timeout values on busy or lock conditions **/
/** if you observe lock errors you might try to **/
/** increase the values. **/</FONT></I><FONT COLOR="#000099">
#define SQLTM_COUNT 200 /** -> SQLTM_COUNT*SQLTM_TIME ms timeout **/
#define SQLTM_TIME 50
</FONT><I><FONT COLOR="#009900">
/******************************************************/
/** PrepareSql: **/
/** This encapsulates sqlite prepare call to handle **/
/** timeout condition. **/
/******************************************************/</FONT></I><FONT COLOR="#FF6633">
int</FONT> PrepareSql<B><FONT COLOR="#663300">(</FONT></B>sqlite3<B><FONT COLOR="#663300"> *</FONT></B>db<B><FONT COLOR="#663300">,</FONT></B> sqlite3_stmt<B><FONT COLOR="#663300"> **</FONT></B>hs<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#FF6633"> char</FONT><B><FONT COLOR="#663300"> *</FONT></B>SqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#FF6633"> int</FONT> handle<B><FONT COLOR="#663300">)
{</FONT></B><FONT COLOR="#FF6633">
int</FONT> n<B><FONT COLOR="#663300">,</FONT></B> rc<B><FONT COLOR="#663300">;</FONT></B>
n<B><FONT COLOR="#663300"> =</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">;</FONT></B><FONT COLOR="#FF0000">
do</FONT><B><FONT COLOR="#663300">
{</FONT></B>
rc<B><FONT COLOR="#663300"> =</FONT></B> sqlite3_prepare_v2<B><FONT COLOR="#663300">(</FONT></B>db<B><FONT COLOR="#663300">,</FONT></B> SqlStr<B><FONT COLOR="#663300">, -</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">,</FONT></B> hs<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">( (</FONT></B>rc<B><FONT COLOR="#663300"> ==</FONT></B> SQLITE_BUSY<B><FONT COLOR="#663300">) || (</FONT></B>rc<B><FONT COLOR="#663300"> ==</FONT></B> SQLITE_LOCKED<B><FONT COLOR="#663300">) )
{</FONT></B>
n<B><FONT COLOR="#663300">++;</FONT></B>
Sleep<B><FONT COLOR="#663300">(</FONT></B>SQLTM_TIME<B><FONT COLOR="#663300">);
}
}</FONT></B><FONT COLOR="#FF0000">while</FONT><B><FONT COLOR="#663300">( (</FONT></B>n<B><FONT COLOR="#663300"> <</FONT></B> SQLTM_COUNT<B><FONT COLOR="#663300">) && ((</FONT></B>rc<B><FONT COLOR="#663300"> ==</FONT></B> SQLITE_BUSY<B><FONT COLOR="#663300">) || (</FONT></B>rc<B><FONT COLOR="#663300"> ==</FONT></B> SQLITE_LOCKED<B><FONT COLOR="#663300">)));</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> rc<B><FONT COLOR="#663300"> !=</FONT></B> SQLITE_OK<B><FONT COLOR="#663300">)
{</FONT></B>
EnterCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "SqlPrepare-Error-H(%d): (%d) %s \n"</FONT><B><FONT COLOR="#663300">,</FONT></B> handle<B><FONT COLOR="#663300">,</FONT></B> rc<B><FONT COLOR="#663300">,</FONT></B> sqlite3_errmsg<B><FONT COLOR="#663300">(</FONT></B>db<B><FONT COLOR="#663300">));</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Statement: %s \n"</FONT><B><FONT COLOR="#663300">,</FONT></B> SqlStr<B><FONT COLOR="#663300">);</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">);
}</FONT></B><I><FONT COLOR="#009900">
/******************************************************/
/** StepSql: **/
/** This encapsulates sqlite step call to handle **/
/** timeout condition. **/
/******************************************************/</FONT></I><FONT COLOR="#FF6633">
int</FONT> StepSql<B><FONT COLOR="#663300">(</FONT></B>sqlite3_stmt<B><FONT COLOR="#663300"> *</FONT></B>hs<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#FF6633"> int</FONT> handle<B><FONT COLOR="#663300">)
{</FONT></B><FONT COLOR="#FF6633">
int</FONT> rc<B><FONT COLOR="#663300">,</FONT></B> n<B><FONT COLOR="#663300">;</FONT></B>
n<B><FONT COLOR="#663300"> =</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">;</FONT></B><FONT COLOR="#FF0000">
do</FONT><B><FONT COLOR="#663300">
{</FONT></B>
rc<B><FONT COLOR="#663300"> =</FONT></B> sqlite3_step<B><FONT COLOR="#663300">(</FONT></B>hs<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> rc<B><FONT COLOR="#663300"> ==</FONT></B> SQLITE_LOCKED<B><FONT COLOR="#663300"> )
{</FONT></B>
rc<B><FONT COLOR="#663300"> =</FONT></B> sqlite3_reset<B><FONT COLOR="#663300">(</FONT></B>hs<B><FONT COLOR="#663300">);</FONT></B><I><FONT COLOR="#009900"> /** Note: This will return SQLITE_LOCKED as well... **/</FONT></I>
n<B><FONT COLOR="#663300">++;</FONT></B>
Sleep<B><FONT COLOR="#663300">(</FONT></B>SQLTM_TIME<B><FONT COLOR="#663300">);
}</FONT></B><FONT COLOR="#FF0000">
else
if</FONT><B><FONT COLOR="#663300">( (</FONT></B>rc<B><FONT COLOR="#663300"> ==</FONT></B> SQLITE_BUSY<B><FONT COLOR="#663300">) )
{</FONT></B>
Sleep<B><FONT COLOR="#663300">(</FONT></B>SQLTM_TIME<B><FONT COLOR="#663300">);</FONT></B>
n<B><FONT COLOR="#663300">++;
}
}</FONT></B><FONT COLOR="#FF0000">while</FONT><B><FONT COLOR="#663300">( (</FONT></B>n<B><FONT COLOR="#663300"> <</FONT></B> SQLTM_COUNT<B><FONT COLOR="#663300">) && ((</FONT></B>rc<B><FONT COLOR="#663300"> ==</FONT></B> SQLITE_BUSY<B><FONT COLOR="#663300">) || (</FONT></B>rc<B><FONT COLOR="#663300"> ==</FONT></B> SQLITE_LOCKED<B><FONT COLOR="#663300">)));</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> n<B><FONT COLOR="#663300"> ==</FONT></B> SQLTM_COUNT<B><FONT COLOR="#663300"> )
{</FONT></B>
EnterCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "SqlStep Timeout on handle: %d (rc = %d)\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> handle<B><FONT COLOR="#663300">,</FONT></B> rc<B><FONT COLOR="#663300">);</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);
}</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> n<B><FONT COLOR="#663300"> ></FONT></B><FONT COLOR="#999900"> 2</FONT><B><FONT COLOR="#663300"> )
{</FONT></B>
EnterCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "SqlStep tries on handle %d: %d\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> handle<B><FONT COLOR="#663300">,</FONT></B> n<B><FONT COLOR="#663300">);</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);
}</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> rc<B><FONT COLOR="#663300"> ==</FONT></B> SQLITE_MISUSE<B><FONT COLOR="#663300"> )
{</FONT></B>
EnterCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "sqlite3_step missuse ?? on handle %d\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> handle<B><FONT COLOR="#663300">);</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);
}</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B>rc<B><FONT COLOR="#663300">);
}</FONT></B><I><FONT COLOR="#009900">
/** This generates an exclusive transaction. Used to block all other **/
/** from writing operations. **/</FONT></I><FONT COLOR="#FF6633">
int</FONT> BeginTrans<B><FONT COLOR="#663300">(</FONT></B>sqlite3<B><FONT COLOR="#663300"> *</FONT></B>DB<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#FF6633"> int</FONT> handle<B><FONT COLOR="#663300">)
{</FONT></B><FONT COLOR="#FF6633">
int</FONT> rc<B><FONT COLOR="#663300">;</FONT></B>
sqlite3_stmt<B><FONT COLOR="#663300"> *</FONT></B>bt_stmt<B><FONT COLOR="#663300">;</FONT></B>
bt_stmt<B><FONT COLOR="#663300"> =</FONT></B> NULL<B><FONT COLOR="#663300">;</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> DB<B><FONT COLOR="#663300"> ==</FONT></B> NULL<B><FONT COLOR="#663300"> )
{</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Sql: BeginTrans: No DB connection!\n"</FONT><B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">( !</FONT></B>PrepareSql<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">, &</FONT></B>bt_stmt<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "BEGIN EXCLUSIVE TRANSACTION;"</FONT><B><FONT COLOR="#663300">,</FONT></B> handle<B><FONT COLOR="#663300">) )
{</FONT></B>
EnterCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Begin Transaction error on handle: %d\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> handle<B><FONT COLOR="#663300">);</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}</FONT></B>
rc<B><FONT COLOR="#663300"> =</FONT></B> StepSql<B><FONT COLOR="#663300">(</FONT></B>bt_stmt<B><FONT COLOR="#663300">,</FONT></B> handle<B><FONT COLOR="#663300">);</FONT></B>
sqlite3_finalize<B><FONT COLOR="#663300">(</FONT></B>bt_stmt<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> rc<B><FONT COLOR="#663300"> !=</FONT></B> SQLITE_DONE<B><FONT COLOR="#663300"> )
{</FONT></B>
EnterCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "BeginTrans Timeout/Error on handle: %d, Errorcode = %d \n"</FONT><B><FONT COLOR="#663300">,</FONT></B> handle<B><FONT COLOR="#663300">,</FONT></B> rc<B><FONT COLOR="#663300">);</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">);
}</FONT></B><I><FONT COLOR="#009900">
/** This ends the exclusive transaction... **/</FONT></I><FONT COLOR="#FF6633">
int</FONT> EndTrans<B><FONT COLOR="#663300">(</FONT></B>sqlite3<B><FONT COLOR="#663300"> *</FONT></B>DB<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#FF6633"> int</FONT> handle<B><FONT COLOR="#663300">)
{</FONT></B><FONT COLOR="#FF6633">
int</FONT> rc<B><FONT COLOR="#663300">;</FONT></B>
sqlite3_stmt<B><FONT COLOR="#663300"> *</FONT></B>bt_stmt<B><FONT COLOR="#663300">;</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> DB<B><FONT COLOR="#663300"> ==</FONT></B> NULL<B><FONT COLOR="#663300"> )
{</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Sql: EndTrans: No DB connection!\n"</FONT><B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">( !</FONT></B>PrepareSql<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">, &</FONT></B>bt_stmt<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "COMMIT;"</FONT><B><FONT COLOR="#663300">,</FONT></B> handle<B><FONT COLOR="#663300">) )
{</FONT></B>
EnterCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "EndTransaction prepare failed/timeout on handle %d\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> handle<B><FONT COLOR="#663300">);</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}</FONT></B>
rc<B><FONT COLOR="#663300"> =</FONT></B> StepSql<B><FONT COLOR="#663300">(</FONT></B>bt_stmt<B><FONT COLOR="#663300">,</FONT></B> handle<B><FONT COLOR="#663300">);</FONT></B>
sqlite3_finalize<B><FONT COLOR="#663300">(</FONT></B>bt_stmt<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> rc<B><FONT COLOR="#663300"> !=</FONT></B> SQLITE_DONE<B><FONT COLOR="#663300"> )
{</FONT></B>
EnterCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "EndTrans Step Timeout on handle %d (code = %d) \n"</FONT><B><FONT COLOR="#663300">,</FONT></B> handle<B><FONT COLOR="#663300">,</FONT></B> rc<B><FONT COLOR="#663300">);</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">);
}</FONT></B><I><FONT COLOR="#009900">
/*** Creates tables in test DB **/</FONT></I><FONT COLOR="#FF6633">
int</FONT> CreateTestDB<B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#FF6633">char</FONT><B><FONT COLOR="#663300"> *</FONT></B>DBFileName<B><FONT COLOR="#663300">)
{</FONT></B>
sqlite3_stmt<B><FONT COLOR="#663300"> *</FONT></B>stmt<B><FONT COLOR="#663300">;</FONT></B><FONT COLOR="#FF6633">
char</FONT> sqlStr<B><FONT COLOR="#663300">[</FONT></B><FONT COLOR="#999900">1024</FONT><B><FONT COLOR="#663300">];</FONT></B><FONT COLOR="#FF6633">
int</FONT> rc<B><FONT COLOR="#663300">;</FONT></B>
rc<B><FONT COLOR="#663300"> =</FONT></B> sqlite3_open_v2<B><FONT COLOR="#663300">(</FONT></B>DBFileName<B><FONT COLOR="#663300">, &</FONT></B>MainDB<B><FONT COLOR="#663300">,</FONT></B> SQLITE_OPEN_READWRITE<B><FONT COLOR="#663300">|</FONT></B>SQLITE_OPEN_CREATE<B><FONT COLOR="#663300">,</FONT></B> NULL<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> rc<B><FONT COLOR="#663300"> )
{</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Can't create database: %s\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> DBFileName<B><FONT COLOR="#663300">);</FONT></B>
sqlite3_close<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">);</FONT></B>
MainDB<B><FONT COLOR="#663300"> =</FONT></B> NULL<B><FONT COLOR="#663300">;</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Start creating database...\n"</FONT><B><FONT COLOR="#663300">);</FONT></B><I><FONT COLOR="#009900">
/** Change default page size **/</FONT></I>
strcpy<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"PRAGMA page_size = 2048;"</FONT><B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300"> (</FONT></B>SQLITE_OK<B><FONT COLOR="#663300"> !=</FONT></B> sqlite3_prepare_v2<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">,</FONT></B> sqlStr<B><FONT COLOR="#663300">, -</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">, &</FONT></B>stmt<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">))
{</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "prepare error: %s"</FONT><B><FONT COLOR="#663300">,</FONT></B> sqlite3_errmsg<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">));
}</FONT></B><FONT COLOR="#FF0000">
else</FONT><B><FONT COLOR="#663300">
{</FONT></B>
rc<B><FONT COLOR="#663300"> =</FONT></B> sqlite3_step<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> rc<B><FONT COLOR="#663300"> !=</FONT></B> SQLITE_DONE<B><FONT COLOR="#663300"> )
{</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "step error (%d): %s"</FONT><B><FONT COLOR="#663300">,</FONT></B> rc<B><FONT COLOR="#663300">,</FONT></B> sqlite3_errmsg<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">));</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}
}</FONT></B>
sqlite3_finalize<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">);</FONT></B><I><FONT COLOR="#009900">
/** Change default cache size **/</FONT></I>
strcpy<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"PRAGMA default_cache_size = 10000;"</FONT><B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300"> (</FONT></B>SQLITE_OK<B><FONT COLOR="#663300"> !=</FONT></B> sqlite3_prepare_v2<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">,</FONT></B> sqlStr<B><FONT COLOR="#663300">, -</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">, &</FONT></B>stmt<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">))
{</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "prepare error: %s"</FONT><B><FONT COLOR="#663300">,</FONT></B> sqlite3_errmsg<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">));
}</FONT></B><FONT COLOR="#FF0000">
else</FONT><B><FONT COLOR="#663300">
{</FONT></B>
rc<B><FONT COLOR="#663300"> =</FONT></B> sqlite3_step<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> rc<B><FONT COLOR="#663300"> !=</FONT></B> SQLITE_DONE<B><FONT COLOR="#663300"> )
{</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "step error (%d): %s"</FONT><B><FONT COLOR="#663300">,</FONT></B> rc<B><FONT COLOR="#663300">,</FONT></B> sqlite3_errmsg<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">));</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}
}</FONT></B>
sqlite3_finalize<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">);</FONT></B><I><FONT COLOR="#009900">
/** Create Test Tables: **/
/** 1. Main Table **/</FONT></I>
strcpy<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"CREATE TABLE Main ("</FONT><B><FONT COLOR="#663300">);</FONT></B>
strcat<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"ID INTEGER PRIMARY KEY AUTOINCREMENT,"</FONT><B><FONT COLOR="#663300">);</FONT></B>
strcat<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"Name1 VARCHAR(50) COLLATE NOCASE,"</FONT><B><FONT COLOR="#663300">);</FONT></B>
strcat<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"Name2 VARCHAR(128) COLLATE NOCASE,"</FONT><B><FONT COLOR="#663300">);</FONT></B>
strcat<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"Comment VARCHAR(250),"</FONT><B><FONT COLOR="#663300">);</FONT></B>
strcat<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"Property INTEGER,"</FONT><B><FONT COLOR="#663300">);</FONT></B>
strcat<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"Field INTEGER);"</FONT><B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300"> (</FONT></B>SQLITE_OK<B><FONT COLOR="#663300"> !=</FONT></B> sqlite3_prepare_v2<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">,</FONT></B> sqlStr<B><FONT COLOR="#663300">, -</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">, &</FONT></B>stmt<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">)) {</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "prepare error: %s"</FONT><B><FONT COLOR="#663300">,</FONT></B> sqlite3_errmsg<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">));
}</FONT></B><FONT COLOR="#FF0000"> else</FONT><B><FONT COLOR="#663300">
{</FONT></B>
rc<B><FONT COLOR="#663300"> =</FONT></B> sqlite3_step<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> rc<B><FONT COLOR="#663300"> !=</FONT></B> SQLITE_DONE<B><FONT COLOR="#663300"> )
{</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "step error (%d): %s"</FONT><B><FONT COLOR="#663300">,</FONT></B> rc<B><FONT COLOR="#663300">,</FONT></B> sqlite3_errmsg<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">));</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}
}</FONT></B>
sqlite3_finalize<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">);</FONT></B><I><FONT COLOR="#009900">
/** Data Table **/</FONT></I>
strcpy<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"CREATE TABLE Daten ("</FONT><B><FONT COLOR="#663300">);</FONT></B>
strcat<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"ID INTEGER PRIMARY KEY AUTOINCREMENT,"</FONT><B><FONT COLOR="#663300">);</FONT></B>
strcat<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"Typ INTEGER,"</FONT><B><FONT COLOR="#663300">);</FONT></B>
strcat<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"ParentID INTEGER,"</FONT><B><FONT COLOR="#663300">);</FONT></B>
strcat<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"FieldA VARCHAR(16),"</FONT><B><FONT COLOR="#663300">);</FONT></B>
strcat<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"FieldB VARCHAR(500),"</FONT><B><FONT COLOR="#663300">);</FONT></B>
strcat<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"MainID INTEGER,"</FONT><B><FONT COLOR="#663300">);</FONT></B>
strcat<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"PropertyMask INTEGER,"</FONT><B><FONT COLOR="#663300">);</FONT></B>
strcat<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"FieldC VARCHAR(128),"</FONT><B><FONT COLOR="#663300">);</FONT></B>
strcat<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"FieldD VARCHAR(128),"</FONT><B><FONT COLOR="#663300">);</FONT></B>
strcat<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"TypeNumber INTEGER,"</FONT><B><FONT COLOR="#663300">);</FONT></B>
strcat<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"FieldE VARCHAR(128));"</FONT><B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300"> (</FONT></B>SQLITE_OK<B><FONT COLOR="#663300"> !=</FONT></B> sqlite3_prepare_v2<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">,</FONT></B> sqlStr<B><FONT COLOR="#663300">, -</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">, &</FONT></B>stmt<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">))
{</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "prepare error: %s\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> sqlite3_errmsg<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">));
}</FONT></B><FONT COLOR="#FF0000">
else</FONT><B><FONT COLOR="#663300">
{</FONT></B>
rc<B><FONT COLOR="#663300"> =</FONT></B> sqlite3_step<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> rc<B><FONT COLOR="#663300"> !=</FONT></B> SQLITE_DONE<B><FONT COLOR="#663300"> )
{</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "step error (%d): %s\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> rc<B><FONT COLOR="#663300">,</FONT></B> sqlite3_errmsg<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">));</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}
}</FONT></B>
sqlite3_finalize<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">);</FONT></B><I><FONT COLOR="#009900">
/** Create index table on Main ID **/</FONT></I><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300"> (</FONT></B>SQLITE_OK<B><FONT COLOR="#663300"> !=</FONT></B> sqlite3_prepare_v2<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "CREATE INDEX DatIndexMain ON Daten(MainID);"</FONT><B><FONT COLOR="#663300">, -</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">, &</FONT></B>stmt<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">))
{</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "prepare error: %s"</FONT><B><FONT COLOR="#663300">,</FONT></B> sqlite3_errmsg<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">));
}</FONT></B><FONT COLOR="#FF0000">
else</FONT><B><FONT COLOR="#663300">
{</FONT></B>
rc<B><FONT COLOR="#663300"> =</FONT></B> sqlite3_step<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> rc<B><FONT COLOR="#663300"> !=</FONT></B> SQLITE_DONE<B><FONT COLOR="#663300"> )
{</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "step error (%d): %s"</FONT><B><FONT COLOR="#663300">,</FONT></B> rc<B><FONT COLOR="#663300">,</FONT></B> sqlite3_errmsg<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">));</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}
}</FONT></B>
sqlite3_finalize<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">);</FONT></B><I><FONT COLOR="#009900">
/** Type Numbers Table **/</FONT></I>
strcpy<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"CREATE TABLE TypeNumbers ("</FONT><B><FONT COLOR="#663300">);</FONT></B>
strcat<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"ID INTEGER PRIMARY KEY AUTOINCREMENT,"</FONT><B><FONT COLOR="#663300">);</FONT></B>
strcat<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"MainID INTEGER,"</FONT><B><FONT COLOR="#663300">);</FONT></B>
strcat<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"Type INTEGER,"</FONT><B><FONT COLOR="#663300">);</FONT></B>
strcat<B><FONT COLOR="#663300">(</FONT></B>sqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000">"CurrentNumber INTEGER);"</FONT><B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300"> (</FONT></B>SQLITE_OK<B><FONT COLOR="#663300"> !=</FONT></B> sqlite3_prepare_v2<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">,</FONT></B> sqlStr<B><FONT COLOR="#663300">, -</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">, &</FONT></B>stmt<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">))
{</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "prepare error: %s\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> sqlite3_errmsg<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">));
}</FONT></B><FONT COLOR="#FF0000"> else</FONT><B><FONT COLOR="#663300">
{</FONT></B>
rc<B><FONT COLOR="#663300"> =</FONT></B> sqlite3_step<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> rc<B><FONT COLOR="#663300"> !=</FONT></B> SQLITE_DONE<B><FONT COLOR="#663300"> )
{</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "step error (%d): %s\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> rc<B><FONT COLOR="#663300">,</FONT></B> sqlite3_errmsg<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">));</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}
}</FONT></B>
sqlite3_finalize<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">);</FONT></B><I><FONT COLOR="#009900">
/** Create index table on Dicom Studies ID **/</FONT></I><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300"> (</FONT></B>SQLITE_OK<B><FONT COLOR="#663300"> !=</FONT></B> sqlite3_prepare_v2<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "CREATE INDEX MainIndexTypeNum ON TypeNumbers(MainID);"</FONT><B><FONT COLOR="#663300">, -</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">, &</FONT></B>stmt<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">))
{</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "prepare error: %s"</FONT><B><FONT COLOR="#663300">,</FONT></B> sqlite3_errmsg<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">));
}</FONT></B><FONT COLOR="#FF0000">
else</FONT><B><FONT COLOR="#663300">
{</FONT></B>
rc<B><FONT COLOR="#663300"> =</FONT></B> sqlite3_step<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> rc<B><FONT COLOR="#663300"> !=</FONT></B> SQLITE_DONE<B><FONT COLOR="#663300"> )
{</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "step error (%d): %s"</FONT><B><FONT COLOR="#663300">,</FONT></B> rc<B><FONT COLOR="#663300">,</FONT></B> sqlite3_errmsg<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">));</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}
}</FONT></B>
sqlite3_finalize<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">);
}</FONT></B><I><FONT COLOR="#009900">
/** This fills the test DB with some data **/</FONT></I><FONT COLOR="#000099">
#define MAINTBL_ENTRIES 10000
#define DATATBL_ENTRIES 20 /** Number of entries in each main table entry **/
</FONT><FONT COLOR="#FF6633">
int</FONT> FillTestDB<B><FONT COLOR="#663300">(</FONT></B>sqlite3<B><FONT COLOR="#663300"> *</FONT></B>DB<B><FONT COLOR="#663300">)
{</FONT></B><FONT COLOR="#FF6633">
char</FONT> SqlStr<B><FONT COLOR="#663300">[</FONT></B><FONT COLOR="#999900">512</FONT><B><FONT COLOR="#663300">];</FONT></B><FONT COLOR="#FF6633">
int</FONT> PrimKey<B><FONT COLOR="#663300">;</FONT></B>
sqlite3_stmt<B><FONT COLOR="#663300"> *</FONT></B>stmt<B><FONT COLOR="#663300">, *</FONT></B>stmt_read<B><FONT COLOR="#663300">;</FONT></B><FONT COLOR="#FF6633">
int</FONT> i<B><FONT COLOR="#663300">;</FONT></B>
BeginTrans<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">, -</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">);</FONT></B>
stmt<B><FONT COLOR="#663300"> =</FONT></B> NULL<B><FONT COLOR="#663300">;</FONT></B><FONT COLOR="#FF0000">
for</FONT><B><FONT COLOR="#663300">(</FONT></B>i<B><FONT COLOR="#663300">=</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">;</FONT></B> i<B><FONT COLOR="#663300"> <</FONT></B> MAINTBL_ENTRIES<B><FONT COLOR="#663300">;</FONT></B> i<B><FONT COLOR="#663300">++)
{</FONT></B>
sprintf<B><FONT COLOR="#663300">(</FONT></B>SqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "INSERT INTO Main (Name1,Name2,Comment,Property,Field) VALUES('%dSmith','John','Comment Test...', 42, 4711);"</FONT><B><FONT COLOR="#663300">,</FONT></B> i<B><FONT COLOR="#663300">);</FONT></B>
PrepareSql<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">, &</FONT></B>stmt<B><FONT COLOR="#663300">,</FONT></B> SqlStr<B><FONT COLOR="#663300">, -</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">);</FONT></B>
StepSql<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">, -</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">);</FONT></B>
sqlite3_finalize<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">);</FONT></B>
stmt<B><FONT COLOR="#663300"> =</FONT></B> NULL<B><FONT COLOR="#663300">;
}</FONT></B>
EndTrans<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">, -</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">);</FONT></B>
BeginTrans<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">, -</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">);</FONT></B><I><FONT COLOR="#009900">
/** for each entry in main: generate N data entries **/</FONT></I>
PrepareSql<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">, &</FONT></B>stmt_read<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "SELECT * FROM Main;"</FONT><B><FONT COLOR="#663300">, -</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
while</FONT><B><FONT COLOR="#663300">(</FONT></B> StepSql<B><FONT COLOR="#663300">(</FONT></B>stmt_read<B><FONT COLOR="#663300">, -</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">) ==</FONT></B> SQLITE_ROW<B><FONT COLOR="#663300"> )
{</FONT></B><I><FONT COLOR="#009900">
/** read primary key **/</FONT></I>
PrimKey<B><FONT COLOR="#663300"> =</FONT></B> sqlite3_column_int<B><FONT COLOR="#663300">(</FONT></B>stmt_read<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">);</FONT></B><I><FONT COLOR="#009900"> /** Index 0 --> ID **/</FONT></I><FONT COLOR="#FF0000">
for</FONT><B><FONT COLOR="#663300">(</FONT></B>i<B><FONT COLOR="#663300">=</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">;</FONT></B> i<B><FONT COLOR="#663300"> <</FONT></B> DATATBL_ENTRIES<B><FONT COLOR="#663300">;</FONT></B> i<B><FONT COLOR="#663300">++)
{</FONT></B><I><FONT COLOR="#009900">
/** Init Type Number table **/</FONT></I>
sprintf<B><FONT COLOR="#663300">(</FONT></B>SqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "INSERT INTO TypeNumbers (MainID,Type,CurrentNumber) VALUES(%d,%d,1);"</FONT><B><FONT COLOR="#663300">,</FONT></B> PrimKey<B><FONT COLOR="#663300">,</FONT></B> i<B><FONT COLOR="#663300">);</FONT></B>
PrepareSql<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">, &</FONT></B>stmt<B><FONT COLOR="#663300">,</FONT></B> SqlStr<B><FONT COLOR="#663300">, -</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">);</FONT></B>
StepSql<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">, -</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">);</FONT></B>
sqlite3_finalize<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">);</FONT></B>
stmt<B><FONT COLOR="#663300"> =</FONT></B> NULL<B><FONT COLOR="#663300">;</FONT></B>
sprintf<B><FONT COLOR="#663300">(</FONT></B>SqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "INSERT INTO Daten (Typ,ParentID,FieldA,FieldB,MainID,PropertyMask,FieldC,FieldD,TypeNumber,FieldE) VALUES(%d,0,'Ignore','Longer text field',%d,42,'FieldCData','FieldDData', %d, 'Longer Text...');"</FONT><B><FONT COLOR="#663300">,</FONT></B> i<B><FONT COLOR="#663300">,</FONT></B> PrimKey<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#999900"> 1</FONT><B><FONT COLOR="#663300">);</FONT></B>
PrepareSql<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">, &</FONT></B>stmt<B><FONT COLOR="#663300">,</FONT></B> SqlStr<B><FONT COLOR="#663300">, -</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">);</FONT></B>
StepSql<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">, -</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">);</FONT></B>
sqlite3_finalize<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">);</FONT></B>
stmt<B><FONT COLOR="#663300"> =</FONT></B> NULL<B><FONT COLOR="#663300">;
}
}</FONT></B>
sqlite3_finalize<B><FONT COLOR="#663300">(</FONT></B>stmt_read<B><FONT COLOR="#663300">);</FONT></B>
EndTrans<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">, -</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">);
}</FONT></B><I><FONT COLOR="#009900">
/*************************************************************/
/** THis is the reader thread... **/
/*************************************************************/</FONT></I>
DWORD WINAPI ReadThread<B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#FF6633"> int</FONT> DBHandle<B><FONT COLOR="#663300">)
{</FONT></B>
sqlite3<B><FONT COLOR="#663300"> *</FONT></B>DB<B><FONT COLOR="#663300">;</FONT></B>
sqlite3_stmt<B><FONT COLOR="#663300"> *</FONT></B>stmt<B><FONT COLOR="#663300">, *</FONT></B>stmtDaten<B><FONT COLOR="#663300">;</FONT></B><FONT COLOR="#FF6633">
char</FONT> SqlStr<B><FONT COLOR="#663300">[</FONT></B><FONT COLOR="#999900">512</FONT><B><FONT COLOR="#663300">];</FONT></B><FONT COLOR="#FF6633">
int</FONT> Index<B><FONT COLOR="#663300">,</FONT></B> PrimKey<B><FONT COLOR="#663300">,</FONT></B> DatIndex<B><FONT COLOR="#663300">;</FONT></B><FONT COLOR="#FF6633">
int</FONT> avgIndex<B><FONT COLOR="#663300">,</FONT></B> rc<B><FONT COLOR="#663300">,</FONT></B> n<B><FONT COLOR="#663300">,</FONT></B> mainSteps<B><FONT COLOR="#663300">;</FONT></B>
EnterCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Read Thread started, using DB Handle: %d\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> DBHandle<B><FONT COLOR="#663300"> <</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300"> ||</FONT></B> DBHandle<B><FONT COLOR="#663300"> ></FONT></B> MAX_OPENDBS<B><FONT COLOR="#663300"> )
{</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Error: DB Handle out of range! \n"</FONT><B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
DB<B><FONT COLOR="#663300"> =</FONT></B> DBPool<B><FONT COLOR="#663300">[</FONT></B>DBHandle<B><FONT COLOR="#663300">];</FONT></B>
stmt<B><FONT COLOR="#663300"> =</FONT></B> NULL<B><FONT COLOR="#663300">;</FONT></B>
avgIndex<B><FONT COLOR="#663300"> =</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">;</FONT></B>
mainSteps<B><FONT COLOR="#663300"> =</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">;</FONT></B><FONT COLOR="#FF0000">
while</FONT><B><FONT COLOR="#663300">(</FONT></B>global_run<B><FONT COLOR="#663300">)
{</FONT></B><I><FONT COLOR="#009900">
/** Read randomly a main table entry **/</FONT></I>
Index<B><FONT COLOR="#663300"> = (</FONT></B>rand<B><FONT COLOR="#663300">() *</FONT></B> MAINTBL_ENTRIES<B><FONT COLOR="#663300">) /</FONT></B> RAND_MAX<B><FONT COLOR="#663300">;</FONT></B>
sprintf<B><FONT COLOR="#663300">(</FONT></B>SqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "SELECT * FROM Main WHERE ID >= %u;"</FONT><B><FONT COLOR="#663300">,</FONT></B> Index<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">( !</FONT></B>PrepareSql<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">, &</FONT></B>stmt<B><FONT COLOR="#663300">,</FONT></B> SqlStr<B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">) )
{</FONT></B><I><FONT COLOR="#009900">
/** Timeout or error --> exit **/</FONT></I>
global_sql_error<B><FONT COLOR="#663300"> =</FONT></B><FONT COLOR="#999900"> 1</FONT><B><FONT COLOR="#663300">;</FONT></B>
EnterCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Read Thread PrepareSql on Main Table Error. Handle = %d\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">);</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">( (</FONT></B>rc<B><FONT COLOR="#663300"> =</FONT></B> StepSql<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">)) ==</FONT></B> SQLITE_ROW<B><FONT COLOR="#663300"> )
{</FONT></B>
PrimKey<B><FONT COLOR="#663300"> =</FONT></B> sqlite3_column_int<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">);</FONT></B><I><FONT COLOR="#009900">
/** Parse the data that refers to this Main Entry **/</FONT></I>
sprintf<B><FONT COLOR="#663300">(</FONT></B>SqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "SELECT * FROM Daten WHERE MainID = %u;"</FONT><B><FONT COLOR="#663300">,</FONT></B> PrimKey<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">( !</FONT></B>PrepareSql<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">, &</FONT></B>stmtDaten<B><FONT COLOR="#663300">,</FONT></B> SqlStr<B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">) )
{</FONT></B><I><FONT COLOR="#009900">
/** Timeout or error --> exit **/</FONT></I>
global_sql_error<B><FONT COLOR="#663300"> =</FONT></B><FONT COLOR="#999900"> 1</FONT><B><FONT COLOR="#663300">;</FONT></B>
EnterCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Read Thread Prepare from Daten Error. Handle = %d\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">);</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}</FONT></B><I><FONT COLOR="#009900">
/** Parse throu the result set **/</FONT></I>
n<B><FONT COLOR="#663300"> =</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">;</FONT></B>
avgIndex<B><FONT COLOR="#663300"> =</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">;</FONT></B><FONT COLOR="#FF0000">
while</FONT><B><FONT COLOR="#663300">( (</FONT></B>rc<B><FONT COLOR="#663300"> =</FONT></B> StepSql<B><FONT COLOR="#663300">(</FONT></B>stmtDaten<B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">)) ==</FONT></B> SQLITE_ROW<B><FONT COLOR="#663300"> )
{</FONT></B><I><FONT COLOR="#009900">
/** Normally display data, process, etc. **/
/** Here we just do something silly to avoid that **/
/** the optimizer probably removes functions. **/</FONT></I>
DatIndex<B><FONT COLOR="#663300"> =</FONT></B> sqlite3_column_int<B><FONT COLOR="#663300">(</FONT></B>stmtDaten<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">);</FONT></B>
avgIndex<B><FONT COLOR="#663300"> +=</FONT></B> DatIndex<B><FONT COLOR="#663300">;</FONT></B>
n<B><FONT COLOR="#663300">++;
}</FONT></B>
sqlite3_finalize<B><FONT COLOR="#663300">(</FONT></B>stmtDaten<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> rc<B><FONT COLOR="#663300"> ==</FONT></B> SQLITE_MISUSE<B><FONT COLOR="#663300"> )
{</FONT></B>
global_sql_error<B><FONT COLOR="#663300"> =</FONT></B><FONT COLOR="#999900"> 1</FONT><B><FONT COLOR="#663300">;</FONT></B>
EnterCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Read Thread Step returns missuse after %d steps on daten table!! Handle = %d\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> n<B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">);</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
return</FONT><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">;
}
}</FONT></B><FONT COLOR="#FF0000">
else</FONT><B><FONT COLOR="#663300">
{</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> rc<B><FONT COLOR="#663300"> ==</FONT></B> SQLITE_MISUSE<B><FONT COLOR="#663300"> )
{</FONT></B>
global_sql_error<B><FONT COLOR="#663300"> =</FONT></B><FONT COLOR="#999900"> 1</FONT><B><FONT COLOR="#663300">;</FONT></B>
EnterCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Read Thread Step returns missuse on Main Table!! Handle = %d, steps = %d\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">,</FONT></B> mainSteps<B><FONT COLOR="#663300">);</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
return</FONT><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">;
}
}</FONT></B>
sqlite3_finalize<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">);</FONT></B>
stmt<B><FONT COLOR="#663300"> =</FONT></B> NULL<B><FONT COLOR="#663300">;</FONT></B>
Sleep<B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">5</FONT><B><FONT COLOR="#663300">);</FONT></B><I><FONT COLOR="#009900"> /** ...otherwise the write thread will never get a slot to obtain the exclusive lock...**/</FONT></I><B><FONT COLOR="#663300">
}</FONT></B>
EnterCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Read Thread exit. Handle = %d (x=%d)\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">,</FONT></B> avgIndex<B><FONT COLOR="#663300">);</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}</FONT></B><I><FONT COLOR="#009900">
/*************************************************************/
/** This is the writer thread... **/
/*************************************************************/</FONT></I>
DWORD WINAPI WriterThread<B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#FF6633"> int</FONT> DBHandle<B><FONT COLOR="#663300">)
{</FONT></B>
sqlite3<B><FONT COLOR="#663300"> *</FONT></B>DB<B><FONT COLOR="#663300">;</FONT></B>
sqlite3_stmt<B><FONT COLOR="#663300"> *</FONT></B>stmt<B><FONT COLOR="#663300">, *</FONT></B>stmtDaten<B><FONT COLOR="#663300">, *</FONT></B>stmtTypes<B><FONT COLOR="#663300">;</FONT></B><FONT COLOR="#FF6633">
char</FONT> SqlStr<B><FONT COLOR="#663300">[</FONT></B><FONT COLOR="#999900">512</FONT><B><FONT COLOR="#663300">];</FONT></B><FONT COLOR="#FF6633">
int</FONT> Index<B><FONT COLOR="#663300">,</FONT></B> PrimKey<B><FONT COLOR="#663300">,</FONT></B> DatIndex<B><FONT COLOR="#663300">;</FONT></B><FONT COLOR="#FF6633">
int</FONT> avgIndex<B><FONT COLOR="#663300">,</FONT></B> rc<B><FONT COLOR="#663300">,</FONT></B> n<B><FONT COLOR="#663300">,</FONT></B> writeMode<B><FONT COLOR="#663300">,</FONT></B> bt<B><FONT COLOR="#663300">;</FONT></B><FONT COLOR="#FF6633">
unsigned long</FONT> TypeIndex<B><FONT COLOR="#663300">,</FONT></B> NewTypeNum<B><FONT COLOR="#663300">;</FONT></B>
EnterCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Writer Thread started, using DB Handle: %d\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> DBHandle<B><FONT COLOR="#663300"> <</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300"> ||</FONT></B> DBHandle<B><FONT COLOR="#663300"> ></FONT></B> MAX_OPENDBS<B><FONT COLOR="#663300"> )
{</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Error: DB Handle out of range! \n"</FONT><B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
DB<B><FONT COLOR="#663300"> =</FONT></B> DBPool<B><FONT COLOR="#663300">[</FONT></B>DBHandle<B><FONT COLOR="#663300">];</FONT></B>
writeMode<B><FONT COLOR="#663300"> =</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">;</FONT></B>
stmt<B><FONT COLOR="#663300"> =</FONT></B> NULL<B><FONT COLOR="#663300">;</FONT></B>
stmtTypes<B><FONT COLOR="#663300"> =</FONT></B> NULL<B><FONT COLOR="#663300">;</FONT></B>
stmtDaten<B><FONT COLOR="#663300"> =</FONT></B> NULL<B><FONT COLOR="#663300">;</FONT></B>
Sleep<B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">2000</FONT><B><FONT COLOR="#663300">);</FONT></B><I><FONT COLOR="#009900"> /** give the reader thread some time to start up ... **/</FONT></I><FONT COLOR="#FF0000">
while</FONT><B><FONT COLOR="#663300">(</FONT></B>global_run<B><FONT COLOR="#663300">)
{</FONT></B>
Sleep<B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">50</FONT><B><FONT COLOR="#663300">);</FONT></B><I><FONT COLOR="#009900">
/** Read randomly an main table entry **/</FONT></I>
Index<B><FONT COLOR="#663300"> = (</FONT></B>rand<B><FONT COLOR="#663300">() *</FONT></B> MAINTBL_ENTRIES<B><FONT COLOR="#663300">) /</FONT></B> RAND_MAX<B><FONT COLOR="#663300">;</FONT></B>
sprintf<B><FONT COLOR="#663300">(</FONT></B>SqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "SELECT * FROM Main WHERE ID >= %u;"</FONT><B><FONT COLOR="#663300">,</FONT></B> Index<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">( !</FONT></B>PrepareSql<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">, &</FONT></B>stmt<B><FONT COLOR="#663300">,</FONT></B> SqlStr<B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">) )
{</FONT></B><I><FONT COLOR="#009900">
/** Timeout or error --> exit **/</FONT></I>
global_sql_error<B><FONT COLOR="#663300"> =</FONT></B><FONT COLOR="#999900"> 1</FONT><B><FONT COLOR="#663300">;</FONT></B>
EnterCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Write Thread Sql Error. Handle = %d\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">);</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> StepSql<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">) ==</FONT></B> SQLITE_ROW<B><FONT COLOR="#663300"> )
{</FONT></B>
PrimKey<B><FONT COLOR="#663300"> =</FONT></B> sqlite3_column_int<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">);</FONT></B><I><FONT COLOR="#009900">
/** Either insert a new entry, or just update an existing **/</FONT></I><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> writeMode<B><FONT COLOR="#663300"> ==</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">)
{</FONT></B><I><FONT COLOR="#009900">
/** --> insert new entry **/</FONT></I>
bt<B><FONT COLOR="#663300"> =</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">;</FONT></B><FONT COLOR="#FF0000">
while</FONT><B><FONT COLOR="#663300">( !</FONT></B>BeginTrans<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">) )
{</FONT></B>
EnterCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Write Thread: DB is busy! tries = %d handle = %d\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> bt<B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">);</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
Sleep<B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">128</FONT><B><FONT COLOR="#663300">);</FONT></B>
bt<B><FONT COLOR="#663300">++;
}</FONT></B><I><FONT COLOR="#009900">
/** get new Type: Read max ID from Types and increase by one **/</FONT></I>
sprintf<B><FONT COLOR="#663300">(</FONT></B>SqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "SELECT * FROM TypeNumbers WHERE MainID = %u AND Type = 4;"</FONT><B><FONT COLOR="#663300">,</FONT></B> PrimKey<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">( !</FONT></B>PrepareSql<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">, &</FONT></B>stmtTypes<B><FONT COLOR="#663300">,</FONT></B> SqlStr<B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">) )
{</FONT></B><I><FONT COLOR="#009900">
/** Timeout or error --> exit **/</FONT></I>
global_sql_error<B><FONT COLOR="#663300"> =</FONT></B><FONT COLOR="#999900"> 1</FONT><B><FONT COLOR="#663300">;</FONT></B>
EnterCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Write Thread Sql Error. Handle = %d\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">);</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
EndTrans<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">,</FONT></B>DBHandle<B><FONT COLOR="#663300"> );</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">( (</FONT></B>rc<B><FONT COLOR="#663300"> =</FONT></B> StepSql<B><FONT COLOR="#663300">(</FONT></B>stmtTypes<B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">)) ==</FONT></B> SQLITE_ROW<B><FONT COLOR="#663300"> )
{</FONT></B>
TypeIndex<B><FONT COLOR="#663300"> =</FONT></B> sqlite3_column_int<B><FONT COLOR="#663300">(</FONT></B>stmtTypes<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">);</FONT></B>
NewTypeNum<B><FONT COLOR="#663300"> =</FONT></B> sqlite3_column_int<B><FONT COLOR="#663300">(</FONT></B>stmtTypes<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#999900"> 3</FONT><B><FONT COLOR="#663300">) +</FONT></B><FONT COLOR="#999900"> 1</FONT><B><FONT COLOR="#663300">;</FONT></B>
sqlite3_finalize<B><FONT COLOR="#663300">(</FONT></B>stmtTypes<B><FONT COLOR="#663300">);
}</FONT></B><FONT COLOR="#FF0000">
else</FONT><B><FONT COLOR="#663300">
{</FONT></B><I><FONT COLOR="#009900">
/** Should not happend: No Type found for this Main and Type **/
/** --> create a new one **/</FONT></I>
sprintf<B><FONT COLOR="#663300">(</FONT></B>SqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "INSERT INTO TypeNumbers (MainID,Type,CurrentNumber) VALUES(%u, 4, 0);"</FONT><B><FONT COLOR="#663300">,</FONT></B> PrimKey<B><FONT COLOR="#663300">);</FONT></B>
PrepareSql<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">, &</FONT></B>stmtTypes<B><FONT COLOR="#663300">,</FONT></B> SqlStr<B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">);</FONT></B>
StepSql<B><FONT COLOR="#663300">(</FONT></B>stmtTypes<B><FONT COLOR="#663300">, -</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">);</FONT></B>
sqlite3_finalize<B><FONT COLOR="#663300">(</FONT></B>stmtTypes<B><FONT COLOR="#663300">);</FONT></B>
TypeIndex<B><FONT COLOR="#663300"> = (</FONT></B><FONT COLOR="#FF6633">unsigned long</FONT><B><FONT COLOR="#663300">)</FONT></B>sqlite3_last_insert_rowid<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">);</FONT></B>
NewTypeNum<B><FONT COLOR="#663300">=</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">;
}</FONT></B><I><FONT COLOR="#009900">
/** Update Type Number with the new Type Number **/</FONT></I>
sprintf<B><FONT COLOR="#663300">(</FONT></B>SqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "UPDATE TypeNumbers SET CurrentNumber=%d WHERE ID=%u;"</FONT><B><FONT COLOR="#663300">,</FONT></B> NewTypeNum<B><FONT COLOR="#663300">,</FONT></B> TypeIndex<B><FONT COLOR="#663300">);</FONT></B>
PrepareSql<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">, &</FONT></B>stmtTypes<B><FONT COLOR="#663300">,</FONT></B> SqlStr<B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">);</FONT></B>
StepSql<B><FONT COLOR="#663300">(</FONT></B>stmtTypes<B><FONT COLOR="#663300">, -</FONT></B><FONT COLOR="#999900">1</FONT><B><FONT COLOR="#663300">);</FONT></B>
sqlite3_finalize<B><FONT COLOR="#663300">(</FONT></B>stmtTypes<B><FONT COLOR="#663300">);</FONT></B><I><FONT COLOR="#009900">
/** Insert New entry in Data table **/</FONT></I>
sprintf<B><FONT COLOR="#663300">(</FONT></B>SqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "INSERT INTO Daten (Typ,ParentID,FieldA,FieldB,MainID,PropertyMask,FieldC,FieldD,TypeNumber,FieldE) VALUES(4,0,'Ignore','Longer text field',%d,42,'FieldCData','FieldDData', %d, 'Longer Text...');"</FONT><B><FONT COLOR="#663300">,</FONT></B> PrimKey<B><FONT COLOR="#663300">,</FONT></B> NewTypeNum<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">( !</FONT></B>PrepareSql<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">, &</FONT></B>stmtDaten<B><FONT COLOR="#663300">,</FONT></B> SqlStr<B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">) )
{</FONT></B><I><FONT COLOR="#009900">
/** Timeout or error --> exit **/</FONT></I>
global_sql_error<B><FONT COLOR="#663300"> =</FONT></B><FONT COLOR="#999900"> 1</FONT><B><FONT COLOR="#663300">;</FONT></B>
EnterCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Write Thread Sql Error. Handle = %d\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">);</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
EndTrans<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">,</FONT></B>DBHandle<B><FONT COLOR="#663300"> );</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> StepSql<B><FONT COLOR="#663300">(</FONT></B>stmtDaten<B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">) !=</FONT></B> SQLITE_DONE<B><FONT COLOR="#663300"> )
{</FONT></B><I><FONT COLOR="#009900">
/** Timeout or error --> exit **/</FONT></I>
global_sql_error<B><FONT COLOR="#663300"> =</FONT></B><FONT COLOR="#999900"> 1</FONT><B><FONT COLOR="#663300">;</FONT></B>
EnterCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Write Thread Sql Error. Handle = %d\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">);</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
EndTrans<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">,</FONT></B>DBHandle<B><FONT COLOR="#663300"> );</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}</FONT></B>
sqlite3_finalize<B><FONT COLOR="#663300">(</FONT></B>stmtDaten<B><FONT COLOR="#663300">);</FONT></B>
stmtDaten<B><FONT COLOR="#663300"> =</FONT></B> NULL<B><FONT COLOR="#663300">;</FONT></B>
EndTrans<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">);
}</FONT></B><FONT COLOR="#FF0000">
else</FONT><B><FONT COLOR="#663300">
{</FONT></B>
stmtDaten<B><FONT COLOR="#663300"> =</FONT></B> NULL<B><FONT COLOR="#663300">;</FONT></B>
bt<B><FONT COLOR="#663300"> =</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">;</FONT></B><FONT COLOR="#FF0000">
while</FONT><B><FONT COLOR="#663300">( !</FONT></B>BeginTrans<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">) )
{</FONT></B>
EnterCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Write Thread: DB is busy! tries = %d handle = %d\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> bt<B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">);</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
Sleep<B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">128</FONT><B><FONT COLOR="#663300">);</FONT></B>
bt<B><FONT COLOR="#663300">++;
}</FONT></B><I><FONT COLOR="#009900">
/** Update all entries that belong to this main table entry **/</FONT></I>
sprintf<B><FONT COLOR="#663300">(</FONT></B>SqlStr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "UPDATE Daten SET FieldA='CHanged',FieldB='sqlite3..' WHERE MainID=%u;"</FONT><B><FONT COLOR="#663300">,</FONT></B> PrimKey<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">( !</FONT></B>PrepareSql<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">, &</FONT></B>stmtDaten<B><FONT COLOR="#663300">,</FONT></B> SqlStr<B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">) )
{</FONT></B><I><FONT COLOR="#009900">
/** Timeout or error --> exit **/</FONT></I>
global_sql_error<B><FONT COLOR="#663300"> =</FONT></B><FONT COLOR="#999900"> 1</FONT><B><FONT COLOR="#663300">;</FONT></B>
EnterCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Write Thread Sql Error. Handle = %d\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">);</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
EndTrans<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">,</FONT></B>DBHandle<B><FONT COLOR="#663300"> );</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> StepSql<B><FONT COLOR="#663300">(</FONT></B>stmtDaten<B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">) !=</FONT></B> SQLITE_DONE<B><FONT COLOR="#663300"> )
{</FONT></B><I><FONT COLOR="#009900">
/** Timeout or error --> exit **/</FONT></I>
global_sql_error<B><FONT COLOR="#663300"> =</FONT></B><FONT COLOR="#999900"> 1</FONT><B><FONT COLOR="#663300">;</FONT></B>
EnterCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Write Thread Sql Error. Handle = %d\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">);</FONT></B>
LeaveCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300">);</FONT></B>
EndTrans<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">,</FONT></B>DBHandle<B><FONT COLOR="#663300"> );</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}</FONT></B>
sqlite3_finalize<B><FONT COLOR="#663300">(</FONT></B>stmtDaten<B><FONT COLOR="#663300">);</FONT></B>
stmtDaten<B><FONT COLOR="#663300"> =</FONT></B> NULL<B><FONT COLOR="#663300">;</FONT></B>
EndTrans<B><FONT COLOR="#663300">(</FONT></B>DB<B><FONT COLOR="#663300">,</FONT></B> DBHandle<B><FONT COLOR="#663300">);
}</FONT></B>
writeMode<B><FONT COLOR="#663300"> = !</FONT></B>writeMode<B><FONT COLOR="#663300">;</FONT></B><I><FONT COLOR="#009900"> /** toggle DB write access modes **/</FONT></I><B><FONT COLOR="#663300">
}</FONT></B>
sqlite3_finalize<B><FONT COLOR="#663300">(</FONT></B>stmt<B><FONT COLOR="#663300">);</FONT></B>
stmt<B><FONT COLOR="#663300"> =</FONT></B> NULL<B><FONT COLOR="#663300">;
}</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}</FONT></B><FONT COLOR="#FF6633">
int</FONT><FONT COLOR="#990000"> main</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#FF6633">int</FONT> argc<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#FF6633"> char</FONT><B><FONT COLOR="#663300"> **</FONT></B>argv<B><FONT COLOR="#663300">)
{</FONT></B><FONT COLOR="#FF6633">
int</FONT> i<B><FONT COLOR="#663300">;</FONT></B><FONT COLOR="#FF6633">
long</FONT> threadid<B><FONT COLOR="#663300">;</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "sqlite thread test program start...\n"</FONT><B><FONT COLOR="#663300">);</FONT></B>
sqlite3_enable_shared_cache<B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900"> 1</FONT><B><FONT COLOR="#663300"> );</FONT></B><I><FONT COLOR="#009900">
/** try to open test DB **/</FONT></I><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> sqlite3_open_v2<B><FONT COLOR="#663300">(</FONT></B>DBFILENAME<B><FONT COLOR="#663300">, &</FONT></B>MainDB<B><FONT COLOR="#663300">,</FONT></B> SQLITE_OPEN_READWRITE<B><FONT COLOR="#663300">|</FONT></B>SQLITE_OPEN_FULLMUTEX<B><FONT COLOR="#663300">,</FONT></B> NULL<B><FONT COLOR="#663300">) )
{</FONT></B><I><FONT COLOR="#009900">
/** failed, --> create new DB **/</FONT></I>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Creating Test DB: %s\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> DBFILENAME<B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">( !</FONT></B>CreateTestDB<B><FONT COLOR="#663300">(</FONT></B>DBFILENAME<B><FONT COLOR="#663300">) )
{</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Fatal: Unable to create test DB!\n"</FONT><B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}</FONT></B><FONT COLOR="#FF0000">
else</FONT><B><FONT COLOR="#663300">
{</FONT></B>
FillTestDB<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">);</FONT></B>
sqlite3_close<B><FONT COLOR="#663300">(</FONT></B>MainDB<B><FONT COLOR="#663300">);</FONT></B><I><FONT COLOR="#009900">
/** I exit here, and ask for a restart because this simulates **/
/** better the typical situation: to start with an existing DB **/</FONT></I>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "TestDB created: Please restart application.\n"</FONT><B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}
}</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Opened TEST DB: %s \n"</FONT><B><FONT COLOR="#663300">,</FONT></B> DBFILENAME<B><FONT COLOR="#663300">);</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "SQL ThreadSafe: %d\n"</FONT><B><FONT COLOR="#663300">,</FONT></B> sqlite3_threadsafe<B><FONT COLOR="#663300">());</FONT></B><I><FONT COLOR="#009900">
/*** Open DBs to be used by the threads **/</FONT></I>
memset<B><FONT COLOR="#663300">(</FONT></B>DBPool<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#990000"> sizeof</FONT><B><FONT COLOR="#663300">(</FONT></B>DBPool<B><FONT COLOR="#663300">));</FONT></B><FONT COLOR="#FF0000">
for</FONT><B><FONT COLOR="#663300">(</FONT></B>i<B><FONT COLOR="#663300">=</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">;</FONT></B> i<B><FONT COLOR="#663300"> <</FONT></B> MAX_OPENDBS<B><FONT COLOR="#663300">;</FONT></B> i<B><FONT COLOR="#663300">++)
{</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> sqlite3_open_v2<B><FONT COLOR="#663300">(</FONT></B>DBFILENAME<B><FONT COLOR="#663300">, &</FONT></B>DBPool<B><FONT COLOR="#663300">[</FONT></B>i<B><FONT COLOR="#663300">],</FONT></B> SQLITE_OPEN_READWRITE<B><FONT COLOR="#663300">|</FONT></B>SQLITE_OPEN_FULLMUTEX<B><FONT COLOR="#663300">,</FONT></B> NULL<B><FONT COLOR="#663300">) )
{</FONT></B>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "Error: Failed to open DB for thread pool!\n"</FONT><B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}
}</FONT></B>
InitializeCriticalSection<B><FONT COLOR="#663300">(&</FONT></B>stderr_lock<B><FONT COLOR="#663300"> );</FONT></B><I><FONT COLOR="#009900">
/** Finally: Let's start the test: **/
/** This will generate a number of reading threads and 1 writer thread **/
/** The reader threads parse the tables with maximum speed **/
/** the write thread will randomly update or insert new entries in the **/
/** data table. **/</FONT></I>
global_run<B><FONT COLOR="#663300"> =</FONT></B><FONT COLOR="#999900"> 1</FONT><B><FONT COLOR="#663300">;</FONT></B><I><FONT COLOR="#009900">
/** Start reader threads **/</FONT></I><FONT COLOR="#FF0000">
for</FONT><B><FONT COLOR="#663300">(</FONT></B>i<B><FONT COLOR="#663300">=</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">;</FONT></B> i<B><FONT COLOR="#663300"> <</FONT></B> MAX_OPENDBS<B><FONT COLOR="#663300">-</FONT></B>NUM_WRITE_THREADS<B><FONT COLOR="#663300">;</FONT></B> i<B><FONT COLOR="#663300">++)
{</FONT></B>
CreateThread<B><FONT COLOR="#663300">(</FONT></B>NULL<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">, (</FONT></B>LPTHREAD_START_ROUTINE<B><FONT COLOR="#663300">)</FONT></B>ReadThread<B><FONT COLOR="#663300">, (</FONT></B>LPVOID<B><FONT COLOR="#663300">)</FONT></B>i<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">, &</FONT></B>threadid<B><FONT COLOR="#663300">);
}</FONT></B><I><FONT COLOR="#009900">
/** start writer threads **/</FONT></I><FONT COLOR="#FF0000">
for</FONT><B><FONT COLOR="#663300">(</FONT></B>i<B><FONT COLOR="#663300">=</FONT></B>MAX_OPENDBS<B><FONT COLOR="#663300">-</FONT></B>NUM_WRITE_THREADS<B><FONT COLOR="#663300">;</FONT></B> i<B><FONT COLOR="#663300"> <</FONT></B> MAX_OPENDBS<B><FONT COLOR="#663300">;</FONT></B> i<B><FONT COLOR="#663300">++)
{</FONT></B>
CreateThread<B><FONT COLOR="#663300">(</FONT></B>NULL<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">, (</FONT></B>LPTHREAD_START_ROUTINE<B><FONT COLOR="#663300">)</FONT></B>WriterThread<B><FONT COLOR="#663300">, (</FONT></B>LPVOID<B><FONT COLOR="#663300">)</FONT></B>i<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">, &</FONT></B>threadid<B><FONT COLOR="#663300">);
}</FONT></B><I><FONT COLOR="#009900">
/** ok, threads are up and running -- the main process just waits **/</FONT></I><FONT COLOR="#FF0000">
while</FONT><B><FONT COLOR="#663300">( !</FONT></B>global_sql_error<B><FONT COLOR="#663300"> )
{</FONT></B>
Sleep<B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">1000</FONT><B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
if</FONT><B><FONT COLOR="#663300">(</FONT></B> global_sql_error<B><FONT COLOR="#663300"> )</FONT></B>
global_run<B><FONT COLOR="#663300"> =</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300">;
}</FONT></B>
Sleep<B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">1000</FONT><B><FONT COLOR="#663300">);</FONT></B><I><FONT COLOR="#009900">
/** I should close all DB here, but that is not the focus of the test ... **/</FONT></I>
fprintf<B><FONT COLOR="#663300">(</FONT></B>stderr<B><FONT COLOR="#663300">,</FONT></B><FONT COLOR="#cc0000"> "SqlTest finished...\n"</FONT><B><FONT COLOR="#663300">);</FONT></B><FONT COLOR="#FF0000">
return</FONT><B><FONT COLOR="#663300">(</FONT></B><FONT COLOR="#999900">0</FONT><B><FONT COLOR="#663300">);
}</FONT></B></PRE>
</BODY>
</HTML>