knex/docs/clients/base/sqlite3.html
2013-09-13 13:52:38 -04:00

152 lines
41 KiB
HTML

<!DOCTYPE html><html lang="en"><head><title>clients/base/sqlite3</title></head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0"><meta name="groc-relative-root" content="../../"><meta name="groc-document-path" content="clients/base/sqlite3"><meta name="groc-project-path" content="clients/base/sqlite3.js"><link rel="stylesheet" type="text/css" media="all" href="../../assets/style.css"><script type="text/javascript" src="../../assets/behavior.js"></script><body><div id="meta"><div class="file-path">clients/base/sqlite3.js</div></div><div id="document"><div class="segment"><div class="comments"><div class="wrapper"><h2 id="sqlite3">SQLite3</h2></div></div></div><div class="segment"><div class="code"><div class="wrapper"><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">define</span><span class="p">)</span> <span class="p">{</span>
<span class="s2">&quot;use strict&quot;</span><span class="p">;</span></div></div></div><div class="segment"><div class="comments"><div class="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><div class="code"><div class="wrapper"><span class="nx">define</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="nx">exports</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">_</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;underscore&#39;</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">baseGrammar</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./grammar&#39;</span><span class="p">).</span><span class="nx">BaseGrammar</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">baseSchemaGrammar</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./schemagrammar&#39;</span><span class="p">).</span><span class="nx">BaseSchemaGrammar</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">ClientBase</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;../base&#39;</span><span class="p">).</span><span class="nx">ClientBase</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">Helpers</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;../../lib/helpers&#39;</span><span class="p">).</span><span class="nx">Helpers</span><span class="p">;</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Extent the "base" client, just specifying the dialect,
since the actual implementations will differ on the client
and server, we'll leave everything else to be handled in
sub-classes of this object.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">exports</span><span class="p">.</span><span class="nx">Client</span> <span class="o">=</span> <span class="nx">ClientBase</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
<span class="nx">dialect</span><span class="o">:</span> <span class="s1">&#39;sqlite3&#39;</span>
<span class="p">});</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Extends the standard sql grammar, with any SQLite specific
dialect oddities.</p></div></div><div class="code"><div class="wrapper"> <span class="kd">var</span> <span class="nx">grammar</span> <span class="o">=</span> <span class="nx">exports</span><span class="p">.</span><span class="nx">grammar</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">defaults</span><span class="p">({</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>The keyword identifier wrapper format.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">wrapValue</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="p">(</span><span class="nx">value</span> <span class="o">!==</span> <span class="s1">&#39;*&#39;</span> <span class="o">?</span> <span class="nx">Helpers</span><span class="p">.</span><span class="nx">format</span><span class="p">(</span><span class="s1">&#39;&quot;%s&quot;&#39;</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span> <span class="o">:</span> <span class="s2">&quot;*&quot;</span><span class="p">);</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile the "order by" portions of the query.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileOrders</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">,</span> <span class="nx">orders</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">orders</span><span class="p">.</span><span class="nx">length</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>
<span class="k">return</span> <span class="s2">&quot;order by &quot;</span> <span class="o">+</span> <span class="nx">orders</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">order</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">order</span><span class="p">.</span><span class="nx">column</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot; collate nocase &quot;</span> <span class="o">+</span> <span class="nx">order</span><span class="p">.</span><span class="nx">direction</span><span class="p">;</span>
<span class="p">},</span> <span class="k">this</span><span class="p">).</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;, &#39;</span><span class="p">);</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile an insert statement into SQL.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileInsert</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">values</span> <span class="o">=</span> <span class="nx">qb</span><span class="p">.</span><span class="nx">values</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">table</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">table</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">columns</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">pluck</span><span class="p">(</span><span class="nx">values</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="mi">0</span><span class="p">);</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>If there are any "where" clauses, we need to omit
any bindings that may have been associated with them.</p></div></div><div class="code"><div class="wrapper"> <span class="k">if</span> <span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">wheres</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">clearWhereBindings</span><span class="p">(</span><span class="nx">qb</span><span class="p">);</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>If there is only one record being inserted, we will just use the usual query
grammar insert builder because no special syntax is needed for the single
row inserts in SQLite. However, if there are multiples, we'll continue.</p></div></div><div class="code"><div class="wrapper"> <span class="k">if</span> <span class="p">(</span><span class="nx">values</span><span class="p">.</span><span class="nx">length</span> <span class="o">===</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">sql</span> <span class="o">=</span> <span class="s1">&#39;insert into &#39;</span> <span class="o">+</span> <span class="nx">table</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">columns</span><span class="p">.</span><span class="nx">length</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">sql</span> <span class="o">+=</span> <span class="s1">&#39;default values&#39;</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="nx">sql</span> <span class="o">+=</span> <span class="s2">&quot;(&quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">columnize</span><span class="p">(</span><span class="nx">columns</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;) values &quot;</span> <span class="o">+</span> <span class="s2">&quot;(&quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">parameterize</span><span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx">pluck</span><span class="p">(</span><span class="nx">values</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="mi">1</span><span class="p">))</span> <span class="o">+</span> <span class="s2">&quot;)&quot;</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">return</span> <span class="nx">sql</span><span class="p">;</span>
<span class="p">}</span>
<span class="kd">var</span> <span class="nx">blocks</span> <span class="o">=</span> <span class="p">[];</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>SQLite requires us to build the multi-row insert as a listing of select with
unions joining them together. So we'll build out this list of columns and
then join them all together with select unions to complete the queries.</p></div></div><div class="code"><div class="wrapper"> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">columns</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">blocks</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s1">&#39;? as &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">columns</span><span class="p">[</span><span class="nx">i</span><span class="p">]));</span>
<span class="p">}</span>
<span class="kd">var</span> <span class="nx">joinedColumns</span> <span class="o">=</span> <span class="nx">blocks</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;, &#39;</span><span class="p">);</span>
<span class="nx">blocks</span> <span class="o">=</span> <span class="p">[];</span>
<span class="k">for</span> <span class="p">(</span><span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">values</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">blocks</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">joinedColumns</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">return</span> <span class="s2">&quot;insert into &quot;</span> <span class="o">+</span> <span class="nx">table</span> <span class="o">+</span> <span class="s2">&quot; (&quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">columnize</span><span class="p">(</span><span class="nx">columns</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;) select &quot;</span> <span class="o">+</span> <span class="nx">blocks</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39; union all select &#39;</span><span class="p">);</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile a truncate table statement into SQL.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileTruncate</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">qb</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">sql</span> <span class="o">=</span> <span class="p">[];</span>
<span class="kd">var</span> <span class="nx">table</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">table</span><span class="p">);</span>
<span class="nx">sql</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s1">&#39;delete from sqlite_sequence where name = &#39;</span> <span class="o">+</span> <span class="nx">table</span><span class="p">);</span>
<span class="nx">sql</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s1">&#39;delete from &#39;</span> <span class="o">+</span> <span class="nx">table</span><span class="p">);</span>
<span class="k">return</span> <span class="nx">sql</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">},</span> <span class="nx">baseGrammar</span><span class="p">);</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Grammar for the schema builder.</p></div></div><div class="code"><div class="wrapper"> <span class="kd">var</span> <span class="nx">schemaGrammar</span> <span class="o">=</span> <span class="nx">exports</span><span class="p">.</span><span class="nx">schemaGrammar</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">defaults</span><span class="p">({</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>The possible column modifiers.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">modifiers</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;Nullable&#39;</span><span class="p">,</span> <span class="s1">&#39;Default&#39;</span><span class="p">,</span> <span class="s1">&#39;Increment&#39;</span><span class="p">],</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile the query to determine if a table exists.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileTableExists</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="k">return</span> <span class="s2">&quot;select * from sqlite_master where type = &#39;table&#39; and name = ?&quot;</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile the query to determine if a column exists.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileColumnExists</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">blueprint</span><span class="p">.</span><span class="nx">bindings</span> <span class="o">=</span> <span class="p">[];</span>
<span class="k">return</span> <span class="s2">&quot;PRAGMA table_info(&quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;)&quot;</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile a create table command.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileCreateTable</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">columns</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">getColumns</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">).</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;, &#39;</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">sql</span> <span class="o">=</span> <span class="s1">&#39;create table &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; (&#39;</span> <span class="o">+</span> <span class="nx">columns</span><span class="p">;</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>SQLite forces primary keys to be added when the table is initially created
so we will need to check for a primary key commands and add the columns
to the table's declaration here so they can be created on the tables.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">sql</span> <span class="o">+=</span> <span class="k">this</span><span class="p">.</span><span class="nx">addForeignKeys</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">);</span>
<span class="nx">sql</span> <span class="o">+=</span> <span class="k">this</span><span class="p">.</span><span class="nx">addPrimaryKeys</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">)</span> <span class="o">||</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
<span class="nx">sql</span> <span class="o">+=</span><span class="s1">&#39;)&#39;</span><span class="p">;</span>
<span class="k">return</span> <span class="nx">sql</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Get the foreign key syntax for a table creation statement.
Once we have all the foreign key commands for the table creation statement
we'll loop through each of them and add them to the create table SQL we
are building, since SQLite needs foreign keys on the tables creation.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">addForeignKeys</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">sql</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">commands</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">getCommandsByName</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">,</span> <span class="s1">&#39;foreign&#39;</span><span class="p">);</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">commands</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">command</span> <span class="o">=</span> <span class="nx">commands</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
<span class="kd">var</span> <span class="nx">column</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">columnize</span><span class="p">(</span><span class="nx">command</span><span class="p">.</span><span class="nx">columns</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">foreignTable</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">command</span><span class="p">.</span><span class="nx">foreignTable</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">foreignColumn</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">columnize</span><span class="p">([</span><span class="nx">command</span><span class="p">.</span><span class="nx">foreignColumn</span><span class="p">]);</span>
<span class="nx">sql</span> <span class="o">+=</span> <span class="s1">&#39;, foreign key(&#39;</span> <span class="o">+</span> <span class="nx">column</span> <span class="o">+</span> <span class="s1">&#39;) references &#39;</span> <span class="o">+</span> <span class="nx">foreignTable</span> <span class="o">+</span> <span class="s1">&#39;(&#39;</span> <span class="o">+</span> <span class="nx">foreignColumn</span> <span class="o">+</span> <span class="s1">&#39;)&#39;</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">return</span> <span class="nx">sql</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Get the primary key syntax for a table creation statement.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">addPrimaryKeys</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">primary</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">getCommandByName</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">,</span> <span class="s1">&#39;primary&#39;</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">primary</span><span class="p">)</span> <span class="p">{</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Ensure that autoincrement columns aren't handled here, this is handled
alongside the autoincrement clause.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">primary</span><span class="p">.</span><span class="nx">columns</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">reduce</span><span class="p">(</span><span class="nx">primary</span><span class="p">.</span><span class="nx">columns</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">memo</span><span class="p">,</span> <span class="nx">column</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">column</span><span class="p">.</span><span class="nx">autoIncrement</span> <span class="o">!==</span> <span class="kc">true</span><span class="p">)</span> <span class="nx">memo</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">column</span><span class="p">);</span>
<span class="k">return</span> <span class="nx">memo</span><span class="p">;</span>
<span class="p">},</span> <span class="p">[]);</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">primary</span><span class="p">.</span><span class="nx">columns</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">columns</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">columnize</span><span class="p">(</span><span class="nx">primary</span><span class="p">.</span><span class="nx">columns</span><span class="p">);</span>
<span class="k">return</span> <span class="s1">&#39;, primary key (&#39;</span> <span class="o">+</span> <span class="nx">columns</span> <span class="o">+</span> <span class="s1">&#39;)&#39;</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile alter table commands for adding columns</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileAdd</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">table</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">columns</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">prefixArray</span><span class="p">(</span><span class="s1">&#39;add column&#39;</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">getColumns</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">));</span>
<span class="kd">var</span> <span class="nx">statements</span> <span class="o">=</span> <span class="p">[];</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">columns</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">statements</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s1">&#39;alter table &#39;</span> <span class="o">+</span> <span class="nx">table</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="nx">columns</span><span class="p">[</span><span class="nx">i</span><span class="p">]);</span>
<span class="p">}</span>
<span class="k">return</span> <span class="nx">statements</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile a unique key command.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileUnique</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">,</span> <span class="nx">command</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">columns</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">columnize</span><span class="p">(</span><span class="nx">command</span><span class="p">.</span><span class="nx">columns</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">table</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">);</span>
<span class="k">return</span> <span class="s1">&#39;create unique index &#39;</span> <span class="o">+</span> <span class="nx">command</span><span class="p">.</span><span class="nx">index</span> <span class="o">+</span> <span class="s1">&#39; on &#39;</span> <span class="o">+</span> <span class="nx">table</span> <span class="o">+</span> <span class="s1">&#39; (&#39;</span> <span class="o">+</span> <span class="nx">columns</span> <span class="o">+</span> <span class="s1">&#39;)&#39;</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile a plain index key command.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileIndex</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">,</span> <span class="nx">command</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">columns</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">columnize</span><span class="p">(</span><span class="nx">command</span><span class="p">.</span><span class="nx">columns</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">table</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">);</span>
<span class="k">return</span> <span class="s1">&#39;create index &#39;</span> <span class="o">+</span> <span class="nx">command</span><span class="p">.</span><span class="nx">index</span> <span class="o">+</span> <span class="s1">&#39; on &#39;</span> <span class="o">+</span> <span class="nx">table</span> <span class="o">+</span> <span class="s1">&#39; (&#39;</span> <span class="o">+</span> <span class="nx">columns</span> <span class="o">+</span> <span class="s1">&#39;)&#39;</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile a foreign key command.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileForeign</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Handled on table creation...</p></div></div><div class="code"><div class="wrapper"> <span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile a drop column command.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileDropColumn</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s2">&quot;Drop column not supported for SQLite.&quot;</span><span class="p">);</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile a drop unique key command.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileDropUnique</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">,</span> <span class="nx">command</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;drop index &#39;</span> <span class="o">+</span> <span class="nx">command</span><span class="p">.</span><span class="nx">index</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile a rename table command.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileRenameTable</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">,</span> <span class="nx">command</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;alter table &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; rename to &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">command</span><span class="p">.</span><span class="nx">to</span><span class="p">);</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile a rename column command.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileRenameColumn</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">,</span> <span class="nx">command</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;__rename_column__&#39;</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Create the column definition for a integer type.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">typeInteger</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;integer&#39;</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Create the column definition for a float type.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">typeFloat</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;float&#39;</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Create the column definition for a decimal type.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">typeDecimal</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;float&#39;</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Create the column definition for a boolean type.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">typeBoolean</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;tinyint&#39;</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Create the column definition for a enum type.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">typeEnum</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;varchar&#39;</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Create the column definition for a date-time type.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">typeDateTime</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;datetime&#39;</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Create the column definition for a timestamp type.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">typeTimestamp</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;datetime&#39;</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Get the SQL for an auto-increment column modifier.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">modifyIncrement</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">,</span> <span class="nx">column</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">column</span><span class="p">.</span><span class="nx">autoIncrement</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="nx">column</span><span class="p">.</span><span class="nx">type</span> <span class="o">==</span> <span class="s1">&#39;integer&#39;</span> <span class="o">||</span> <span class="nx">column</span><span class="p">.</span><span class="nx">type</span> <span class="o">==</span> <span class="s1">&#39;bigInteger&#39;</span><span class="p">))</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39; primary key autoincrement not null&#39;</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">},</span> <span class="nx">baseSchemaGrammar</span><span class="p">,</span> <span class="nx">grammar</span><span class="p">);</span>
<span class="p">});</span>
<span class="p">})(</span>
<span class="k">typeof</span> <span class="nx">define</span> <span class="o">===</span> <span class="s1">&#39;function&#39;</span> <span class="o">&amp;&amp;</span> <span class="nx">define</span><span class="p">.</span><span class="nx">amd</span> <span class="o">?</span> <span class="nx">define</span> <span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">factory</span><span class="p">)</span> <span class="p">{</span> <span class="nx">factory</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="nx">exports</span><span class="p">);</span> <span class="p">}</span>
<span class="p">);</span></div></div></div></div></body></html>