<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>SQLite and AGUP behaving oddly</title>
		<link>http://www.allegro.cc/forums/view/582059</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 28 Apr 2006 17:14:01 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The program I&#39;m making&#39;s almost done, but it&#39;s got two more weird bugs.</p><p>1) When there&#39;s no database, and the user presses the Clear Data button, it should create the table needed. When the table already exists, it should flush it (or destroy it and make it again.</p><p>My code for that, is:
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>    open_dbase <span class="k3">=</span> sqlite3_open<span class="k2">(</span>file, <span class="k3">&amp;</span>database<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">2</td><td>    <span class="k1">if</span><span class="k2">(</span>open_dbase<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">3</td><td>      <a href="http://www.allegro.cc/manual/alert" target="_blank"><span class="a">alert</span></a><span class="k2">(</span><span class="s">"Problem opening database."</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="s">"&amp;Ok"</span>, NULL, <span class="s">'o'</span>, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">4</td><td>      sqlite3_close<span class="k2">(</span>database<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">5</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">6</td><td>    <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">7</td><td>      std::stringstream query<span class="k2">;</span></td></tr><tr><td class="number">8</td><td>      query <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"DROP TABLE dictionary;"</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>      result <span class="k3">=</span> sqlite3_exec<span class="k2">(</span>database, query.str<span class="k2">(</span><span class="k2">)</span>.c_str<span class="k2">(</span><span class="k2">)</span>, callback, <span class="n">0</span>, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td>&#160;</td></tr><tr><td class="number">11</td><td>      <span class="k1">if</span> <span class="k2">(</span>result <span class="k3">=</span><span class="k3">=</span> SQLITE_OK<span class="k2">)</span> <a href="http://www.allegro.cc/manual/alert" target="_blank"><span class="a">alert</span></a><span class="k2">(</span><span class="s">"The database is empty now."</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="s">"&amp;Ok"</span>, NULL, <span class="s">'o'</span>, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>      <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">13</td><td>        <span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> error <span class="k3">=</span> sqlite3_errmsg<span class="k2">(</span>database<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>        <a href="http://www.allegro.cc/manual/alert" target="_blank"><span class="a">alert</span></a><span class="k2">(</span>error, <span class="n">0</span>, <span class="n">0</span>, <span class="s">"&amp;Ok"</span>, <span class="n">0</span>, <span class="s">'o'</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td>      query <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"CREATE TABLE dictionary (word TEXT, translation TEXT);"</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>      result <span class="k3">=</span> sqlite3_exec<span class="k2">(</span>database, query.str<span class="k2">(</span><span class="k2">)</span>.c_str<span class="k2">(</span><span class="k2">)</span>, callback, <span class="n">0</span>, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>&#160;</td></tr><tr><td class="number">20</td><td>      <span class="k1">if</span> <span class="k2">(</span>result <span class="k3">=</span><span class="k3">=</span> SQLITE_OK<span class="k2">)</span> <a href="http://www.allegro.cc/manual/alert" target="_blank"><span class="a">alert</span></a><span class="k2">(</span><span class="s">"The database is empty now."</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="s">"&amp;Ok"</span>, NULL, <span class="s">'o'</span>, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>      <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">22</td><td>        <span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> error <span class="k3">=</span> sqlite3_errmsg<span class="k2">(</span>database<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>        <a href="http://www.allegro.cc/manual/alert" target="_blank"><span class="a">alert</span></a><span class="k2">(</span>error, <span class="n">0</span>, <span class="n">0</span>, <span class="s">"&amp;Ok"</span>, <span class="n">0</span>, <span class="s">'o'</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">25</td><td>&#160;</td></tr><tr><td class="number">26</td><td>      sqlite3_close<span class="k2">(</span>database<span class="k2">)</span><span class="k2">;</span></td></tr></tbody></table></div></div><p>

It gives this error message twice:<br />No such table: dictionary</p><p>When I take away the Drop part and create without the table already existing, it works fine. If I do this, but when the table already exists, it says that the table already exists.</p><p>2) I&#39;ve got a Quit-button at the main part of my application. Pressing Esc works as well. It first comes up and asks if you really want to quit. It works fine when pressing Esc, but when using the Quit-button, pressing Cancel still quits the program.</p><p>This&#39;s the code:
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">void</span> closebutton <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>    <a href="http://www.allegro.cc/manual/simulate_keypress" target="_blank"><span class="a">simulate_keypress</span></a> <span class="k2">(</span><span class="k2">(</span>KEY_ESC <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">8</span><span class="k2">)</span> <span class="k3">|</span> <a href="http://www.allegro.cc/manual/scancode_to_ascii" target="_blank"><span class="a">scancode_to_ascii</span></a> <span class="k2">(</span>KEY_ESC<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">4</td><td><span class="k2">}</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td><span class="k1">int</span> quit_proc<span class="k2">(</span><span class="k1">int</span> msg, <a href="http://www.allegro.cc/manual/DIALOG" target="_blank"><span class="a">DIALOG</span></a> <span class="k3">*</span>d, <span class="k1">int</span> c<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">8</td><td>    <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>d<span class="k2">;</span></td></tr><tr><td class="number">9</td><td>    <span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>c<span class="k2">;</span></td></tr><tr><td class="number">10</td><td>&#160;</td></tr><tr><td class="number">11</td><td>    <span class="k1">return</span> <span class="k2">(</span><span class="k2">(</span><span class="k2">(</span>msg <span class="k3">=</span><span class="k3">=</span> MSG_KEY<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span>msg <span class="k3">=</span><span class="k3">=</span> MSG_XCHAR <span class="k3">&amp;</span><span class="k3">&amp;</span> c <span class="k3">=</span><span class="k3">=</span> KEY_F10 <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">8</span><span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">12</td><td>            <span class="k3">&amp;</span><span class="k3">&amp;</span> <a href="http://www.allegro.cc/manual/alert" target="_blank"><span class="a">alert</span></a><span class="k2">(</span><span class="n">0</span>, <span class="s">"Quit?"</span>, <span class="n">0</span>, <span class="s">"Ok"</span>, <span class="s">"Cancel"</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span> ? D_CLOSE <span class="k2">:</span> D_O_K<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td><span class="k2">}</span></td></tr><tr><td class="number">14</td><td>&#160;</td></tr><tr><td class="number">15</td><td>&#160;</td></tr><tr><td class="number">16</td><td><span class="k2">(</span>...<span class="k2">)</span></td></tr><tr><td class="number">17</td><td>&#160;</td></tr><tr><td class="number">18</td><td>  <a href="http://www.allegro.cc/manual/DIALOG" target="_blank"><span class="a">DIALOG</span></a> main_dlg<span class="k2">[</span><span class="k2">]</span> <span class="k3">=</span></td></tr><tr><td class="number">19</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">20</td><td>     <span class="c">/* (dialog proc)     (x)   (y)   (w)   (h) (fg)(bg) (key) (flags)     (d1) (d2)    (dp)                   (dp2) (dp3) */</span></td></tr><tr><td class="number">21</td><td>   </td></tr><tr><td class="number">22</td><td>     <span class="c">/* this element just clears the screen, therefore it should come before the others */</span></td></tr><tr><td class="number">23</td><td>     <span class="k2">{</span> d_agup_clear_proc,        <span class="n">0</span>,   <span class="n">0</span>,    <span class="n">0</span>,    <span class="n">0</span>,   <span class="n">0</span>,  <span class="n">0</span>,    <span class="n">0</span>,      <span class="n">0</span>,       <span class="n">0</span>,   <span class="n">0</span>,    NULL,                   NULL, NULL  <span class="k2">}</span>,</td></tr><tr><td class="number">24</td><td>   </td></tr><tr><td class="number">25</td><td>  <span class="c">// Text</span></td></tr><tr><td class="number">26</td><td>    <span class="k2">{</span> d_agup_ctext_proc,      <span class="n">134</span>, <span class="n">50</span>,  <span class="n">10</span>,  <span class="n">0</span>,  <span class="n">0</span>,    <span class="n">0</span>,    <span class="n">0</span>,   <span class="n">0</span>,       <span class="n">0</span>,    <span class="n">0</span>,  <span class="k2">(</span><span class="k1">void</span> <span class="k3">*</span><span class="k2">)</span><span class="s">"Dictionary"</span>,          <span class="n">0</span>,     <span class="n">0</span> <span class="k2">}</span>,    </td></tr><tr><td class="number">27</td><td>&#160;</td></tr><tr><td class="number">28</td><td>  <span class="c">// Buttons</span></td></tr><tr><td class="number">29</td><td>     <span class="k2">{</span> d_agup_push_proc,     <span class="n">90</span>, <span class="n">75</span>, <span class="n">100</span>, <span class="n">18</span>,  <span class="n">0</span>,  <span class="n">0</span>,  <span class="n">0</span>,  <span class="n">0</span>,       <span class="n">0</span>,   <span class="n">0</span>,  <span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span><span class="s">"Translate"</span>,     <span class="n">0</span>,  <span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span>translation_form <span class="k2">}</span>,</td></tr><tr><td class="number">30</td><td>     <span class="k2">{</span> d_agup_push_proc,     <span class="n">90</span>, <span class="n">95</span>, <span class="n">100</span>, <span class="n">18</span>,  <span class="n">0</span>,  <span class="n">0</span>,  <span class="n">0</span>,  <span class="n">0</span>,       <span class="n">0</span>,   <span class="n">0</span>,  <span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span><span class="s">"Add"</span>,     <span class="n">0</span>,  <span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span>add <span class="k2">}</span>,</td></tr><tr><td class="number">31</td><td>     <span class="k2">{</span> d_agup_push_proc,     <span class="n">90</span>, <span class="n">115</span>, <span class="n">100</span>, <span class="n">18</span>,  <span class="n">0</span>,  <span class="n">0</span>,  <span class="n">0</span>,  <span class="n">0</span>,       <span class="n">0</span>,   <span class="n">0</span>,  <span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span><span class="s">"Edit"</span>,     <span class="n">0</span>,  <span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span>edit <span class="k2">}</span>,</td></tr><tr><td class="number">32</td><td>     <span class="k2">{</span> d_agup_push_proc,     <span class="n">90</span>, <span class="n">135</span>, <span class="n">100</span>, <span class="n">18</span>,  <span class="n">0</span>,  <span class="n">0</span>,  <span class="n">0</span>,  <span class="n">0</span>,       <span class="n">0</span>,   <span class="n">0</span>,  <span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span><span class="s">"Delete"</span>,     <span class="n">0</span>,  <span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span>delete_record <span class="k2">}</span>,</td></tr><tr><td class="number">33</td><td>     <span class="k2">{</span> d_agup_push_proc,     <span class="n">90</span>, <span class="n">155</span>, <span class="n">100</span>, <span class="n">18</span>,  <span class="n">0</span>,  <span class="n">0</span>,  <span class="n">0</span>,  <span class="n">0</span>,       <span class="n">0</span>,   <span class="n">0</span>,  <span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span><span class="s">"Clear Data"</span>,     <span class="n">0</span>,  <span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span>new_dbase <span class="k2">}</span>,</td></tr><tr><td class="number">34</td><td>     <span class="k2">{</span> d_agup_push_proc,     <span class="n">90</span>, <span class="n">180</span>, <span class="n">100</span>, <span class="n">18</span>,  <span class="n">0</span>,  <span class="n">0</span>,  <span class="n">0</span>,  <span class="n">0</span>,       <span class="n">0</span>,   <span class="n">0</span>,  <span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span><span class="s">"Quit"</span>,     <span class="n">0</span>,  <span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span>closebutton <span class="k2">}</span>,</td></tr><tr><td class="number">35</td><td>&#160;</td></tr><tr><td class="number">36</td><td>     <span class="k2">{</span> quit_proc,              <span class="n">0</span>,  <span class="n">0</span>,   <span class="n">0</span>,  <span class="n">0</span>,  <span class="n">0</span>,  <span class="n">0</span>, <span class="n">27</span>,  <span class="n">0</span>,       <span class="n">0</span>,   <span class="n">0</span>,       <span class="n">0</span>,        <span class="n">0</span>,  <span class="n">0</span> <span class="k2">}</span>,</td></tr><tr><td class="number">37</td><td>   </td></tr><tr><td class="number">38</td><td>     <span class="c">/* the next two elements don't draw anything */</span></td></tr><tr><td class="number">39</td><td>     <span class="k2">{</span> <a href="http://www.allegro.cc/manual/d_yield_proc" target="_blank"><span class="a">d_yield_proc</span></a>,        <span class="n">0</span>,   <span class="n">0</span>,    <span class="n">0</span>,    <span class="n">0</span>,   <span class="n">0</span>,  <span class="n">0</span>,    <span class="n">0</span>,      <span class="n">0</span>,       <span class="n">0</span>,   <span class="n">0</span>,    NULL,                   NULL, NULL  <span class="k2">}</span>,</td></tr><tr><td class="number">40</td><td>     <span class="k2">{</span> NULL,                <span class="n">0</span>,   <span class="n">0</span>,    <span class="n">0</span>,    <span class="n">0</span>,   <span class="n">0</span>,  <span class="n">0</span>,    <span class="n">0</span>,      <span class="n">0</span>,       <span class="n">0</span>,   <span class="n">0</span>,    NULL,                   NULL, NULL  <span class="k2">}</span></td></tr><tr><td class="number">41</td><td>  <span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>  set_gui<span class="k2">(</span>main_dlg<span class="k2">)</span><span class="k2">;</span></td></tr></tbody></table></div></div><p>

To me, it all seems pretty logical, and I can&#39;t think of why it would act the way it does.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Raf Vermeulen)</author>
		<pubDate>Fri, 28 Apr 2006 06:54:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>To your first question, call query.str(&quot;&quot;) to remove the existing query from the stringstream before continuing. Right now you are trying to execute this SQL:<br /><span class="source-code">DROP TABLE dictionary<span class="k2">;</span>CREATE TABLE dictionary <span class="k2">(</span>word TEXT, translation TEXT<span class="k2">)</span><span class="k2">;</span></span>And from the SQLite docs, it will only execute the first statement in a batch.</p><p>Your quit proc looks like it will ask the user to quit everytime he presses a key, and that KEY_F10 checking seems wrong, because you ignroe the low bits in c.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Fri, 28 Apr 2006 16:01:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /> The dropping and recreating of the database works now. The F10 key to quit seems to&#39;ve worked all the time, too. I&#39;m really quite stumped at this one, as it all uses the same function. It must be something like it keeps sending a 1 through when using the button, while pressing a key sends a 1 through, immediately followed by a 0. Just dunno why it&#39;d do that, or if it&#39;s actually that, let alone how to fix it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Raf Vermeulen)</author>
		<pubDate>Fri, 28 Apr 2006 17:14:01 +0000</pubDate>
	</item>
</rss>
