mirror of
https://github.com/knex/knex.git
synced 2025-08-01 21:32:11 +00:00
152 lines
41 KiB
HTML
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">"use strict"</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">'underscore'</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">'./grammar'</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">'./schemagrammar'</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">'../base'</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">'../../lib/helpers'</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">'sqlite3'</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">'*'</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">'"%s"'</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span> <span class="o">:</span> <span class="s2">"*"</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">"order by "</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">" collate nocase "</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">', '</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">></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">'insert into '</span> <span class="o">+</span> <span class="nx">table</span> <span class="o">+</span> <span class="s1">' '</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">'default values'</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">"("</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">") values "</span> <span class="o">+</span> <span class="s2">"("</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">")"</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"><</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">'? as '</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">', '</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"><</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">"insert into "</span> <span class="o">+</span> <span class="nx">table</span> <span class="o">+</span> <span class="s2">" ("</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">") select "</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">' union all select '</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">'delete from sqlite_sequence where name = '</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">'delete from '</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">'Nullable'</span><span class="p">,</span> <span class="s1">'Default'</span><span class="p">,</span> <span class="s1">'Increment'</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">"select * from sqlite_master where type = 'table' and name = ?"</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">"PRAGMA table_info("</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">")"</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">', '</span><span class="p">);</span>
|
|
<span class="kd">var</span> <span class="nx">sql</span> <span class="o">=</span> <span class="s1">'create 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="o">+</span> <span class="s1">' ('</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">''</span><span class="p">;</span>
|
|
<span class="nx">sql</span> <span class="o">+=</span><span class="s1">')'</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">''</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">'foreign'</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"><</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">', foreign key('</span> <span class="o">+</span> <span class="nx">column</span> <span class="o">+</span> <span class="s1">') references '</span> <span class="o">+</span> <span class="nx">foreignTable</span> <span class="o">+</span> <span class="s1">'('</span> <span class="o">+</span> <span class="nx">foreignColumn</span> <span class="o">+</span> <span class="s1">')'</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">'primary'</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">></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">', primary key ('</span> <span class="o">+</span> <span class="nx">columns</span> <span class="o">+</span> <span class="s1">')'</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">'add column'</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"><</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">'alter table '</span> <span class="o">+</span> <span class="nx">table</span> <span class="o">+</span> <span class="s1">' '</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">'create unique index '</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">' on '</span> <span class="o">+</span> <span class="nx">table</span> <span class="o">+</span> <span class="s1">' ('</span> <span class="o">+</span> <span class="nx">columns</span> <span class="o">+</span> <span class="s1">')'</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">'create index '</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">' on '</span> <span class="o">+</span> <span class="nx">table</span> <span class="o">+</span> <span class="s1">' ('</span> <span class="o">+</span> <span class="nx">columns</span> <span class="o">+</span> <span class="s1">')'</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">"Drop column not supported for SQLite."</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">'drop index '</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">'alter 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="o">+</span> <span class="s1">' rename to '</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">'__rename_column__'</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">'integer'</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">'float'</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">'float'</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">'tinyint'</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">'varchar'</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">'datetime'</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">'datetime'</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">&&</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">'integer'</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">'bigInteger'</span><span class="p">))</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="s1">' primary key autoincrement not null'</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">'function'</span> <span class="o">&&</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> |