mirror of
https://github.com/knex/knex.git
synced 2025-12-12 07:20:57 +00:00
149 lines
32 KiB
HTML
149 lines
32 KiB
HTML
<!DOCTYPE html><html lang="en"><head><title>lib/runner</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="lib/runner"><meta name="groc-project-path" content="lib/runner.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">lib/runner.js</div></div><div id="document"><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">'lodash'</span><span class="p">);</span>
|
|
<span class="kd">var</span> <span class="nx">Promise</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'./promise'</span><span class="p">);</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>The "Runner" constructor takes a "builder" (query, schema, or raw)
|
|
and runs through each of the query statements, calling any additional
|
|
"output" method provided alongside the query and bindings.</p></div></div><div class="code"><div class="wrapper"><span class="kd">function</span> <span class="nx">Runner</span><span class="p">(</span><span class="nx">builder</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">this</span><span class="p">.</span><span class="nx">builder</span> <span class="o">=</span> <span class="nx">builder</span><span class="p">;</span>
|
|
<span class="k">this</span><span class="p">.</span><span class="nx">queries</span> <span class="o">=</span> <span class="p">[];</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>The "connection" object is set on the runner when
|
|
"run" is called.</p></div></div><div class="code"><div class="wrapper"> <span class="k">this</span><span class="p">.</span><span class="nx">connection</span> <span class="o">=</span> <span class="k">void</span> <span class="mi">0</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="nx">Runner</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">_beginTransaction</span> <span class="o">=</span> <span class="s1">'begin;'</span><span class="p">;</span>
|
|
<span class="nx">Runner</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">_commitTransaction</span> <span class="o">=</span> <span class="s1">'commit;'</span><span class="p">;</span>
|
|
<span class="nx">Runner</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">_rollbackTransaction</span> <span class="o">=</span> <span class="s1">'rollback;'</span><span class="p">;</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>"Run" the target, calling "toSQL" on the builder, returning
|
|
an object or array of queries to run, each of which are run on
|
|
a single connection.</p></div></div><div class="code"><div class="wrapper"><span class="nx">Runner</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">run</span> <span class="o">=</span> <span class="nx">Promise</span><span class="p">.</span><span class="nx">method</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">builder</span><span class="p">.</span><span class="nx">_transacting</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">transactionQuery</span><span class="p">();</span>
|
|
<span class="p">}</span>
|
|
<span class="k">return</span> <span class="nx">Promise</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="k">this</span><span class="p">)</span>
|
|
<span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">ensureConnection</span><span class="p">)</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">connection</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">this</span><span class="p">.</span><span class="nx">connection</span> <span class="o">=</span> <span class="nx">connection</span><span class="p">;</span>
|
|
<span class="kd">var</span> <span class="nx">sql</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">builder</span><span class="p">.</span><span class="nx">toSQL</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">sql</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">queryArray</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="k">this</span><span class="p">.</span><span class="nx">query</span><span class="p">(</span><span class="nx">sql</span><span class="p">);</span>
|
|
<span class="p">})</span>
|
|
<span class="p">.</span><span class="k">finally</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">cleanupConnection</span><span class="p">);</span>
|
|
<span class="p">});</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Stream the result set, by passing through to the dialect's streaming
|
|
capabilities. If the options are</p></div></div><div class="code"><div class="wrapper"><span class="kd">var</span> <span class="nx">PassThrough</span><span class="p">;</span>
|
|
<span class="nx">Runner</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">stream</span> <span class="o">=</span> <span class="nx">Promise</span><span class="p">.</span><span class="nx">method</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">options</span><span class="p">,</span> <span class="nx">handler</span><span class="p">)</span> <span class="p">{</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>If we specify stream(handler).then(...</p></div></div><div class="code"><div class="wrapper"> <span class="k">if</span> <span class="p">(</span><span class="nx">arguments</span><span class="p">.</span><span class="nx">length</span> <span class="o">===</span> <span class="mi">1</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">isFunction</span><span class="p">(</span><span class="nx">options</span><span class="p">))</span> <span class="p">{</span>
|
|
<span class="nx">handler</span> <span class="o">=</span> <span class="nx">options</span><span class="p">;</span>
|
|
<span class="nx">options</span> <span class="o">=</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>Lazy-load the "PassThrough" dependency.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">PassThrough</span> <span class="o">=</span> <span class="nx">PassThrough</span> <span class="o">||</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'readable-stream'</span><span class="p">).</span><span class="nx">PassThrough</span><span class="p">;</span>
|
|
<span class="kd">var</span> <span class="nx">stream</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PassThrough</span><span class="p">({</span><span class="nx">objectMode</span><span class="o">:</span> <span class="kc">true</span><span class="p">});</span>
|
|
<span class="kd">var</span> <span class="nx">promise</span> <span class="o">=</span> <span class="nx">Promise</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="k">this</span><span class="p">)</span>
|
|
<span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">ensureConnection</span><span class="p">)</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">connection</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">this</span><span class="p">.</span><span class="nx">connection</span> <span class="o">=</span> <span class="nx">connection</span><span class="p">;</span>
|
|
<span class="kd">var</span> <span class="nx">sql</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">builder</span><span class="p">.</span><span class="nx">toSQL</span><span class="p">();</span>
|
|
<span class="kd">var</span> <span class="nx">err</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s1">'The stream may only be used with a single query statement.'</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">sql</span><span class="p">))</span> <span class="p">{</span>
|
|
<span class="nx">stream</span><span class="p">.</span><span class="nx">emit</span><span class="p">(</span><span class="s1">'error'</span><span class="p">,</span> <span class="nx">err</span><span class="p">);</span>
|
|
<span class="k">throw</span> <span class="nx">err</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="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="k">this</span><span class="p">.</span><span class="nx">_stream</span><span class="p">(</span><span class="nx">sql</span><span class="p">,</span> <span class="nx">stream</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
|
|
<span class="p">}).</span><span class="k">finally</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">cleanupConnection</span><span class="p">);</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>If a function is passed to handle the stream, send the stream
|
|
there and return the promise, otherwise just return the stream
|
|
and the promise will take care of itsself.</p></div></div><div class="code"><div class="wrapper"> <span class="k">if</span> <span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx">isFunction</span><span class="p">(</span><span class="nx">handler</span><span class="p">))</span> <span class="p">{</span>
|
|
<span class="nx">handler</span><span class="p">(</span><span class="nx">stream</span><span class="p">);</span>
|
|
<span class="k">return</span> <span class="nx">promise</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
<span class="k">return</span> <span class="nx">stream</span><span class="p">;</span>
|
|
<span class="p">});</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Allow you to pipe the stream to a writable stream.</p></div></div><div class="code"><div class="wrapper"><span class="nx">Runner</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">pipe</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">writable</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">stream</span><span class="p">().</span><span class="nx">pipe</span><span class="p">(</span><span class="nx">writable</span><span class="p">);</span>
|
|
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>"Runs" a query, returning a promise. All queries specified by the builder are guaranteed
|
|
to run in sequence, and on the same connection, especially helpful when schema building
|
|
and dealing with foreign key constraints, etc.</p></div></div><div class="code"><div class="wrapper"><span class="nx">Runner</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">query</span> <span class="o">=</span> <span class="nx">Promise</span><span class="p">.</span><span class="nx">method</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">obj</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="nx">obj</span><span class="p">.</span><span class="nx">__cid</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">connection</span><span class="p">.</span><span class="nx">__cid</span><span class="p">;</span>
|
|
<span class="k">this</span><span class="p">.</span><span class="nx">builder</span><span class="p">.</span><span class="nx">emit</span><span class="p">(</span><span class="s1">'query'</span><span class="p">,</span> <span class="nx">obj</span><span class="p">);</span>
|
|
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">_query</span><span class="p">(</span><span class="nx">obj</span><span class="p">).</span><span class="nx">bind</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">then</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">processResponse</span><span class="p">);</span>
|
|
<span class="p">});</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>In the case of the "schema builder" we call <code>queryArray</code>, which runs each
|
|
of the queries in sequence.</p></div></div><div class="code"><div class="wrapper"><span class="nx">Runner</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">queryArray</span> <span class="o">=</span> <span class="nx">Promise</span><span class="p">.</span><span class="nx">method</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">queries</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="nx">queries</span><span class="p">.</span><span class="nx">length</span> <span class="o">===</span> <span class="mi">1</span> <span class="o">?</span> <span class="k">this</span><span class="p">.</span><span class="nx">query</span><span class="p">(</span><span class="nx">queries</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">:</span> <span class="nx">Promise</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="k">this</span><span class="p">)</span>
|
|
<span class="p">.</span><span class="nx">thenReturn</span><span class="p">(</span><span class="nx">queries</span><span class="p">)</span>
|
|
<span class="p">.</span><span class="nx">reduce</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">memo</span><span class="p">,</span> <span class="nx">query</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">query</span><span class="p">(</span><span class="nx">query</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="nx">memo</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">resp</span><span class="p">);</span>
|
|
<span class="k">return</span> <span class="nx">memo</span><span class="p">;</span>
|
|
<span class="p">});</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>Check whether there's a transaction flag, and that it has a connection.</p></div></div><div class="code"><div class="wrapper"><span class="nx">Runner</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">ensureConnection</span> <span class="o">=</span> <span class="nx">Promise</span><span class="p">.</span><span class="nx">method</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">builder</span><span class="p">.</span><span class="nx">_connection</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">builder</span><span class="p">.</span><span class="nx">_connection</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">client</span><span class="p">.</span><span class="nx">acquireConnection</span><span class="p">();</span>
|
|
<span class="p">});</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>"Debug" the query being run.</p></div></div><div class="code"><div class="wrapper"><span class="nx">Runner</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">debug</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">obj</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="nx">console</span><span class="p">.</span><span class="nx">dir</span><span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span><span class="nx">__cid</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">connection</span><span class="p">.</span><span class="nx">__cid</span><span class="p">},</span> <span class="nx">obj</span><span class="p">));</span>
|
|
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Check whether we're "debugging", based on either calling <code>debug</code> on the query.</p></div></div><div class="code"><div class="wrapper"><span class="nx">Runner</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">isDebugging</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="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">client</span><span class="p">.</span><span class="nx">isDebugging</span> <span class="o">===</span> <span class="kc">true</span> <span class="o">||</span> <span class="k">this</span><span class="p">.</span><span class="nx">builder</span><span class="p">.</span><span class="nx">_debug</span> <span class="o">===</span> <span class="kc">true</span><span class="p">);</span>
|
|
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><h2 id="transaction-methods">Transaction Methods:</h2></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Run the transaction on the correct "runner" instance.</p></div></div><div class="code"><div class="wrapper"><span class="nx">Runner</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">transactionQuery</span> <span class="o">=</span> <span class="nx">Promise</span><span class="p">.</span><span class="nx">method</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">runner</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">builder</span><span class="p">.</span><span class="nx">_transacting</span><span class="p">.</span><span class="nx">_runner</span><span class="p">;</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="nx">runner</span> <span class="k">instanceof</span> <span class="nx">Runner</span><span class="p">))</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">'Invalid transaction object provided.'</span><span class="p">);</span>
|
|
<span class="p">}</span>
|
|
<span class="kd">var</span> <span class="nx">sql</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">builder</span><span class="p">.</span><span class="nx">toSQL</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">sql</span><span class="p">))</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="nx">runner</span><span class="p">.</span><span class="nx">queryArray</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">runner</span><span class="p">.</span><span class="nx">query</span><span class="p">(</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>Begins a transaction statement on the instance,
|
|
resolving with the connection of the current transaction.</p></div></div><div class="code"><div class="wrapper"><span class="nx">Runner</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">startTransaction</span> <span class="o">=</span> <span class="nx">Promise</span><span class="p">.</span><span class="nx">method</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="nx">Promise</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="k">this</span><span class="p">)</span>
|
|
<span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">ensureConnection</span><span class="p">)</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">connection</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">this</span><span class="p">.</span><span class="nx">connection</span> <span class="o">=</span> <span class="nx">connection</span><span class="p">;</span>
|
|
<span class="k">this</span><span class="p">.</span><span class="nx">transaction</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
|
|
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">query</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">_beginTransaction</span><span class="p">});</span>
|
|
<span class="p">}).</span><span class="nx">thenReturn</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
|
|
<span class="p">});</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Finishes the transaction statement and handles disposing of the connection,
|
|
resolving / rejecting the transaction's promise, and ensuring the transaction object's
|
|
<code>_runner</code> property is <code>null</code>'ed out so it cannot continue to be used.</p></div></div><div class="code"><div class="wrapper"><span class="nx">Runner</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">finishTransaction</span> <span class="o">=</span> <span class="nx">Promise</span><span class="p">.</span><span class="nx">method</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">action</span><span class="p">,</span> <span class="nx">containerObject</span><span class="p">,</span> <span class="nx">msg</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">query</span><span class="p">,</span> <span class="nx">dfd</span> <span class="o">=</span> <span class="nx">containerObject</span><span class="p">.</span><span class="nx">__dfd__</span><span class="p">;</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Run the query to commit / rollback the transaction.</p></div></div><div class="code"><div class="wrapper"> <span class="k">switch</span> <span class="p">(</span><span class="nx">action</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">case</span> <span class="mi">0</span><span class="o">:</span>
|
|
<span class="nx">query</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">commitTransaction</span><span class="p">();</span>
|
|
<span class="k">break</span><span class="p">;</span>
|
|
<span class="k">case</span> <span class="mi">1</span><span class="o">:</span>
|
|
<span class="nx">query</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">rollbackTransaction</span><span class="p">();</span>
|
|
<span class="k">break</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="k">return</span> <span class="nx">query</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="k">switch</span> <span class="p">(</span><span class="nx">action</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">case</span> <span class="mi">0</span><span class="o">:</span>
|
|
<span class="nx">dfd</span><span class="p">.</span><span class="nx">fulfill</span><span class="p">(</span><span class="nx">msg</span> <span class="o">||</span> <span class="nx">resp</span><span class="p">);</span>
|
|
<span class="k">break</span><span class="p">;</span>
|
|
<span class="k">case</span> <span class="mi">1</span><span class="o">:</span>
|
|
<span class="nx">dfd</span><span class="p">.</span><span class="nx">reject</span><span class="p">(</span><span class="nx">msg</span> <span class="o">||</span> <span class="nx">resp</span><span class="p">);</span>
|
|
<span class="k">break</span><span class="p">;</span>
|
|
<span class="p">}</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>If there was a problem committing the transaction,
|
|
reject the transaction block (to reject the entire transaction block),
|
|
then re-throw the error for any promises chained off the commit.</p></div></div><div class="code"><div class="wrapper"> <span class="p">}).</span><span class="k">catch</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="nx">dfd</span><span class="p">.</span><span class="nx">reject</span><span class="p">(</span><span class="nx">e</span><span class="p">);</span>
|
|
<span class="k">throw</span> <span class="nx">e</span><span class="p">;</span>
|
|
<span class="p">}).</span><span class="nx">bind</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="k">finally</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Kill the "_runner" object on the containerObject,
|
|
so it's not possible to continue using the transaction object.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">containerObject</span><span class="p">.</span><span class="nx">_runner</span> <span class="o">=</span> <span class="k">void</span> <span class="mi">0</span><span class="p">;</span>
|
|
|
|
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">cleanupConnection</span><span class="p">();</span>
|
|
<span class="p">});</span>
|
|
<span class="p">});</span>
|
|
|
|
<span class="nx">Runner</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">commitTransaction</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="k">this</span><span class="p">.</span><span class="nx">query</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">_commitTransaction</span><span class="p">});</span>
|
|
<span class="p">};</span>
|
|
<span class="nx">Runner</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">rollbackTransaction</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="k">this</span><span class="p">.</span><span class="nx">query</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">_rollbackTransaction</span><span class="p">});</span>
|
|
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Cleanup the connection as necessary, if the <code>_connection</code> was
|
|
explicitly set on the query we don't need to do anything here,
|
|
otherwise we</p></div></div><div class="code"><div class="wrapper"><span class="nx">Runner</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">cleanupConnection</span> <span class="o">=</span> <span class="nx">Promise</span><span class="p">.</span><span class="nx">method</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="k">this</span><span class="p">.</span><span class="nx">builder</span><span class="p">.</span><span class="nx">_connection</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">client</span><span class="p">.</span><span class="nx">releaseConnection</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">connection</span><span class="p">);</span>
|
|
<span class="p">}</span>
|
|
<span class="p">});</span>
|
|
|
|
<span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">Runner</span><span class="p">;</span></div></div></div></div></body></html> |