knex/docs/clients/server/mysql.html

147 lines
51 KiB
HTML
Raw Normal View History

2013-09-13 13:50:41 -04:00
<!DOCTYPE html><html lang="en"><head><title>clients/server/mysql</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/server/mysql"><meta name="groc-project-path" content="clients/server/mysql.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/server/mysql.js</div></div><div id="document"><div class="segment"><div class="comments"><div class="wrapper"><h2 id="mysql">MySQL</h2></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>All of the "when.js" promise components needed in this module.</p></div></div><div class="code"><div class="wrapper"><span class="kd">var</span> <span class="nx">when</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;when&#39;</span><span class="p">);</span>
2013-09-13 16:58:38 -04:00
<span class="kd">var</span> <span class="nx">nodefn</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;when/node/function&#39;</span><span class="p">);</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Other dependencies, including the <code>mysql</code> library,
2013-09-13 13:50:41 -04:00
which needs to be added as a dependency to the project
using this database.</p></div></div><div class="code"><div class="wrapper"><span class="kd">var</span> <span class="nx">_</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;underscore&#39;</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">mysql</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;mysql&#39;</span><span class="p">);</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>All other local project modules needed in this scope.</p></div></div><div class="code"><div class="wrapper"><span class="kd">var</span> <span class="nx">ServerBase</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./base&#39;</span><span class="p">).</span><span class="nx">ServerBase</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;../base/grammar&#39;</span><span class="p">).</span><span class="nx">BaseGrammar</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">baseSchemaGrammar</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;../base/schemagrammar&#39;</span><span class="p">).</span><span class="nx">BaseSchemaGrammar</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">Helpers</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;../../lib/helpers&#39;</span><span class="p">).</span><span class="nx">Helpers</span><span class="p">;</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Constructor for the MySQLClient.</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">ServerBase</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
2013-09-13 17:21:20 -04:00
<span class="nx">dialect</span><span class="o">:</span> <span class="s1">&#39;mysql&#39;</span><span class="p">,</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Runs the query on the specified connection, providing the bindings
and any other necessary prep work.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">runQuery</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">connection</span><span class="p">,</span> <span class="nx">sql</span><span class="p">,</span> <span class="nx">bindings</span><span class="p">,</span> <span class="nx">builder</span><span class="p">)</span> <span class="p">{</span>
2013-09-13 13:50:41 -04:00
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">connection</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="s1">&#39;No database connection exists for the query&#39;</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">builder</span><span class="p">.</span><span class="nx">flags</span><span class="p">.</span><span class="nx">options</span><span class="p">)</span> <span class="nx">sql</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span><span class="nx">sql</span><span class="o">:</span> <span class="nx">sql</span><span class="p">},</span> <span class="nx">builder</span><span class="p">.</span><span class="nx">flags</span><span class="p">.</span><span class="nx">options</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">builder</span><span class="p">.</span><span class="nx">_source</span> <span class="o">===</span> <span class="s1">&#39;SchemaBuilder&#39;</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">advancedQuery</span><span class="p">(</span><span class="nx">connection</span><span class="p">,</span> <span class="nx">sql</span><span class="p">,</span> <span class="nx">bindings</span><span class="p">,</span> <span class="nx">builder</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">return</span> <span class="nx">when</span><span class="p">(</span><span class="nx">sql</span><span class="p">).</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">sql</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">nodefn</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">connection</span><span class="p">.</span><span class="nx">query</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="nx">connection</span><span class="p">),</span> <span class="nx">sql</span><span class="p">,</span> <span class="nx">bindings</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 a raw connection, called by the <code>pool</code> whenever a new
connection needs to be added to the pool.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">getRawConnection</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">connection</span> <span class="o">=</span> <span class="nx">mysql</span><span class="p">.</span><span class="nx">createConnection</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">connectionSettings</span><span class="p">);</span>
<span class="k">return</span> <span class="nx">nodefn</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">connection</span><span class="p">.</span><span class="nx">connect</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="nx">connection</span><span class="p">)).</span><span class="nx">yield</span><span class="p">(</span><span class="nx">connection</span><span class="p">);</span>
2013-09-13 16:58:38 -04:00
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Used to explicitly close a connection, called internally by the pool
when a connection times out or the pool is shutdown.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">destroyRawConnection</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">connection</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">connection</span><span class="p">.</span><span class="nx">end</span><span class="p">();</span>
2013-09-13 13:50:41 -04:00
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Used to check if there is a conditional query needed to complete the next one.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">advancedQuery</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">connection</span><span class="p">,</span> <span class="nx">sql</span><span class="p">,</span> <span class="nx">bindings</span><span class="p">,</span> <span class="nx">builder</span><span class="p">)</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">indexOf</span><span class="p">(</span><span class="s1">&#39;alter table&#39;</span><span class="p">)</span> <span class="o">===</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="nx">sql</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="s1">&#39;__datatype__&#39;</span><span class="p">)</span> <span class="o">===</span> <span class="p">(</span><span class="nx">sql</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">12</span><span class="p">))</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">newSql</span> <span class="o">=</span> <span class="nx">sql</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="s1">&#39;alter table&#39;</span><span class="p">,</span> <span class="s1">&#39;show fields from&#39;</span><span class="p">).</span><span class="nx">split</span><span class="p">(</span><span class="s1">&#39;change&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="s1">&#39; where field = ?&#39;</span><span class="p">;</span>
<span class="k">return</span> <span class="nx">nodefn</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">connection</span><span class="p">.</span><span class="nx">query</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="nx">connection</span><span class="p">),</span> <span class="nx">newSql</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">builder</span><span class="p">.</span><span class="nx">currentIndex</span><span class="p">].</span><span class="nx">from</span><span class="p">]).</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">resp</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">resp</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>Set to the datatype we're looking to change it to...</p></div></div><div class="code"><div class="wrapper"> <span class="k">return</span> <span class="nx">sql</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="s1">&#39;__datatype__&#39;</span><span class="p">,</span> <span class="nx">column</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">Type</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>
<span class="p">});</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Extends the standard sql grammar.</p></div></div><div class="code"><div class="wrapper"><span class="kd">var</span> <span class="nx">grammar</span> <span class="o">=</span> <span class="nx">exports</span><span class="p">.</span><span class="nx">grammar</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">defaults</span><span class="p">({</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>The keyword identifier wrapper format.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">wrapValue</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="p">(</span><span class="nx">value</span> <span class="o">!==</span> <span class="s1">&#39;*&#39;</span> <span class="o">?</span> <span class="nx">Helpers</span><span class="p">.</span><span class="nx">format</span><span class="p">(</span><span class="s1">&#39;`%s`&#39;</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span> <span class="o">:</span> <span class="s2">&quot;*&quot;</span><span class="p">);</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Parses the response, according to the way mySQL works...</p></div></div><div class="code"><div class="wrapper"> <span class="nx">handleResponse</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="nx">response</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">response</span> <span class="o">=</span> <span class="nx">response</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">builder</span><span class="p">.</span><span class="nx">type</span> <span class="o">===</span> <span class="s1">&#39;select&#39;</span><span class="p">)</span> <span class="nx">response</span> <span class="o">=</span> <span class="nx">Helpers</span><span class="p">.</span><span class="nx">skim</span><span class="p">(</span><span class="nx">response</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">builder</span><span class="p">.</span><span class="nx">type</span> <span class="o">===</span> <span class="s1">&#39;insert&#39;</span><span class="p">)</span> <span class="nx">response</span> <span class="o">=</span> <span class="p">[</span><span class="nx">response</span><span class="p">.</span><span class="nx">insertId</span><span class="p">];</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">builder</span><span class="p">.</span><span class="nx">type</span> <span class="o">===</span> <span class="s1">&#39;delete&#39;</span> <span class="o">||</span> <span class="nx">builder</span><span class="p">.</span><span class="nx">type</span> <span class="o">===</span> <span class="s1">&#39;update&#39;</span><span class="p">)</span> <span class="nx">response</span> <span class="o">=</span> <span class="nx">response</span><span class="p">.</span><span class="nx">affectedRows</span><span class="p">;</span>
<span class="k">return</span> <span class="nx">response</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">},</span> <span class="nx">baseGrammar</span><span class="p">);</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Grammar for the schema builder.</p></div></div><div class="code"><div class="wrapper"><span class="kd">var</span> <span class="nx">schemaGrammar</span> <span class="o">=</span> <span class="nx">exports</span><span class="p">.</span><span class="nx">schemaGrammar</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">defaults</span><span class="p">({</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>The possible column modifiers.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">modifiers</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;Unsigned&#39;</span><span class="p">,</span> <span class="s1">&#39;Nullable&#39;</span><span class="p">,</span> <span class="s1">&#39;Default&#39;</span><span class="p">,</span> <span class="s1">&#39;Increment&#39;</span><span class="p">,</span> <span class="s1">&#39;After&#39;</span><span class="p">,</span> <span class="s1">&#39;Comment&#39;</span><span class="p">],</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Handle response for the schema.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">handleResponse</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="nx">resp</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">builder</span><span class="p">.</span><span class="nx">type</span> <span class="o">===</span> <span class="s1">&#39;tableExists&#39;</span><span class="p">)</span> <span class="k">return</span> <span class="nx">resp</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">if</span> <span class="p">(</span><span class="nx">builder</span><span class="p">.</span><span class="nx">type</span> <span class="o">===</span> <span class="s1">&#39;columnExists&#39;</span><span class="p">)</span> <span class="k">return</span> <span class="nx">resp</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">resp</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="nx">command</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="nx">baseSchemaGrammar</span><span class="p">.</span><span class="nx">compileCreateTable</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">blueprint</span><span class="p">,</span> <span class="nx">command</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">conn</span> <span class="o">=</span> <span class="nx">blueprint</span><span class="p">.</span><span class="nx">client</span><span class="p">.</span><span class="nx">connectionSettings</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">conn</span><span class="p">.</span><span class="nx">charset</span><span class="p">)</span> <span class="nx">sql</span> <span class="o">+=</span> <span class="s1">&#39; default character set &#39;</span> <span class="o">+</span> <span class="nx">conn</span><span class="p">.</span><span class="nx">charset</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">conn</span><span class="p">.</span><span class="nx">collation</span><span class="p">)</span> <span class="nx">sql</span> <span class="o">+=</span> <span class="s1">&#39; collate &#39;</span> <span class="o">+</span> <span class="nx">conn</span><span class="p">.</span><span class="nx">collation</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">blueprint</span><span class="p">.</span><span class="nx">flags</span><span class="p">.</span><span class="nx">engine</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">sql</span> <span class="o">+=</span> <span class="s1">&#39; engine = &#39;</span> <span class="o">+</span> <span class="nx">blueprint</span><span class="p">.</span><span class="nx">flags</span><span class="p">.</span><span class="nx">engine</span><span class="p">;</span>
<span class="p">}</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Checks if the table is commented</p></div></div><div class="code"><div class="wrapper"> <span class="kd">var</span> <span class="nx">isCommented</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">getCommandByName</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">,</span> <span class="s1">&#39;comment&#39;</span><span class="p">);</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>TODO: Handle max comment length.</p></div></div><div class="code"><div class="wrapper"> <span class="kd">var</span> <span class="nx">maxTableCommentLength</span> <span class="o">=</span> <span class="mi">60</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">isCommented</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">sql</span> <span class="o">+=</span> <span class="s2">&quot; comment = &#39;&quot;</span> <span class="o">+</span> <span class="nx">isCommented</span><span class="p">.</span><span class="nx">comment</span> <span class="o">+</span> <span class="s2">&quot;&#39;&quot;</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">return</span> <span class="nx">sql</span><span class="p">;</span>
<span class="p">},</span></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="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="p">.</span><span class="nx">unshift</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">.</span><span class="nx">client</span><span class="p">.</span><span class="nx">connectionSettings</span><span class="p">.</span><span class="nx">database</span><span class="p">);</span>
<span class="k">return</span> <span class="s1">&#39;select * from information_schema.tables where table_schema = ? and table_name = ?&#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 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="k">return</span> <span class="s1">&#39;show columns from &#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; like ?&#39;</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile an add command.</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">columns</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">prefixArray</span><span class="p">(</span><span class="s1">&#39;add&#39;</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">getColumns</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">));</span>
<span class="k">return</span> <span class="s1">&#39;alter table &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="nx">columns</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;, &#39;</span><span class="p">);</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile a primary key command.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compilePrimary</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="k">this</span><span class="p">.</span><span class="nx">compileKey</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="s1">&#39;primary key&#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 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="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">compileKey</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="s1">&#39;unique&#39;</span><span class="p">);</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile a plain index key command.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileIndex</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">,</span> <span class="nx">command</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">compileKey</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="s1">&#39;index&#39;</span><span class="p">);</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile an index creation command.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileKey</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="nx">type</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">columns</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">columnize</span><span class="p">(</span><span class="nx">command</span><span class="p">.</span><span class="nx">columns</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">table</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">);</span>
<span class="k">return</span> <span class="s1">&#39;alter table &#39;</span> <span class="o">+</span> <span class="nx">table</span> <span class="o">+</span> <span class="s2">&quot; add &quot;</span> <span class="o">+</span> <span class="nx">type</span> <span class="o">+</span> <span class="s2">&quot; &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="o">+</span> <span class="nx">columns</span> <span class="o">+</span> <span class="s2">&quot;)&quot;</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile a 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="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">prefixArray</span><span class="p">(</span><span class="s1">&#39;drop&#39;</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapArray</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="k">return</span> <span class="s1">&#39;alter table &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="nx">columns</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">&#39;, &#39;</span><span class="p">);</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile a drop primary key command.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileDropPrimary</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;alter table &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; drop primary key&#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 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="k">this</span><span class="p">.</span><span class="nx">compileDropIndex</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></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;alter table &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; drop index &#39;</span> <span class="o">+</span> <span class="nx">command</span><span class="p">.</span><span class="nx">index</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile a drop foreign key command.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileDropForeign</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">,</span> <span class="nx">command</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;alter table &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot; drop foreign key &quot;</span> <span class="o">+</span> <span class="nx">command</span><span class="p">.</span><span class="nx">index</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile a rename table command.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileRenameTable</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">,</span> <span class="nx">command</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;rename 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; to &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">command</span><span class="p">.</span><span class="nx">to</span><span class="p">);</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compile a rename column command.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileRenameColumn</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">,</span> <span class="nx">command</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;alter table &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; change &#39;</span> <span class="o">+</span>
<span class="k">this</span><span class="p">.</span><span class="nx">wrapTable</span><span class="p">(</span><span class="nx">command</span><span class="p">.</span><span class="nx">from</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">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="o">+</span> <span class="s1">&#39; __datatype__&#39;</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles the comment on the table.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileComment</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></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Handled on create table...</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>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="nx">column</span><span class="p">)</span> <span class="p">{</span>
<span class="k">switch</span> <span class="p">(</span><span class="nx">column</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="p">{</span>
<span class="k">case</span> <span class="s1">&#39;medium&#39;</span><span class="o">:</span>
<span class="k">case</span> <span class="s1">&#39;mediumtext&#39;</span><span class="o">:</span>
<span class="k">return</span> <span class="s1">&#39;mediumtext&#39;</span><span class="p">;</span>
<span class="k">case</span> <span class="s1">&#39;long&#39;</span><span class="o">:</span>
<span class="k">case</span> <span class="s1">&#39;longtext&#39;</span><span class="o">:</span>
<span class="k">return</span> <span class="s1">&#39;longtext&#39;</span><span class="p">;</span>
<span class="k">default</span><span class="o">:</span>
<span class="k">return</span> <span class="s1">&#39;text&#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>Create the column type definition for a bigint type.</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="p">{</span>
<span class="k">return</span> <span class="s1">&#39;bigint&#39;</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Create the column definition for a integer type.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">typeInteger</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">column</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;int(&#39;</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="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>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="nx">column</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;float(&#39;</span> <span class="o">+</span> <span class="nx">column</span><span class="p">.</span><span class="nx">total</span> <span class="o">+</span> <span class="s1">&#39;,&#39;</span> <span class="o">+</span> <span class="nx">column</span><span class="p">.</span><span class="nx">places</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>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="nx">column</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;decimal(&#39;</span> <span class="o">+</span> <span class="nx">column</span><span class="p">.</span><span class="nx">precision</span> <span class="o">+</span> <span class="s1">&#39;, &#39;</span> <span class="o">+</span> <span class="nx">column</span><span class="p">.</span><span class="nx">scale</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>Create the column definition for a boolean type.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">typeBoolean</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;tinyint(1)&#39;</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Create the column definition for a enum type.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">typeEnum</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">column</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="s2">&quot;enum(&#39;&quot;</span> <span class="o">+</span> <span class="nx">column</span><span class="p">.</span><span class="nx">allowed</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s2">&quot;&#39;, &#39;&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;&#39;)&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 date-time type.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">typeDateTime</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;datetime&#39;</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Create the column definition for a timestamp type.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">typeTimestamp</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;timestamp&#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 bit type.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">typeBit</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">length</span> <span class="o">!==</span> <span class="kc">false</span> <span class="o">?</span> <span class="s1">&#39;bit(&#39;</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="s1">&#39;)&#39;</span> <span class="o">:</span> <span class="s1">&#39;bit&#39;</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Get the SQL for an unsigned column modifier.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">modifyUnsigned</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">isUnsigned</span><span class="p">)</span> <span class="k">return</span> <span class="s1">&#39; unsigned&#39;</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Get the SQL for 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></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>TODO - no default on blob/text</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">defaultValue</span> <span class="o">!=</span> <span class="k">void</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="nx">column</span><span class="p">.</span><span class="nx">type</span> <span class="o">!=</span> <span class="s1">&#39;blob&#39;</span> <span class="o">&amp;&amp;</span> <span class="nx">column</span><span class="p">.</span><span class="nx">type</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="s1">&#39;text&#39;</span><span class="p">)</span> <span class="o">===</span> <span class="o">-</span><span class="mi">1</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></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Get the SQL for an auto-increment column modifier.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">modifyIncrement</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">blueprint</span><span class="p">,</span> <span class="nx">column</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">column</span><span class="p">.</span><span class="nx">autoIncrement</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="nx">column</span><span class="p">.</span><span class="nx">type</span> <span class="o">==</span> <span class="s1">&#39;integer&#39;</span> <span class="o">||</span> <span class="nx">column</span><span class="p">.</span><span class="nx">type</span> <span class="o">==</span> <span class="s1">&#39;bigInteger&#39;</span><span class="p">))</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39; not null auto_increment primary key&#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 an "after" column modifier.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">modifyAfter</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">isAfter</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39; after &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrap</span><span class="p">(</span><span class="nx">column</span><span class="p">.</span><span class="nx">isAfter</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 comment column modifier.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">modifyComment</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></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>TODO: Look into limiting this length.</p></div></div><div class="code"><div class="wrapper"> <span class="kd">var</span> <span class="nx">maxColumnCommentLength</span> <span class="o">=</span> <span class="mi">255</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">isCommented</span> <span class="o">&amp;&amp;</span> <span class="nx">_</span><span class="p">.</span><span class="nx">isString</span><span class="p">(</span><span class="nx">column</span><span class="p">.</span><span class="nx">isCommented</span><span class="p">))</span> <span class="p">{</span>
<span class="k">return</span> <span class="s2">&quot; comment &#39;&quot;</span> <span class="o">+</span> <span class="nx">column</span><span class="p">.</span><span class="nx">isCommented</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="nx">baseSchemaGrammar</span><span class="p">,</span> <span class="nx">grammar</span><span class="p">);</span></div></div></div></div></body></html>