<!DOCTYPE html><htmllang="en"><head><title>clients/base/schemagrammar</title></head><metahttp-equiv="Content-Type"content="text/html; charset=utf-8"><metaname="viewport"content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0"><metaname="groc-relative-root"content="../../"><metaname="groc-document-path"content="clients/base/schemagrammar"><metaname="groc-project-path"content="clients/base/schemagrammar.js"><linkrel="stylesheet"type="text/css"media="all"href="../../assets/style.css"><scripttype="text/javascript"src="../../assets/behavior.js"></script><body><divid="meta"><divclass="file-path">clients/base/schemagrammar.js</div></div><divid="document"><divclass="segment"><divclass="comments"><divclass="wrapper"><h2id="schemagrammar">SchemaGrammar</h2></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>The "SchemaGrammar" is a layer which helps in compiling
functions to keep the interface database agnostic.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="kd">var</span><spanclass="nx">_</span><spanclass="o">=</span><spanclass="nx">require</span><spanclass="p">(</span><spanclass="s1">'lodash'</span><spanclass="p">);</span>
<spanclass="nx">exports</span><spanclass="p">.</span><spanclass="nx">baseSchemaGrammar</span><spanclass="o">=</span><spanclass="p">{</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>The toSql on the "schema" is different than that on the "builder",
on the same connection.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">toSql</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">builder</span><spanclass="p">)</span><spanclass="p">{</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Clone the builder, before we go about working with the columns & commands.
TODO: Clean this up.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">builder</span><spanclass="o">=</span><spanclass="nx">builder</span><spanclass="p">.</span><spanclass="nx">clone</span><spanclass="p">();</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Add the commands that are implied by the blueprint.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="k">if</span><spanclass="p">(</span><spanclass="nx">builder</span><spanclass="p">.</span><spanclass="nx">columns</span><spanclass="p">.</span><spanclass="nx">length</span><spanclass="o">></span><spanclass="mi">0</span><spanclass="o">&&</span><spanclass="o">!</span><spanclass="nx">builder</span><spanclass="p">.</span><spanclass="nx">creating</span><spanclass="p">())</span><spanclass="p">{</span>
<spanclass="p">}</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Add an "additional" command, for any extra dialect-specific logic.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">builder</span><spanclass="p">.</span><spanclass="nx">commands</span><spanclass="p">.</span><spanclass="nx">push</span><spanclass="p">({</span><spanclass="nx">name</span><spanclass="o">:</span><spanclass="s1">'additional'</span><spanclass="p">});</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Add indicies</p></div></div><divclass="code"><divclass="wrapper"><spanclass="k">for</span><spanclass="p">(</span><spanclass="kd">var</span><spanclass="nx">i</span><spanclass="o">=</span><spanclass="mi">0</span><spanclass="p">,</span><spanclass="nx">l</span><spanclass="o">=</span><spanclass="nx">builder</span><spanclass="p">.</span><spanclass="nx">columns</span><spanclass="p">.</span><spanclass="nx">length</span><spanclass="p">;</span><spanclass="nx">i</span><spanclass="o"><</span><spanclass="nx">l</span><spanclass="p">;</span><spanclass="nx">i</span><spanclass="o">++</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="kd">var</span><spanclass="nx">indexVar</span><spanclass="o">=</span><spanclass="s1">'is'</span><spanclass="o">+</span><spanclass="nx">Helpers</span><spanclass="p">.</span><spanclass="nx">capitalize</span><spanclass="p">(</span><spanclass="nx">index</span><spanclass="p">);</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>If the index has been specified on the given column, but is simply
index, so we will simply call the index methods without one.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="k">if</span><spanclass="p">(</span><spanclass="nx">column</span><spanclass="p">[</span><spanclass="nx">indexVar</span><spanclass="p">]</span><spanclass="o">===</span><spanclass="kc">true</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="k">continue</span><spanclass="nx">continueIndex</span><spanclass="p">;</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>If the index has been specified on the column and it is something
the index specification, and pass in the name to the method.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="p">}</span><spanclass="k">else</span><spanclass="k">if</span><spanclass="p">(</span><spanclass="nx">_</span><spanclass="p">.</span><spanclass="nx">has</span><spanclass="p">(</span><spanclass="nx">column</span><spanclass="p">,</span><spanclass="nx">indexVar</span><spanclass="p">))</span><spanclass="p">{</span>
<spanclass="kd">var</span><spanclass="nx">statements</span><spanclass="o">=</span><spanclass="p">[];</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Each type of command has a corresponding compiler function on the schema
the blueprint element, so we'll just call that compilers function.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="k">for</span><spanclass="p">(</span><spanclass="nx">i</span><spanclass="o">=</span><spanclass="mi">0</span><spanclass="p">,</span><spanclass="nx">l</span><spanclass="o">=</span><spanclass="nx">builder</span><spanclass="p">.</span><spanclass="nx">commands</span><spanclass="p">.</span><spanclass="nx">length</span><spanclass="p">;</span><spanclass="nx">i</span><spanclass="o"><</span><spanclass="nx">l</span><spanclass="p">;</span><spanclass="nx">i</span><spanclass="o">++</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="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="nx">blueprint</span><spanclass="p">,</span><spanclass="nx">command</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="nx">sql</span><spanclass="o">+=</span><spanclass="s2">"foreign key ("</span><spanclass="o">+</span><spanclass="nx">column</span><spanclass="o">+</span><spanclass="s2">") references "</span><spanclass="o">+</span><spanclass="nx">foreignTable</span><spanclass="o">+</span><spanclass="s2">" ("</span><spanclass="o">+</span><spanclass="nx">foreignColumn</span><spanclass="o">+</span><spanclass="s2">")"</span><spanclass="p">;</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Once we have the basic foreign key creation statement constructed we can
the affected columns, which will get something like "cascade", etc.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="k">if</span><spanclass="p">(</span><spanclass="nx">command</span><spanclass="p">.</span><spanclass="nx">commandOnDelete</span><spanclass="p">)</span><spanclass="nx">sql</span><spanclass="o">+=</span><spanclass="s2">" on delete "</span><spanclass="o">+</span><spanclass="nx">command</span><spanclass="p">.</span><spanclass="nx">commandOnDelete</span><spanclass="p">;</span>
<spanclass="k">if</span><spanclass="p">(</span><spanclass="nx">command</span><spanclass="p">.</span><spanclass="nx">commandOnUpdate</span><spanclass="p">)</span><spanclass="nx">sql</span><spanclass="o">+=</span><spanclass="s2">" on update "</span><spanclass="o">+</span><spanclass="nx">command</span><spanclass="p">.</span><spanclass="nx">commandOnUpdate</span><spanclass="p">;</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Each of the column types have their own compiler functions which are
for the platform. Then column modifiers are compiled and added.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">getColumns</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>Add the column modifiers to the definition.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">addModifiers</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">sql</span><spanclass="p">,</span><spanclass="nx">blueprint</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>Get the SQL for the column data type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">getType</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">column</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>Add a prefix to an array of values, utilized in the client libs.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">prefixArray</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">prefix</span><spanclass="p">,</span><spanclass="nx">values</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Wrap a table in keyword identifiers.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">wrapTable</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">table</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Wrap a value in keyword identifiers.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">wrap</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">value</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Format a value so that it can be used in "default" clauses.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">getDefaultValue</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">value</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Get the primary key command if it exists on the blueprint.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">getCommandByName</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">,</span><spanclass="nx">name</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Get all of the commands with a given name.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">getCommandsByName</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">,</span><spanclass="nx">name</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Used to compile any database specific items.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileAdditional</span><spanclass="o">:</span><spanclass="kd">function</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="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile a drop table command.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileDropTable</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 drop table (if exists) command.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileDropTableIfExists</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">blueprint</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="k">return</span><spanclass="s1">'drop table if exists '</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="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Compile a drop index command.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">compileDropIndex</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>Default for a biginteger type in database in other databases.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeBigInteger</span><spanclass="o">:</span><spanclass="kd">function</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>Create the column definition for a string type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeString</span><spanclass="o">:</span><spanclass="kd">function</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>Create the column definition for a text type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeText</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 tiny integer type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeTinyInteger</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 time type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeTime</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 type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeDate</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 binary type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeBinary</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 json type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeJson</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 uuid type.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeUuid</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 a specific type</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">typeSpecificType</span><spanclass="o">:</span><spanclass="kd">function</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>Get the SQL for a nullable column modifier.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">modifyNullable</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>
<spanclass="k">return</span><spanclass="s1">' not null'</span><spanclass="p">;</span>
<spanclass="p">}</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Get the SQL for a default column modifier.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">modifyDefault</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>