<spanclass="kd">var</span><spanclass="nx">baseSchemaGrammar</span><spanclass="o">=</span><spanclass="nx">require</span><spanclass="p">(</span><spanclass="s1">'../schemagrammar'</span><spanclass="p">).</span><spanclass="nx">baseSchemaGrammar</span><spanclass="p">;</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Grammar for the schema builder.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">exports</span><spanclass="p">.</span><spanclass="nx">schemaGrammar</span><spanclass="o">=</span><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">defaults</span><spanclass="p">({</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>The possible column modifiers.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">modifiers</span><spanclass="o">:</span><spanclass="p">[</span><spanclass="s1">'Nullable'</span><spanclass="p">,</span><spanclass="s1">'Default'</span><spanclass="p">,</span><spanclass="s1">'Increment'</span><spanclass="p">],</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile the query to determine if a table exists.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileTableExists</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">()</span><spanclass="p">{</span>
<spanclass="k">return</span><spanclass="s2">"select * from sqlite_master where type = 'table' and name = ?"</span><spanclass="p">;</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile the query to determine if a column exists.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileColumnExists</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile a create table command.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileCreateTable</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="kd">var</span><spanclass="nx">sql</span><spanclass="o">=</span><spanclass="s1">'create table '</span><spanclass="o">+</span><spanclass="k">this</span><spanclass="p">.</span><spanclass="nx">wrapTable</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">)</span><spanclass="o">+</span><spanclass="s1">' ('</span><spanclass="o">+</span><spanclass="nx">columns</span><spanclass="p">;</span></div></div></div><divclass="segment"><divclass="comments"><divclass="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><divclass="code"><divclass="wrapper"><spanclass="nx">sql</span><spanclass="o">+=</span><spanclass="k">this</span><spanclass="p">.</span><spanclass="nx">addForeignKeys</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">);</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="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><divclass="code"><divclass="wrapper"><spanclass="nx">addForeignKeys</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Get the primary key syntax for a table creation statement.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">addPrimaryKeys</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="k">if</span><spanclass="p">(</span><spanclass="nx">primary</span><spanclass="p">)</span><spanclass="p">{</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Ensure that autoincrement columns aren't handled here, this is handled
alongside the autoincrement clause.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">primary</span><spanclass="p">.</span><spanclass="nx">columns</span><spanclass="o">=</span><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">reduce</span><spanclass="p">(</span><spanclass="nx">primary</span><spanclass="p">.</span><spanclass="nx">columns</span><spanclass="p">,</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">memo</span><spanclass="p">,</span><spanclass="nx">column</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile alter table commands for adding columns</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileAdd</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile a unique key command.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileUnique</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">,</span><spanclass="nx">command</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="k">return</span><spanclass="s1">'create unique index '</span><spanclass="o">+</span><spanclass="nx">command</span><spanclass="p">.</span><spanclass="nx">index</span><spanclass="o">+</span><spanclass="s1">' on '</span><spanclass="o">+</span><spanclass="nx">table</span><spanclass="o">+</span><spanclass="s1">' ('</span><spanclass="o">+</span><spanclass="nx">columns</span><spanclass="o">+</span><spanclass="s1">')'</span><spanclass="p">;</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile a plain index key command.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileIndex</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">,</span><spanclass="nx">command</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="k">return</span><spanclass="s1">'create index '</span><spanclass="o">+</span><spanclass="nx">command</span><spanclass="p">.</span><spanclass="nx">index</span><spanclass="o">+</span><spanclass="s1">' on '</span><spanclass="o">+</span><spanclass="nx">table</span><spanclass="o">+</span><spanclass="s1">' ('</span><spanclass="o">+</span><spanclass="nx">columns</span><spanclass="o">+</span><spanclass="s1">')'</span><spanclass="p">;</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile a foreign key command.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileForeign</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">()</span><spanclass="p">{</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Handled on table creation...</p></div></div><divclass="code"><divclass="wrapper"><spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile a drop column command.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileDropColumn</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">()</span><spanclass="p">{</span>
<spanclass="k">throw</span><spanclass="k">new</span><spanclass="nb">Error</span><spanclass="p">(</span><spanclass="s2">"Drop column not supported for SQLite."</span><spanclass="p">);</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile a drop unique key command.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileDropUnique</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">,</span><spanclass="nx">command</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="k">return</span><spanclass="s1">'drop index '</span><spanclass="o">+</span><spanclass="nx">command</span><spanclass="p">.</span><spanclass="nx">index</span><spanclass="p">;</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile a rename table command.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileRenameTable</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">,</span><spanclass="nx">command</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="k">return</span><spanclass="s1">'alter table '</span><spanclass="o">+</span><spanclass="k">this</span><spanclass="p">.</span><spanclass="nx">wrapTable</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">)</span><spanclass="o">+</span><spanclass="s1">' rename to '</span><spanclass="o">+</span><spanclass="k">this</span><spanclass="p">.</span><spanclass="nx">wrapTable</span><spanclass="p">(</span><spanclass="nx">command</span><spanclass="p">.</span><spanclass="nx">to</span><spanclass="p">);</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile a rename column command.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileRenameColumn</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">,</span><spanclass="nx">command</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Create the column definition for a integer type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeInteger</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">()</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Create the column definition for a float type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeFloat</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">()</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Create the column definition for a decimal type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeDecimal</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">()</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Create the column definition for a boolean type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeBoolean</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">()</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Create the column definition for a enum type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeEnum</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">()</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Create the column definition for a date-time type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeDateTime</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">()</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Create the column definition for a timestamp type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeTimestamp</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">()</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Get the SQL for an auto-increment column modifier.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">modifyIncrement</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">,</span><spanclass="nx">column</span><spanclass="p">)</span><spanclass="p">{</span>