<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity:60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0em 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0em 1em;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These InterfaceOptions for customising TiddlyWiki are saved in your browser

Your username for signing your edits. Write it as a WikiWord (eg JoeBloggs)

<<option txtUserName>>
<<option chkSaveBackups>> SaveBackups
<<option chkAutoSave>> AutoSave
<<option chkRegExpSearch>> RegExpSearch
<<option chkCaseSensitiveSearch>> CaseSensitiveSearch
<<option chkAnimate>> EnableAnimations

----
Also see [[AdvancedOptions]]
<<importTiddlers>>
Gecko:embed mozila to your application
tinyMce:pure JS editor.very cool!
有些故事很长,用一辈子也说不完
[[My Love]]
[[GettingStarted]]
[[Sample code]]
Here is for my son
[img[2周岁拼贴|.\img\2years.jpg]]
gecko
tinymce
<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&lt;at&gt;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    &lt;windows.h&gt;

   #include    &lt;stdio.h&gt;
   #include    &lt;time.h&gt;
   #include    &lt;process.h&gt;

   #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  /** -&gt; 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"> &lt;</FONT></B> SQLTM_COUNT<B><FONT COLOR="#663300">) &amp;&amp; ((</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">(&amp;</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">(&amp;</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"> &lt;</FONT></B> SQLTM_COUNT<B><FONT COLOR="#663300">) &amp;&amp; ((</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">(&amp;</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">(&amp;</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"> &gt;</FONT></B><FONT COLOR="#999900"> 2</FONT><B><FONT COLOR="#663300"> )
      {</FONT></B>
         EnterCriticalSection<B><FONT COLOR="#663300">(&amp;</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">(&amp;</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">(&amp;</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">(&amp;</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">, &amp;</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">(&amp;</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">(&amp;</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">(&amp;</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">(&amp;</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">, &amp;</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">(&amp;</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">(&amp;</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">(&amp;</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">(&amp;</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">, &amp;</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">, &amp;</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">, &amp;</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">, &amp;</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">, &amp;</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">, &amp;</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">, &amp;</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">, &amp;</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"> &lt;</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">, &amp;</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">, &amp;</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 --&gt; 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"> &lt;</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">, &amp;</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">, &amp;</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">(&amp;</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"> &lt;</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300"> ||</FONT></B> DBHandle<B><FONT COLOR="#663300"> &gt;</FONT></B> MAX_OPENDBS<B><FONT COLOR="#663300"> )
      {</FONT></B>

         LeaveCriticalSection<B><FONT COLOR="#663300">(&amp;</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">(&amp;</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 &gt;= %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">, &amp;</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 --&gt; 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">(&amp;</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">(&amp;</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">, &amp;</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 --&gt; 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">(&amp;</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">(&amp;</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">(&amp;</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">(&amp;</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">(&amp;</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">(&amp;</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">(&amp;</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">(&amp;</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">(&amp;</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"> &lt;</FONT></B><FONT COLOR="#999900"> 0</FONT><B><FONT COLOR="#663300"> ||</FONT></B> DBHandle<B><FONT COLOR="#663300"> &gt;</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">(&amp;</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 &gt;= %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">, &amp;</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 --&gt; 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">(&amp;</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">(&amp;</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">
                 /** --&gt; 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">(&amp;</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">(&amp;</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">, &amp;</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 --&gt; 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">(&amp;</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">(&amp;</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 **/
                     /** --&gt; 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">, &amp;</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">, &amp;</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">, &amp;</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 --&gt; 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">(&amp;</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">(&amp;</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 --&gt; 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">(&amp;</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">(&amp;</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">(&amp;</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">(&amp;</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">, &amp;</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 --&gt; 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">(&amp;</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">(&amp;</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 --&gt; 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">(&amp;</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">(&amp;</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">, &amp;</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, --&gt; 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"> &lt;</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">, &amp;</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">(&amp;</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"> &lt;</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">, &amp;</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"> &lt;</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">, &amp;</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>
a mini document of Sqlite development with c++
Sqlite Study Report
you can google it for sqlite server.
just like
[[SqliteNetwork|http://www.sqlite.org/cvstrac/wiki?p=SqliteNetwork]]
one is UTF-8
the other which is ended by 16 means UTF-16.