2013-12-12 17:37:44 -05:00

55 lines
15 KiB
HTML

<!DOCTYPE html><html lang="en"><head><title>clients/server/postgres/grammar</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/postgres/grammar"><meta name="groc-project-path" content="clients/server/postgres/grammar.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/postgres/grammar.js</div></div><div id="document"><div class="segment"><div class="comments"><div class="wrapper"><h2 id="postgresql-grammar">PostgreSQL Grammar</h2></div></div></div><div class="segment"><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;lodash&#39;</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">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></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="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;&quot;%s&quot;&#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>Compiles a truncate query.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileTruncate</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;truncate &#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">qb</span><span class="p">.</span><span class="nx">table</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; restart identity&#39;</span><span class="p">;</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Compiles an <code>insert</code> query, allowing for multiple
inserts using a single query statement.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileInsert</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">values</span> <span class="o">=</span> <span class="nx">qb</span><span class="p">.</span><span class="nx">values</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">columns</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">pluck</span><span class="p">(</span><span class="nx">values</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="mi">0</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">paramBlocks</span> <span class="o">=</span> <span class="p">[];</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>If there are any "where" clauses, we need to omit
any bindings that may have been associated with them.</p></div></div><div class="code"><div class="wrapper"> <span class="k">if</span> <span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">wheres</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">clearWhereBindings</span><span class="p">(</span><span class="nx">qb</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">sql</span> <span class="o">=</span> <span class="s1">&#39;insert into &#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">qb</span><span class="p">.</span><span class="nx">table</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">columns</span><span class="p">.</span><span class="nx">length</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">sql</span> <span class="o">+=</span> <span class="s1">&#39;default values&#39;</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</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">values</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="o">++</span><span class="nx">i</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">paramBlocks</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s2">&quot;(&quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">parameterize</span><span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx">pluck</span><span class="p">(</span><span class="nx">values</span><span class="p">[</span><span class="nx">i</span><span class="p">],</span> <span class="mi">1</span><span class="p">))</span> <span class="o">+</span> <span class="s2">&quot;)&quot;</span><span class="p">);</span>
<span class="p">}</span>
<span class="nx">sql</span> <span class="o">+=</span> <span class="s2">&quot;(&quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">columnize</span><span class="p">(</span><span class="nx">columns</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;) values &quot;</span> <span class="o">+</span> <span class="nx">paramBlocks</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>
<span class="nx">sql</span> <span class="o">+=</span> <span class="k">this</span><span class="p">.</span><span class="nx">compileReturning</span><span class="p">(</span><span class="nx">qb</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>Compiles an <code>update</code> query, allowing for a return value.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileUpdate</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">sql</span> <span class="o">=</span> <span class="nx">baseGrammar</span><span class="p">.</span><span class="nx">compileUpdate</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</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">compileReturning</span><span class="p">(</span><span class="nx">qb</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>Adds the returning value to the statement.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">compileReturning</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">qb</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">sql</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">flags</span><span class="p">.</span><span class="nx">returning</span><span class="p">)</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">isArray</span><span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">flags</span><span class="p">.</span><span class="nx">returning</span><span class="p">))</span> <span class="p">{</span>
<span class="nx">sql</span> <span class="o">+=</span> <span class="s1">&#39; returning &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapArray</span><span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">flags</span><span class="p">.</span><span class="nx">returning</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="nx">sql</span> <span class="o">+=</span> <span class="s1">&#39; returning &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">wrapValue</span><span class="p">(</span><span class="nx">qb</span><span class="p">.</span><span class="nx">flags</span><span class="p">.</span><span class="nx">returning</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>Ensures the response is returned in the same format as other clients.</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="kd">var</span> <span class="nx">returning</span> <span class="o">=</span> <span class="nx">builder</span><span class="p">.</span><span class="nx">flags</span><span class="p">.</span><span class="nx">returning</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">command</span> <span class="o">===</span> <span class="s1">&#39;SELECT&#39;</span><span class="p">)</span> <span class="k">return</span> <span class="nx">response</span><span class="p">.</span><span class="nx">rows</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">command</span> <span class="o">===</span> <span class="s1">&#39;INSERT&#39;</span> <span class="o">||</span> <span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">command</span> <span class="o">===</span> <span class="s1">&#39;UPDATE&#39;</span> <span class="o">&amp;&amp;</span> <span class="nx">returning</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">response</span><span class="p">.</span><span class="nx">rows</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">row</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">returning</span> <span class="o">===</span> <span class="s1">&#39;*&#39;</span> <span class="o">||</span> <span class="nx">_</span><span class="p">.</span><span class="nx">isArray</span><span class="p">(</span><span class="nx">returning</span><span class="p">))</span> <span class="k">return</span> <span class="nx">row</span><span class="p">;</span>
<span class="k">return</span> <span class="nx">row</span><span class="p">[</span><span class="nx">returning</span><span class="p">];</span>
<span class="p">});</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">command</span> <span class="o">===</span> <span class="s1">&#39;UPDATE&#39;</span> <span class="o">||</span> <span class="nx">response</span><span class="p">.</span><span class="nx">command</span> <span class="o">===</span> <span class="s1">&#39;DELETE&#39;</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">response</span><span class="p">.</span><span class="nx">rowCount</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">return</span> <span class="s1">&#39;&#39;</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></body></html>