<spanclass="s2">"use strict"</span><spanclass="p">;</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>The SQLite3 base is a bit different than the other clients,
in that it may be run on both the client and server. So add another
layer to the prototype chain.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">define</span><spanclass="p">(</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">require</span><spanclass="p">,</span><spanclass="nx">exports</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="kd">var</span><spanclass="nx">baseGrammar</span><spanclass="o">=</span><spanclass="nx">require</span><spanclass="p">(</span><spanclass="s1">'../grammar'</span><spanclass="p">).</span><spanclass="nx">baseGrammar</span><spanclass="p">;</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Extends the standard sql grammar, with any SQLite specific
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile the "order by" portions of the query.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileOrders</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">qb</span><spanclass="p">,</span><spanclass="nx">orders</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="k">return</span><spanclass="s2">"order by "</span><spanclass="o">+</span><spanclass="nx">orders</span><spanclass="p">.</span><spanclass="nx">map</span><spanclass="p">(</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">order</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile an insert statement into SQL.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileInsert</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">qb</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="kd">var</span><spanclass="nx">columns</span><spanclass="o">=</span><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">pluck</span><spanclass="p">(</span><spanclass="nx">values</span><spanclass="p">[</span><spanclass="mi">0</span><spanclass="p">],</span><spanclass="mi">0</span><spanclass="p">);</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>If there are any "where" clauses, we need to omit
any bindings that may have been associated with them.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="k">if</span><spanclass="p">(</span><spanclass="nx">qb</span><spanclass="p">.</span><spanclass="nx">wheres</span><spanclass="p">.</span><spanclass="nx">length</span><spanclass="o">></span><spanclass="mi">0</span><spanclass="p">)</span><spanclass="k">this</span><spanclass="p">.</span><spanclass="nx">clearWhereBindings</span><spanclass="p">(</span><spanclass="nx">qb</span><spanclass="p">);</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>If there is only one record being inserted, we will just use the usual query
row inserts in SQLite. However, if there are multiples, we'll continue.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="k">if</span><spanclass="p">(</span><spanclass="nx">values</span><spanclass="p">.</span><spanclass="nx">length</span><spanclass="o">===</span><spanclass="mi">1</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="kd">var</span><spanclass="nx">sql</span><spanclass="o">=</span><spanclass="s1">'insert into '</span><spanclass="o">+</span><spanclass="nx">table</span><spanclass="o">+</span><spanclass="s1">''</span><spanclass="p">;</span>
<spanclass="kd">var</span><spanclass="nx">blocks</span><spanclass="o">=</span><spanclass="p">[];</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>SQLite requires us to build the multi-row insert as a listing of select with
then join them all together with select unions to complete the queries.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="k">for</span><spanclass="p">(</span><spanclass="kd">var</span><spanclass="nx">i</span><spanclass="o">=</span><spanclass="mi">0</span><spanclass="p">,</span><spanclass="nx">l</span><spanclass="o">=</span><spanclass="nx">columns</span><spanclass="p">.</span><spanclass="nx">length</span><spanclass="p">;</span><spanclass="nx">i</span><spanclass="o"><</span><spanclass="nx">l</span><spanclass="p">;</span><spanclass="nx">i</span><spanclass="o">++</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="nx">blocks</span><spanclass="p">.</span><spanclass="nx">push</span><spanclass="p">(</span><spanclass="s1">'? as '</span><spanclass="o">+</span><spanclass="k">this</span><spanclass="p">.</span><spanclass="nx">wrap</span><spanclass="p">(</span><spanclass="nx">columns</span><spanclass="p">[</span><spanclass="nx">i</span><spanclass="p">]));</span>
<spanclass="k">return</span><spanclass="s2">"insert into "</span><spanclass="o">+</span><spanclass="nx">table</span><spanclass="o">+</span><spanclass="s2">" ("</span><spanclass="o">+</span><spanclass="k">this</span><spanclass="p">.</span><spanclass="nx">columnize</span><spanclass="p">(</span><spanclass="nx">columns</span><spanclass="p">)</span><spanclass="o">+</span><spanclass="s2">") select "</span><spanclass="o">+</span><spanclass="nx">blocks</span><spanclass="p">.</span><spanclass="nx">join</span><spanclass="p">(</span><spanclass="s1">' union all select '</span><spanclass="p">);</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile a truncate table statement into SQL.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileTruncate</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">qb</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="nx">sql</span><spanclass="p">.</span><spanclass="nx">push</span><spanclass="p">(</span><spanclass="s1">'delete from sqlite_sequence where name = '</span><spanclass="o">+</span><spanclass="nx">table</span><spanclass="p">);</span>
<spanclass="nx">sql</span><spanclass="p">.</span><spanclass="nx">push</span><spanclass="p">(</span><spanclass="s1">'delete from '</span><spanclass="o">+</span><spanclass="nx">table</span><spanclass="p">);</span>