knex/docs/clients/base/schemagrammar.html
2013-11-25 02:06:42 -05:00

156 lines
41 KiB
HTML

<!DOCTYPE html><html lang="en"><head><title>clients/base/schemagrammar</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/schemagrammar"><meta name="groc-project-path" content="clients/base/schemagrammar.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/schemagrammar.js</div></div><div id="document"><div class="segment"><div class="comments"><div class="wrapper"><h2 id="schemagrammar">SchemaGrammar</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 "SchemaGrammar" is a layer which helps in compiling
valid data definition language (DDL) statements in
to create, alter, or destroy the various tables, columns,
and metadata in our database schema. These functions
are combined with dialect specific "SchemaGrammar"
functions to keep the interface database agnostic.</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;lodash&#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">SchemaBuilder</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;../../lib/schemabuilder&#39;</span><span class="p">).</span><span class="nx">SchemaBuilder</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>
<span class="kd">var</span> <span class="nx">Raw</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;../../lib/raw&#39;</span><span class="p">).</span><span class="nx">Raw</span><span class="p">;</span>
<span class="nx">exports</span><span class="p">.</span><span class="nx">baseSchemaGrammar</span> <span class="o">=</span> <span class="p">{</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>The toSql on the "schema" is different than that on the "builder",
it produces an array of sql statements to be used in the creation
or modification of the query, which are each run in sequence
on the same connection.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">toSql</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">builder</span><span class="p">)</span> <span class="p">{</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Clone the builder, before we go about working with the columns &amp; commands.
TODO: Clean this up.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">builder</span> <span class="o">=</span> <span class="nx">builder</span><span class="p">.</span><span class="nx">clone</span><span class="p">();</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Add the commands that are implied by the blueprint.</p></div></div><div class="code"><div class="wrapper"> <span class="k">if</span> <span class="p">(</span><span class="nx">builder</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="o">&amp;&amp;</span> <span class="o">!</span><span class="nx">builder</span><span class="p">.</span><span class="nx">creating</span><span class="p">())</span> <span class="p">{</span>
<span class="nx">builder</span><span class="p">.</span><span class="nx">commands</span><span class="p">.</span><span class="nx">unshift</span><span class="p">({</span><span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;add&#39;</span><span class="p">});</span>
<span class="p">}</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Add an "additional" command, for any extra dialect-specific logic.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">builder</span><span class="p">.</span><span class="nx">commands</span><span class="p">.</span><span class="nx">push</span><span class="p">({</span><span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;additional&#39;</span><span class="p">});</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Add indicies</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">builder</span><span class="p">.</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="kd">var</span> <span class="nx">column</span> <span class="o">=</span> <span class="nx">builder</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="kd">var</span> <span class="nx">indices</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;primary&#39;</span><span class="p">,</span> <span class="s1">&#39;unique&#39;</span><span class="p">,</span> <span class="s1">&#39;index&#39;</span><span class="p">,</span> <span class="s1">&#39;foreign&#39;</span><span class="p">];</span>
<span class="nx">continueIndex</span><span class="o">:</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l2</span> <span class="o">=</span> <span class="nx">indices</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i2</span> <span class="o">&lt;</span> <span class="nx">l2</span><span class="p">;</span> <span class="nx">i2</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">index</span> <span class="o">=</span> <span class="nx">indices</span><span class="p">[</span><span class="nx">i2</span><span class="p">];</span>
<span class="kd">var</span> <span class="nx">indexVar</span> <span class="o">=</span> <span class="s1">&#39;is&#39;</span> <span class="o">+</span> <span class="nx">Helpers</span><span class="p">.</span><span class="nx">capitalize</span><span class="p">(</span><span class="nx">index</span><span class="p">);</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>If the index has been specified on the given column, but is simply
equal to "true" (boolean), no name has been specified for this
index, so we will simply call the index methods without one.</p></div></div><div class="code"><div class="wrapper"> <span class="k">if</span> <span class="p">(</span><span class="nx">column</span><span class="p">[</span><span class="nx">indexVar</span><span class="p">]</span> <span class="o">===</span> <span class="kc">true</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">builder</span><span class="p">[</span><span class="nx">index</span><span class="p">](</span><span class="nx">column</span><span class="p">,</span> <span class="kc">null</span><span class="p">);</span>
<span class="k">continue</span> <span class="nx">continueIndex</span><span class="p">;</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>If the index has been specified on the column and it is something
other than boolean true, we will assume a name was provided on
the index specification, and pass in the name to the method.</p></div></div><div class="code"><div class="wrapper"> <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx">has</span><span class="p">(</span><span class="nx">column</span><span class="p">,</span> <span class="nx">indexVar</span><span class="p">))</span> <span class="p">{</span>
<span class="nx">builder</span><span class="p">[</span><span class="nx">index</span><span class="p">](</span><span class="nx">column</span><span class="p">.</span><span class="nx">name</span><span class="p">,</span> <span class="nx">column</span><span class="p">[</span><span class="nx">indexVar</span><span class="p">],</span> <span class="nx">column</span><span class="p">);</span>
<span class="k">continue</span> <span class="nx">continueIndex</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="kd">var</span> <span class="nx">statements</span> <span class="o">=</span> <span class="p">[];</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Each type of command has a corresponding compiler function on the schema
grammar which is used to build the necessary SQL statements to build
the blueprint element, so we'll just call that compilers function.</p></div></div><div class="code"><div class="wrapper"> <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">builder</span><span class="p">.</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">builder</span><span class="p">.</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">method</span> <span class="o">=</span> <span class="s1">&#39;compile&#39;</span> <span class="o">+</span> <span class="nx">Helpers</span><span class="p">.</span><span class="nx">capitalize</span><span class="p">(</span><span class="nx">command</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx">has</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">method</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="k">this</span><span class="p">[</span><span class="nx">method</span><span class="p">](</span><span class="nx">builder</span><span class="p">,</span> <span class="nx">command</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">sql</span><span class="p">)</span> <span class="nx">statements</span> <span class="o">=</span> <span class="nx">statements</span><span class="p">.</span><span class="nx">concat</span><span class="p">(</span><span class="nx">sql</span><span class="p">);</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 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="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">sql</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">command</span><span class="p">.</span><span class="nx">foreignTable</span> <span class="o">&amp;&amp;</span> <span class="nx">command</span><span class="p">.</span><span class="nx">foreignColumn</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">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="s2">&quot;alter table &quot;</span> <span class="o">+</span> <span class="nx">table</span> <span class="o">+</span> <span class="s2">&quot; add constraint &quot;</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="s2">&quot; &quot;</span><span class="p">;</span>
<span class="nx">sql</span> <span class="o">+=</span> <span class="s2">&quot;foreign key (&quot;</span> <span class="o">+</span> <span class="nx">column</span> <span class="o">+</span> <span class="s2">&quot;) references &quot;</span> <span class="o">+</span> <span class="nx">foreignTable</span> <span class="o">+</span> <span class="s2">&quot; (&quot;</span> <span class="o">+</span> <span class="nx">foreignColumn</span> <span class="o">+</span> <span class="s2">&quot;)&quot;</span><span class="p">;</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Once we have the basic foreign key creation statement constructed we can
build out the syntax for what should happen on an update or delete of
the affected columns, which will get something like "cascade", etc.</p></div></div><div class="code"><div class="wrapper"> <span class="k">if</span> <span class="p">(</span><span class="nx">command</span><span class="p">.</span><span class="nx">commandOnDelete</span><span class="p">)</span> <span class="nx">sql</span> <span class="o">+=</span> <span class="s2">&quot; on delete &quot;</span> <span class="o">+</span> <span class="nx">command</span><span class="p">.</span><span class="nx">commandOnDelete</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">command</span><span class="p">.</span><span class="nx">commandOnUpdate</span><span class="p">)</span> <span class="nx">sql</span> <span class="o">+=</span> <span class="s2">&quot; on update &quot;</span> <span class="o">+</span> <span class="nx">command</span><span class="p">.</span><span class="nx">commandOnUpdate</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>Each of the column types have their own compiler functions which are
responsible for turning the column definition into its SQL format
for the platform. Then column modifiers are compiled and added.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">getColumns</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="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">blueprint</span><span class="p">.</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="kd">var</span> <span class="nx">column</span> <span class="o">=</span> <span class="nx">blueprint</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="kd">var</span> <span class="nx">sql</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">column</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">getType</span><span class="p">(</span><span class="nx">column</span><span class="p">,</span> <span class="nx">blueprint</span><span class="p">);</span>
<span class="nx">columns</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">addModifiers</span><span class="p">(</span><span class="nx">sql</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">return</span> <span class="nx">columns</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Add the column modifiers to the definition.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">addModifiers</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">sql</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">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="k">this</span><span class="p">.</span><span class="nx">modifiers</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">modifier</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">modifiers</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
<span class="kd">var</span> <span class="nx">method</span> <span class="o">=</span> <span class="s2">&quot;modify&quot;</span> <span class="o">+</span> <span class="nx">modifier</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx">has</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">method</span><span class="p">))</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">method</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="o">||</span> <span class="s1">&#39;&#39;</span><span class="p">;</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 SQL for the column data type.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">getType</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">column</span><span class="p">,</span> <span class="nx">blueprint</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="s1">&#39;type&#39;</span> <span class="o">+</span> <span class="nx">Helpers</span><span class="p">.</span><span class="nx">capitalize</span><span class="p">(</span><span class="nx">column</span><span class="p">.</span><span class="nx">type</span><span class="p">)](</span><span class="nx">column</span><span class="p">,</span> <span class="nx">blueprint</span><span class="p">);</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Add a prefix to an array of values, utilized in the client libs.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">prefixArray</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">prefix</span><span class="p">,</span> <span class="nx">values</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">values</span><span class="p">,</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="nx">prefix</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="nx">value</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>Wrap a table in keyword identifiers.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">wrapTable</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">table</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">table</span> <span class="k">instanceof</span> <span class="nx">SchemaBuilder</span><span class="p">)</span> <span class="nx">table</span> <span class="o">=</span> <span class="nx">table</span><span class="p">.</span><span class="nx">table</span><span class="p">;</span>
<span class="k">return</span> <span class="nx">baseGrammar</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">table</span><span class="p">);</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Wrap a value in keyword identifiers.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">wrap</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">if</span> <span class="p">(</span><span class="nx">value</span> <span class="o">&amp;&amp;</span> <span class="nx">value</span><span class="p">.</span><span class="nx">name</span><span class="p">)</span> <span class="nx">value</span> <span class="o">=</span> <span class="nx">value</span><span class="p">.</span><span class="nx">name</span><span class="p">;</span>
<span class="k">return</span> <span class="nx">baseGrammar</span><span class="p">.</span><span class="nx">wrap</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">value</span><span class="p">);</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Format a value so that it can be used in "default" clauses.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">getDefaultValue</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">if</span> <span class="p">(</span><span class="nx">value</span> <span class="k">instanceof</span> <span class="nx">Raw</span><span class="p">)</span> <span class="k">return</span> <span class="nx">value</span><span class="p">.</span><span class="nx">sql</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">value</span> <span class="o">===</span> <span class="kc">true</span> <span class="o">||</span> <span class="nx">value</span> <span class="o">===</span> <span class="kc">false</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nb">parseInt</span><span class="p">(</span><span class="nx">value</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">return</span> <span class="s1">&#39;&#39;</span> <span class="o">+</span> <span class="nx">value</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 command if it exists on the blueprint.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">getCommandByName</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">name</span><span class="p">)</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="nx">name</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">commands</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">return</span> <span class="nx">commands</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Get all of the commands with a given name.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">getCommandsByName</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">name</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">filter</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">.</span><span class="nx">commands</span><span class="p">,</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="nx">value</span><span class="p">.</span><span class="nx">name</span> <span class="o">==</span> <span class="nx">name</span><span class="p">;</span> <span class="p">})</span> <span class="o">||</span> <span class="p">[];</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Used to compile any database specific items.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileAdditional</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>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="k">return</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="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 drop table command.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileDropTable</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="k">return</span> <span class="s1">&#39;drop 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="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile a drop table (if exists) command.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileDropTableIfExists</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="k">return</span> <span class="s1">&#39;drop table if exists &#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="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile a drop index command.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileDropIndex</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>Default for a biginteger type in database in other databases.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">typeBigInteger</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">column</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">typeInteger</span><span class="p">(</span><span class="nx">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 string type.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">typeString</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">column</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="s2">&quot;varchar(&quot;</span> <span class="o">+</span> <span class="nx">column</span><span class="p">.</span><span class="nx">length</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>Create the column definition for a text type.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">typeText</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;text&#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 tiny integer type.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">typeTinyInteger</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 time type.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">typeTime</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;time&#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 type.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">typeDate</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;date&#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 binary type.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">typeBinary</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;blob&#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 json type.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">typeJson</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;text&#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 uuid type.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">typeUuid</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;char(36)&#39;</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Create a specific type</p></div></div><div class="code"><div class="wrapper"> <span class="nx">typeSpecificType</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">column</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">column</span><span class="p">.</span><span class="nx">specific</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 a nullable column modifier.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">modifyNullable</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">isNullable</span> <span class="o">===</span> <span class="kc">false</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39; not null&#39;</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>Get the SQL for a default column modifier.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">modifyDefault</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">defaultValue</span> <span class="o">!=</span> <span class="k">void</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="s2">&quot; default &#39;&quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">getDefaultValue</span><span class="p">(</span><span class="nx">column</span><span class="p">.</span><span class="nx">defaultValue</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;&#39;&quot;</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</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="nx">module</span><span class="p">);</span> <span class="p">}</span>
<span class="p">);</span></div></div></div></div></body></html>