<!DOCTYPE html><htmllang="en"><head><title>clients/server/sqlite3</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/server/sqlite3"><metaname="groc-project-path"content="clients/server/sqlite3.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/server/sqlite3.js</div></div><divid="document"><divclass="segment"><divclass="comments"><divclass="wrapper"><h2id="sqlite3">SQLite3</h2></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>All of the "when.js" promise components needed in this module.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="kd">var</span><spanclass="nx">when</span><spanclass="o">=</span><spanclass="nx">require</span><spanclass="p">(</span><spanclass="s1">'when'</span><spanclass="p">);</span>
<spanclass="kd">var</span><spanclass="nx">nodefn</span><spanclass="o">=</span><spanclass="nx">require</span><spanclass="p">(</span><spanclass="s1">'when/node/function'</span><spanclass="p">);</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Other dependencies, including the <code>sqlite3</code> library,
using this database.</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">'underscore'</span><spanclass="p">);</span>
<spanclass="kd">var</span><spanclass="nx">sqlite3</span><spanclass="o">=</span><spanclass="nx">require</span><spanclass="p">(</span><spanclass="s1">'sqlite3'</span><spanclass="p">);</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>All other local project modules needed in this scope.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="kd">var</span><spanclass="nx">SQLite3Base</span><spanclass="o">=</span><spanclass="nx">require</span><spanclass="p">(</span><spanclass="s1">'../base/sqlite3'</span><spanclass="p">);</span>
<spanclass="kd">var</span><spanclass="nx">Helpers</span><spanclass="o">=</span><spanclass="nx">require</span><spanclass="p">(</span><spanclass="s1">'../../lib/helpers'</span><spanclass="p">).</span><spanclass="nx">Helpers</span><spanclass="p">;</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Constructor for the SQLite3Client.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="kd">var</span><spanclass="nx">SQLite3Client</span><spanclass="o">=</span><spanclass="nx">exports</span><spanclass="p">.</span><spanclass="nx">Client</span><spanclass="o">=</span><spanclass="nx">ServerBase</span><spanclass="p">.</span><spanclass="nx">extend</span><spanclass="p">({</span>
<spanclass="nx">dialect</span><spanclass="o">:</span><spanclass="s1">'sqlite3'</span><spanclass="p">,</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Runs the query on the specified connection, providing the bindings
and any other necessary prep work.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">runQuery</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">connection</span><spanclass="p">,</span><spanclass="nx">sql</span><spanclass="p">,</span><spanclass="nx">bindings</span><spanclass="p">,</span><spanclass="nx">builder</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="k">if</span><spanclass="p">(</span><spanclass="o">!</span><spanclass="nx">connection</span><spanclass="p">)</span><spanclass="k">throw</span><spanclass="k">new</span><spanclass="nb">Error</span><spanclass="p">(</span><spanclass="s1">'No database connection exists for the query'</span><spanclass="p">);</span>
<spanclass="nx">builder</span><spanclass="p">.</span><spanclass="nx">type</span><spanclass="o">===</span><spanclass="s1">'update'</span><spanclass="o">||</span><spanclass="nx">builder</span><spanclass="p">.</span><spanclass="nx">type</span><spanclass="o">===</span><spanclass="s1">'delete'</span><spanclass="p">)</span><spanclass="o">?</span><spanclass="s1">'run'</span><spanclass="o">:</span><spanclass="s1">'all'</span><spanclass="p">;</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Call the querystring and then release the client</p></div></div><divclass="code"><divclass="wrapper"><spanclass="kd">var</span><spanclass="nx">dfd</span><spanclass="o">=</span><spanclass="nx">when</span><spanclass="p">.</span><spanclass="nx">defer</span><spanclass="p">();</span>
<spanclass="k">if</span><spanclass="p">(</span><spanclass="nx">err</span><spanclass="p">)</span><spanclass="k">return</span><spanclass="nx">dfd</span><spanclass="p">.</span><spanclass="nx">reject</span><spanclass="p">(</span><spanclass="nx">err</span><spanclass="p">);</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>We need the context here, because it has the "this.lastID" or "this.changes"</p></div></div><divclass="code"><divclass="wrapper"><spanclass="k">return</span><spanclass="nx">dfd</span><spanclass="p">.</span><spanclass="nx">resolve</span><spanclass="p">([</span><spanclass="nx">resp</span><spanclass="p">,</span><spanclass="k">this</span><spanclass="p">]);</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="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><divclass="code"><divclass="wrapper"><spanclass="nx">destroyRawConnection</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">connection</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Begins a transaction statement on the instance,
resolving with the connection of the current transaction.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">startTransaction</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">connection</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>Finishes the transaction statement on the instance.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">finishTransaction</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">type</span><spanclass="p">,</span><spanclass="nx">transaction</span><spanclass="p">,</span><spanclass="nx">msg</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="p">},</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>This needs to be refactored... badly.</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">alterSchema</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">builder</span><spanclass="p">,</span><spanclass="nx">trx</span><spanclass="p">)</span><spanclass="p">{</span>
<spanclass="nx">nodefn</span><spanclass="p">.</span><spanclass="nx">call</span><spanclass="p">(</span><spanclass="nx">connection</span><spanclass="p">.</span><spanclass="nx">all</span><spanclass="p">.</span><spanclass="nx">bind</span><spanclass="p">(</span><spanclass="nx">connection</span><spanclass="p">),</span><spanclass="s1">'SELECT name, sql FROM sqlite_master WHERE type="table" AND name="'</span><spanclass="o">+</span><spanclass="nx">builder</span><spanclass="p">.</span><spanclass="nx">table</span><spanclass="o">+</span><spanclass="s1">'"'</span><spanclass="p">,</span><spanclass="p">[])</span>
<spanclass="k">throw</span><spanclass="k">new</span><spanclass="nb">Error</span><spanclass="p">(</span><spanclass="s1">'The column '</span><spanclass="o">+</span><spanclass="nx">command</span><spanclass="p">.</span><spanclass="nx">from</span><spanclass="o">+</span><spanclass="s1">' is not in the current table'</span><spanclass="p">);</span>
<spanclass="p">}</span>
<spanclass="k">return</span><spanclass="nx">nodefn</span><spanclass="p">.</span><spanclass="nx">call</span><spanclass="p">(</span><spanclass="nx">connection</span><spanclass="p">.</span><spanclass="nx">all</span><spanclass="p">.</span><spanclass="nx">bind</span><spanclass="p">(</span><spanclass="nx">connection</span><spanclass="p">),</span><spanclass="s1">'ALTER TABLE '</span><spanclass="o">+</span><spanclass="nx">sql</span><spanclass="p">.</span><spanclass="nx">name</span><spanclass="o">+</span><spanclass="s1">' RENAME TO __migrate__'</span><spanclass="o">+</span><spanclass="nx">sql</span><spanclass="p">.</span><spanclass="nx">name</span><spanclass="p">);</span>
<spanclass="k">return</span><spanclass="nx">trx</span><spanclass="p">.</span><spanclass="nx">reject</span><spanclass="p">(</span><spanclass="s1">'Unable to find the column to change'</span><spanclass="p">);</span>
<spanclass="nx">nodefn</span><spanclass="p">.</span><spanclass="nx">call</span><spanclass="p">(</span><spanclass="nx">connection</span><spanclass="p">.</span><spanclass="nx">all</span><spanclass="p">.</span><spanclass="nx">bind</span><spanclass="p">(</span><spanclass="nx">connection</span><spanclass="p">),</span><spanclass="s1">'SELECT * FROM "__migrate__'</span><spanclass="o">+</span><spanclass="nx">sql</span><spanclass="p">.</span><spanclass="nx">name</span><spanclass="o">+</span><spanclass="s1">'"'</span><spanclass="p">),</span>
<spanclass="nx">handleResponse</span><spanclass="o">:</span><spanclass="kd">function</span><spanclass="p">(</span><spanclass="nx">builder</span><spanclass="p">,</span><spanclass="nx">resp</span><spanclass="p">)</span><spanclass="p">{</span></div></div></div><divclass="segment"><divclass="comments"><divclass="wrapper"><p>This is an array, so we'll assume that the relevant info is on the first statement...</p></div></div><divclass="code"><divclass="wrapper"><spanclass="nx">resp</span><spanclass="o">=</span><spanclass="nx">resp</span><spanclass="p">[</span><spanclass="mi">0</span><spanclass="p">];</span>