knex/docs/knex.html
2013-05-22 13:10:42 -04:00

4161 lines
165 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<title>knex.js</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
<link rel="stylesheet" media="all" href="docco.css" />
</head>
<body>
<div id="container">
<div id="background"></div>
<ul class="sections">
<li id="title">
<div class="annotation">
<h1>knex.js</h1>
</div>
</li>
<li id="section-1">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-1">&#182;</a>
</div>
<pre><code>Knex.js 0.1.4
(c) 2013 Tim Griesser
Knex may be freely distributed under the MIT license.
For details and documentation:
http://knexjs.org</code></pre>
</div>
<div class="content"><div class='highlight'><pre>(<span class="keyword">function</span>() {
<span class="string">"use strict"</span>;</pre></div></div>
</li>
<li id="section-2">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-2">&#182;</a>
</div>
<p>Required dependencies.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> _ = require(<span class="string">'underscore'</span>);
<span class="keyword">var</span> When = require(<span class="string">'when'</span>);
<span class="keyword">var</span> push = Array.prototype.push;</pre></div></div>
</li>
<li id="section-3">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-3">&#182;</a>
</div>
<p><code>Knex</code> is the root namespace and a chainable function: <code>Knex(&#39;tableName&#39;)</code></p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> Knex = <span class="keyword">function</span>(table) {
<span class="keyword">if</span> (!Knex.Instances[<span class="string">'main'</span>]) {
<span class="keyword">throw</span> <span class="keyword">new</span> Error(<span class="string">'The Knex instance has not been initialized yet.'</span>);
}
<span class="keyword">return</span> Knex.Instances[<span class="string">'main'</span>](table);
};</pre></div></div>
</li>
<li id="section-4">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-4">&#182;</a>
</div>
<p>Keep in sync with package.json</p>
</div>
<div class="content"><div class='highlight'><pre> Knex.VERSION = <span class="string">'0.1.4'</span>;</pre></div></div>
</li>
<li id="section-5">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-5">&#182;</a>
</div>
<p>Methods common to both the <code>Grammar</code> and <code>SchemaGrammar</code> interfaces,
used to generate the sql in one form or another.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> Common = {
_debug: <span class="literal">false</span>,
_promise: <span class="literal">null</span>,
debug: <span class="keyword">function</span>() {
<span class="keyword">this</span>._debug = <span class="literal">true</span>;
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-6">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-6">&#182;</a>
</div>
<p>For those who dislike promise interfaces.
Multiple calls to <code>exec</code> will resolve with the same value
if called more than once.</p>
</div>
<div class="content"><div class='highlight'><pre> exec: <span class="keyword">function</span>(callback) {
<span class="keyword">this</span>._promise || (<span class="keyword">this</span>._promise = <span class="keyword">this</span>.runQuery());
<span class="keyword">return</span> <span class="keyword">this</span>._promise.then(<span class="keyword">function</span>(resp) {
callback(<span class="literal">null</span>, resp);
}, <span class="keyword">function</span>(err) {
callback(err, <span class="literal">null</span>);
});
},</pre></div></div>
</li>
<li id="section-7">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-7">&#182;</a>
</div>
<p>The promise interface for the query builder.</p>
</div>
<div class="content"><div class='highlight'><pre> then: <span class="keyword">function</span>(onFulfilled, onRejected) {
<span class="keyword">this</span>._promise || (<span class="keyword">this</span>._promise = <span class="keyword">this</span>.runQuery());
<span class="keyword">return</span> <span class="keyword">this</span>._promise.then(onFulfilled, onRejected);
},</pre></div></div>
</li>
<li id="section-8">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-8">&#182;</a>
</div>
<p>Returns an array of query strings filled out with the
correct values based on bindings, etc. Useful for debugging.</p>
</div>
<div class="content"><div class='highlight'><pre> toString: <span class="keyword">function</span>() {
<span class="keyword">this</span>.type || (<span class="keyword">this</span>.type = <span class="string">'select'</span>);
<span class="keyword">var</span> data = <span class="keyword">this</span>.toSql();
<span class="keyword">var</span> builder = <span class="keyword">this</span>;
<span class="keyword">if</span> (!_.isArray(data)) data = [data];
<span class="keyword">return</span> _.map(data, <span class="keyword">function</span>(str) {
<span class="keyword">var</span> questionCount = <span class="number">0</span>;
<span class="keyword">return</span> str.replace(<span class="regexp">/\?/g</span>, <span class="keyword">function</span>() {
<span class="keyword">return</span> builder.bindings[questionCount++];
});
}).join(<span class="string">'; '</span>);
},</pre></div></div>
</li>
<li id="section-9">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-9">&#182;</a>
</div>
<p>Explicitly sets the connection.</p>
</div>
<div class="content"><div class='highlight'><pre> connection: <span class="keyword">function</span>(connection) {
<span class="keyword">this</span>._connection = connection;
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-10">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-10">&#182;</a>
</div>
<p>The connection the current query is being run on, optionally
specified by the <code>connection</code> method.</p>
</div>
<div class="content"><div class='highlight'><pre> _connection: <span class="literal">false</span>,</pre></div></div>
</li>
<li id="section-11">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-11">&#182;</a>
</div>
<p>Sets the &quot;type&quot; of the current query, so we can potentially place
<code>select</code>, <code>update</code>, <code>del</code>, etc. anywhere in the query statement
and have it come out fine.</p>
</div>
<div class="content"><div class='highlight'><pre> _setType: <span class="keyword">function</span>(type) {
<span class="keyword">if</span> (<span class="keyword">this</span>.type) {
<span class="keyword">throw</span> <span class="keyword">new</span> Error(<span class="string">'The query type has already been set to '</span> + <span class="keyword">this</span>.type);
}
<span class="keyword">this</span>.type = type;
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-12">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-12">&#182;</a>
</div>
<p>Returns all bindings excluding the <code>Knex.Raw</code> types.</p>
</div>
<div class="content"><div class='highlight'><pre> _cleanBindings: <span class="keyword">function</span>() {
<span class="keyword">var</span> bindings = <span class="keyword">this</span>.bindings;
<span class="keyword">var</span> cleaned = [];
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = bindings.length; i &lt; l; i++) {
<span class="keyword">if</span> (!(bindings[i] <span class="keyword">instanceof</span> Raw)) cleaned.push(bindings[i]);
}
<span class="keyword">return</span> cleaned;
},</pre></div></div>
</li>
<li id="section-13">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-13">&#182;</a>
</div>
<p>Runs the query on the current builder instance and returns a promise.</p>
</div>
<div class="content"><div class='highlight'><pre> runQuery: <span class="keyword">function</span>() {
<span class="keyword">if</span> (<span class="keyword">this</span>.transaction) {
<span class="keyword">if</span> (!<span class="keyword">this</span>.transaction.connection) <span class="keyword">return</span> When.reject(<span class="keyword">new</span> Error(<span class="string">'The transaction has already completed.'</span>));
<span class="keyword">this</span>._connection = <span class="keyword">this</span>.transaction.connection;
}</pre></div></div>
</li>
<li id="section-14">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-14">&#182;</a>
</div>
<p>Prep the SQL associated with the this.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">this</span>.sql = <span class="keyword">this</span>.toSql();
<span class="keyword">this</span>.bindings = <span class="keyword">this</span>._cleanBindings();
<span class="keyword">if</span> (!_.isArray(<span class="keyword">this</span>.sql)) <span class="keyword">this</span>.sql = [<span class="keyword">this</span>.sql];
<span class="keyword">var</span> chain;
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = <span class="keyword">this</span>.sql.length; i &lt; l; i++) {
<span class="keyword">if</span> (chain) {
chain.then(multiQuery(<span class="keyword">this</span>, i, chain));
} <span class="keyword">else</span> {
chain = multiQuery(<span class="keyword">this</span>, i);
}
}
<span class="keyword">return</span> chain;
}
};</pre></div></div>
</li>
<li id="section-15">
<div class="annotation">
<div class="pilwrap for-h2">
<a class="pilcrow" href="#section-15">&#182;</a>
</div>
<h2>Grammar</h2>
</div>
</li>
<li id="section-16">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-16">&#182;</a>
</div>
<p>The list of different components</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> components = [
<span class="string">'aggregate'</span>, <span class="string">'columns'</span>, <span class="string">'from'</span>,
<span class="string">'joins'</span>, <span class="string">'wheres'</span>, <span class="string">'groups'</span>, <span class="string">'havings'</span>,
<span class="string">'orders'</span>, <span class="string">'limit'</span>, <span class="string">'offset'</span>, <span class="string">'unions'</span>
];
Knex.Grammar = {</pre></div></div>
</li>
<li id="section-17">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-17">&#182;</a>
</div>
<p>Compiles the <code>select</code> statement, or nested sub-selects
by calling each of the component compilers, trimming out
the empties, and returning a generated query string.</p>
</div>
<div class="content"><div class='highlight'><pre> compileSelect: <span class="keyword">function</span>(qb) {
<span class="keyword">var</span> sql = {};
<span class="keyword">if</span> (_.isEmpty(qb.columns)) qb.columns = [<span class="string">'*'</span>];
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = components.length; i &lt; l; i++) {
<span class="keyword">var</span> component = components[i];
<span class="keyword">var</span> result = _.result(qb, component);
<span class="keyword">if</span> (result != <span class="literal">null</span>) {
sql[component] = <span class="keyword">this</span>[<span class="string">'compile'</span> + capitalize(component)](qb, result);
}
}
<span class="keyword">return</span> _.compact(sql).join(<span class="string">' '</span>);
},</pre></div></div>
</li>
<li id="section-18">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-18">&#182;</a>
</div>
<p>Compiles an aggregate query.</p>
</div>
<div class="content"><div class='highlight'><pre> compileAggregate: <span class="keyword">function</span>(qb) {
<span class="keyword">var</span> column = <span class="keyword">this</span>.columnize(qb.aggregate.columns);
<span class="keyword">if</span> (qb.isDistinct &amp;&amp; column !== <span class="string">'*'</span>) {
column = <span class="string">'distinct '</span> + column;
}
<span class="keyword">return</span> <span class="string">'select '</span> + qb.aggregate.type + <span class="string">'('</span> + column + <span class="string">') as aggregate'</span>;
},</pre></div></div>
</li>
<li id="section-19">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-19">&#182;</a>
</div>
<p>Compiles the columns in the query, specifying if an item was distinct.</p>
</div>
<div class="content"><div class='highlight'><pre> compileColumns: <span class="keyword">function</span>(qb, columns) {
<span class="keyword">if</span> (qb.aggregate != <span class="literal">null</span>) <span class="keyword">return</span>;
<span class="keyword">return</span> (qb.isDistinct ? <span class="string">'select distinct '</span> : <span class="string">'select '</span>) + <span class="keyword">this</span>.columnize(columns);
},</pre></div></div>
</li>
<li id="section-20">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-20">&#182;</a>
</div>
<p>Compiles the <code>from</code> tableName portion of the query.</p>
</div>
<div class="content"><div class='highlight'><pre> compileFrom: <span class="keyword">function</span>(qb, table) {
<span class="keyword">return</span> <span class="string">'from '</span> + <span class="keyword">this</span>.wrapTable(table);
},</pre></div></div>
</li>
<li id="section-21">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-21">&#182;</a>
</div>
<p>Compiles all each of the <code>join</code> clauses on the query,
including any nested join queries.</p>
</div>
<div class="content"><div class='highlight'><pre> compileJoins: <span class="keyword">function</span>(qb, joins) {
<span class="keyword">var</span> sql = [];
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = joins.length; i &lt; l; i++) {
<span class="keyword">var</span> join = joins[i];
<span class="keyword">var</span> clauses = [];
<span class="keyword">for</span> (<span class="keyword">var</span> i2 = <span class="number">0</span>, l2 = join.clauses.length; i2 &lt; l2; i2++) {
<span class="keyword">var</span> clause = join.clauses[i2];
clauses.push(
[clause[<span class="string">'bool'</span>], <span class="keyword">this</span>.wrap(clause[<span class="string">'first'</span>]), clause.operator, <span class="keyword">this</span>.wrap(clause[<span class="string">'second'</span>])].join(<span class="string">' '</span>)
);
}
clauses[<span class="number">0</span>] = clauses[<span class="number">0</span>].replace(<span class="regexp">/and |or /</span>, <span class="string">''</span>);
sql.push(join.type + <span class="string">' join '</span> + <span class="keyword">this</span>.wrapTable(join.table) + <span class="string">' on '</span> + clauses.join(<span class="string">' '</span>));
}
<span class="keyword">return</span> sql.join(<span class="string">' '</span>);
},</pre></div></div>
</li>
<li id="section-22">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-22">&#182;</a>
</div>
<p>Compiles all <code>where</code> statements on the query.</p>
</div>
<div class="content"><div class='highlight'><pre> compileWheres: <span class="keyword">function</span>(qb) {
<span class="keyword">var</span> sql = [];
<span class="keyword">var</span> wheres = qb.wheres;
<span class="keyword">if</span> (wheres.length === <span class="number">0</span>) <span class="keyword">return</span> <span class="string">''</span>;
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = wheres.length; i &lt; l; i++) {
<span class="keyword">var</span> where = wheres[i];
sql.push(where.bool + <span class="string">' '</span> + <span class="keyword">this</span>[<span class="string">'where'</span> + where.type](qb, where));
}
<span class="keyword">return</span> (sql.length &gt; <span class="number">0</span> ? <span class="string">'where '</span> + sql.join(<span class="string">' '</span>).replace(<span class="regexp">/and |or /</span>, <span class="string">''</span>) : <span class="string">''</span>);
},</pre></div></div>
</li>
<li id="section-23">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-23">&#182;</a>
</div>
<p>Compile the &quot;union&quot; queries attached to the main query.</p>
</div>
<div class="content"><div class='highlight'><pre> compileUnions: <span class="keyword">function</span>(qb) {
<span class="keyword">var</span> sql = <span class="string">''</span>;
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = qb.unions.length; i &lt; l; i++) {
<span class="keyword">var</span> union = qb.unions[i];
sql += (union.all ? <span class="string">'union all '</span> : <span class="string">'union '</span>) + <span class="keyword">this</span>.compileSelect(union.query);
}
<span class="keyword">return</span> sql;
},</pre></div></div>
</li>
<li id="section-24">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-24">&#182;</a>
</div>
<p>Compiles a nested where clause.</p>
</div>
<div class="content"><div class='highlight'><pre> whereNested: <span class="keyword">function</span>(qb, where) {
<span class="keyword">return</span> <span class="string">'('</span> + <span class="keyword">this</span>.compileWheres(where.query).slice(<span class="number">6</span>) + <span class="string">')'</span>;
},</pre></div></div>
</li>
<li id="section-25">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-25">&#182;</a>
</div>
<p>Compiles a nested where clause.</p>
</div>
<div class="content"><div class='highlight'><pre> whereSub: <span class="keyword">function</span>(qb, where) {
<span class="keyword">return</span> <span class="keyword">this</span>.wrap(where.column) + <span class="string">' '</span> + where.operator + <span class="string">' ('</span> + (<span class="keyword">this</span>.compileSelect(where.query)) + <span class="string">')'</span>;
},</pre></div></div>
</li>
<li id="section-26">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-26">&#182;</a>
</div>
<p>Compiles a basic where clause.</p>
</div>
<div class="content"><div class='highlight'><pre> whereBasic: <span class="keyword">function</span>(qb, where) {
<span class="keyword">return</span> <span class="keyword">this</span>.wrap(where.column) + <span class="string">' '</span> + where.operator + <span class="string">' '</span> + <span class="keyword">this</span>.parameter(where.value);
},</pre></div></div>
</li>
<li id="section-27">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-27">&#182;</a>
</div>
<p>Compiles a basic exists clause.</p>
</div>
<div class="content"><div class='highlight'><pre> whereExists: <span class="keyword">function</span>(qb, where) {
<span class="keyword">return</span> <span class="string">'exists ('</span> + <span class="keyword">this</span>.compileSelect(where.query) + <span class="string">')'</span>;
},</pre></div></div>
</li>
<li id="section-28">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-28">&#182;</a>
</div>
<p>Compiles a basic not exists clause.</p>
</div>
<div class="content"><div class='highlight'><pre> whereNotExists: <span class="keyword">function</span>(qb, where) {
<span class="keyword">return</span> <span class="string">'not exists ('</span> + <span class="keyword">this</span>.compileSelect(where.query) + <span class="string">')'</span>;
},</pre></div></div>
</li>
<li id="section-29">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-29">&#182;</a>
</div>
<p>Compiles a where in clause.</p>
</div>
<div class="content"><div class='highlight'><pre> whereIn: <span class="keyword">function</span>(qb, where) {
<span class="keyword">return</span> <span class="keyword">this</span>.wrap(where.column) + <span class="string">' in ('</span> + <span class="keyword">this</span>.parameterize(where.value) + <span class="string">')'</span>;
},</pre></div></div>
</li>
<li id="section-30">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-30">&#182;</a>
</div>
<p>Compiles a where not in clause.</p>
</div>
<div class="content"><div class='highlight'><pre> whereNotIn: <span class="keyword">function</span>(qb, where) {
<span class="keyword">return</span> <span class="keyword">this</span>.wrap(where.column) + <span class="string">' not in ('</span> + <span class="keyword">this</span>.parameterize(where.value) + <span class="string">')'</span>;
},</pre></div></div>
</li>
<li id="section-31">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-31">&#182;</a>
</div>
<p>Compiles a sub-where in clause.</p>
</div>
<div class="content"><div class='highlight'><pre> whereInSub: <span class="keyword">function</span>(qb, where) {
<span class="keyword">return</span> <span class="keyword">this</span>.wrap(where.column) + <span class="string">' in ('</span> + <span class="keyword">this</span>.compileSelect(where.query) + <span class="string">')'</span>;
},</pre></div></div>
</li>
<li id="section-32">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-32">&#182;</a>
</div>
<p>Compiles a sub-where not in clause.</p>
</div>
<div class="content"><div class='highlight'><pre> whereNotInSub: <span class="keyword">function</span>(qb, where) {
<span class="keyword">return</span> <span class="keyword">this</span>.wrap(where.column) + <span class="string">' not in ('</span> + <span class="keyword">this</span>.compileSelect(where.query) + <span class="string">')'</span>;
},</pre></div></div>
</li>
<li id="section-33">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-33">&#182;</a>
</div>
<p>Where between.</p>
</div>
<div class="content"><div class='highlight'><pre> whereBetween: <span class="keyword">function</span>(qb, where) {
<span class="keyword">return</span> <span class="keyword">this</span>.wrap(where.column) + <span class="string">' between ? and ?'</span>;
},
whereNull: <span class="keyword">function</span>(qb, where) {
<span class="keyword">return</span> <span class="keyword">this</span>.wrap(where.column) + <span class="string">' is null'</span>;
},
whereNotNull: <span class="keyword">function</span>(qb, where) {
<span class="keyword">return</span> <span class="keyword">this</span>.wrap(where.column) + <span class="string">' is not null'</span>;
},
whereRaw: <span class="keyword">function</span>(qb, where) {
<span class="keyword">return</span> where.sql;
},</pre></div></div>
</li>
<li id="section-34">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-34">&#182;</a>
</div>
<p>Compiles the <code>group by</code> columns.</p>
</div>
<div class="content"><div class='highlight'><pre> compileGroups: <span class="keyword">function</span>(qb, groups) {
<span class="keyword">return</span> <span class="string">'group by '</span> + <span class="keyword">this</span>.columnize(groups);
},</pre></div></div>
</li>
<li id="section-35">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-35">&#182;</a>
</div>
<p>Compiles the <code>having</code> statements.</p>
</div>
<div class="content"><div class='highlight'><pre> compileHavings: <span class="keyword">function</span>(qb, havings) {
<span class="keyword">return</span> <span class="string">'having '</span> + havings.map(<span class="keyword">function</span>(having) {
<span class="keyword">if</span> (having.type === <span class="string">'raw'</span>) {
<span class="keyword">return</span> having.bool + <span class="string">' '</span> + having.sql;
}
<span class="keyword">return</span> <span class="string">''</span> + <span class="keyword">this</span>.wrap(having.column) + <span class="string">' '</span> + having.operator + <span class="string">' '</span> + <span class="keyword">this</span>.parameter(having[<span class="string">'value'</span>]);
}, <span class="keyword">this</span>).join(<span class="string">'and '</span>).replace(<span class="regexp">/and /</span>, <span class="string">''</span>);
},</pre></div></div>
</li>
<li id="section-36">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-36">&#182;</a>
</div>
<p>Compiles the <code>order by</code> statements.</p>
</div>
<div class="content"><div class='highlight'><pre> compileOrders: <span class="keyword">function</span>(qb, orders) {
<span class="keyword">if</span> (orders.length &gt; <span class="number">0</span>) {
<span class="keyword">return</span> <span class="string">'order by '</span> + orders.map(<span class="keyword">function</span>(order) {
<span class="keyword">return</span> <span class="string">''</span> + <span class="keyword">this</span>.wrap(order.column) + <span class="string">' '</span> + order.direction;
}, <span class="keyword">this</span>).join(<span class="string">', '</span>);
}
},</pre></div></div>
</li>
<li id="section-37">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-37">&#182;</a>
</div>
<p>Compiles the <code>limit</code> statements.</p>
</div>
<div class="content"><div class='highlight'><pre> compileLimit: <span class="keyword">function</span>(qb, limit) {
<span class="keyword">return</span> <span class="string">'limit '</span> + limit;
},</pre></div></div>
</li>
<li id="section-38">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-38">&#182;</a>
</div>
<p>Compiles an <code>offset</code> statement on the query.</p>
</div>
<div class="content"><div class='highlight'><pre> compileOffset: <span class="keyword">function</span>(qb, offset) {
<span class="keyword">return</span> <span class="string">'offset '</span> + offset;
},</pre></div></div>
</li>
<li id="section-39">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-39">&#182;</a>
</div>
<p>Compiles an <code>insert</code> query, allowing for multiple
inserts using a single query statement.</p>
</div>
<div class="content"><div class='highlight'><pre> compileInsert: <span class="keyword">function</span>(qb) {
<span class="keyword">var</span> values = qb.values;
<span class="keyword">var</span> table = <span class="keyword">this</span>.wrapTable(qb.table);
<span class="keyword">var</span> columns = <span class="keyword">this</span>.columnize(_.keys(values[<span class="number">0</span>]).sort());
<span class="keyword">var</span> parameters = <span class="keyword">this</span>.parameterize(_.values(values[<span class="number">0</span>]));
<span class="keyword">var</span> paramBlocks = [];</pre></div></div>
</li>
<li id="section-40">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-40">&#182;</a>
</div>
<p>If there are any &quot;where&quot; clauses, we need to omit
any bindings that may have been associated with them.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">if</span> (qb.wheres.length &gt; <span class="number">0</span>) <span class="keyword">this</span>._clearWhereBindings(qb);
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = values.length; i &lt; l; ++i) {
paramBlocks.push(<span class="string">"("</span> + parameters + <span class="string">")"</span>);
}
<span class="keyword">return</span> <span class="string">"insert into "</span> + table + <span class="string">" ("</span> + columns + <span class="string">") values "</span> + paramBlocks.join(<span class="string">', '</span>);
},</pre></div></div>
</li>
<li id="section-41">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-41">&#182;</a>
</div>
<p>Depending on the type of <code>where</code> clause, this will appropriately
remove any binding caused by &quot;where&quot; constraints, allowing the same
query to be used for <code>insert</code> and <code>update</code> without issue.</p>
</div>
<div class="content"><div class='highlight'><pre> _clearWhereBindings: <span class="keyword">function</span>(qb) {
<span class="keyword">var</span> wheres = qb.wheres;
<span class="keyword">var</span> bindingCount = <span class="number">0</span>;
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = wheres.length; i&lt;l; i++) {
<span class="keyword">var</span> where = wheres[i];
<span class="keyword">if</span> (_.isArray(where.value)) {
bindingCount += where.value.length;
} <span class="keyword">else</span> <span class="keyword">if</span> (where.query) {
bindingCount += where.query.bindings.length;
} <span class="keyword">else</span> {
bindingCount += <span class="number">1</span>;
}
}
qb.bindings = qb.bindings.slice(bindingCount);
},</pre></div></div>
</li>
<li id="section-42">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-42">&#182;</a>
</div>
<p>Compiles an <code>update</code> query.</p>
</div>
<div class="content"><div class='highlight'><pre> compileUpdate: <span class="keyword">function</span>(qb) {
<span class="keyword">var</span> values = qb.values;
<span class="keyword">var</span> table = <span class="keyword">this</span>.wrapTable(qb.table), columns = [];
<span class="keyword">for</span> (<span class="keyword">var</span> i=<span class="number">0</span>, l = values.length; i &lt; l; i++) {
<span class="keyword">var</span> value = values[i];
columns.push(<span class="keyword">this</span>.wrap(value[<span class="number">0</span>]) + <span class="string">' = '</span> + <span class="keyword">this</span>.parameter(value[<span class="number">1</span>]));
}
<span class="keyword">return</span> <span class="string">'update '</span> + table + <span class="string">' set '</span> + columns.join(<span class="string">', '</span>) + <span class="string">' '</span> + <span class="keyword">this</span>.compileWheres(qb);
},</pre></div></div>
</li>
<li id="section-43">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-43">&#182;</a>
</div>
<p>Compiles a <code>delete</code> query.</p>
</div>
<div class="content"><div class='highlight'><pre> compileDelete: <span class="keyword">function</span>(qb) {
<span class="keyword">var</span> table = <span class="keyword">this</span>.wrapTable(qb.table);
<span class="keyword">var</span> where = !_.isEmpty(qb.wheres) ? <span class="keyword">this</span>.compileWheres(qb) : <span class="string">''</span>;
<span class="keyword">return</span> <span class="string">'delete from '</span> + table + <span class="string">' '</span> + where;
},</pre></div></div>
</li>
<li id="section-44">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-44">&#182;</a>
</div>
<p>Compiles a <code>truncate</code> query.</p>
</div>
<div class="content"><div class='highlight'><pre> compileTruncate: <span class="keyword">function</span>(qb) {
<span class="keyword">return</span> <span class="string">'truncate '</span> + <span class="keyword">this</span>.wrapTable(qb.table);
},
wrap: <span class="keyword">function</span>(value) {
<span class="keyword">var</span> segments;
<span class="keyword">if</span> (value <span class="keyword">instanceof</span> Raw) <span class="keyword">return</span> value.value;
<span class="keyword">if</span> (_.isNumber(value)) <span class="keyword">return</span> value;
<span class="keyword">if</span> (value.toLowerCase().indexOf(<span class="string">' as '</span>) !== -<span class="number">1</span>) {
segments = value.split(<span class="string">' '</span>);
<span class="keyword">return</span> <span class="keyword">this</span>.wrap(segments[<span class="number">0</span>]) + <span class="string">' as '</span> + <span class="keyword">this</span>.wrap(segments[<span class="number">2</span>]);
}
<span class="keyword">var</span> wrapped = [];
segments = value.split(<span class="string">'.'</span>);
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = segments.length; i &lt; l; i = ++i) {
value = segments[i];
<span class="keyword">if</span> (i === <span class="number">0</span> &amp;&amp; segments.length &gt; <span class="number">1</span>) {
wrapped.push(<span class="keyword">this</span>.wrapTable(value));
} <span class="keyword">else</span> {
wrapped.push(<span class="keyword">this</span>.wrapValue(value));
}
}
<span class="keyword">return</span> wrapped.join(<span class="string">'.'</span>);
},
wrapArray: <span class="keyword">function</span>(values) {
<span class="keyword">return</span> _.map(values, <span class="keyword">this</span>.wrap, <span class="keyword">this</span>);
},
wrapTable: <span class="keyword">function</span>(table) {
<span class="keyword">if</span> (table <span class="keyword">instanceof</span> Raw) <span class="keyword">return</span> table.value;
<span class="keyword">return</span> <span class="keyword">this</span>.wrap(table);
},
columnize: <span class="keyword">function</span>(columns) {
<span class="keyword">return</span> _.map(columns, <span class="keyword">this</span>.wrap, <span class="keyword">this</span>).join(<span class="string">', '</span>);
},
parameterize: <span class="keyword">function</span>(values) {
<span class="keyword">return</span> _.map(values, <span class="keyword">this</span>.parameter, <span class="keyword">this</span>).join(<span class="string">', '</span>);
},
parameter: <span class="keyword">function</span>(value) {
<span class="keyword">return</span> (value <span class="keyword">instanceof</span> Raw ? value.value : <span class="string">'?'</span>);
}
};</pre></div></div>
</li>
<li id="section-45">
<div class="annotation">
<div class="pilwrap for-h2">
<a class="pilcrow" href="#section-45">&#182;</a>
</div>
<h2>Knex.Builder</h2>
</div>
</li>
<li id="section-46">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-46">&#182;</a>
</div>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> Builder = Knex.Builder = <span class="keyword">function</span>(table) {</pre></div></div>
</li>
<li id="section-47">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-47">&#182;</a>
</div>
<p>We use this logic to create sub-builders
for the advanced query statements.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">if</span> (table) {
<span class="keyword">if</span> (_.isString(table)) {
<span class="keyword">this</span>.table = table;
} <span class="keyword">else</span> {
<span class="keyword">this</span>.client = table.client;
<span class="keyword">this</span>.grammar = table.grammar;
}
}
<span class="keyword">this</span>.reset();
};</pre></div></div>
</li>
<li id="section-48">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-48">&#182;</a>
</div>
<p>All operators used in the <code>where</code> clause generation.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> operators = [<span class="string">'='</span>, <span class="string">'&lt;'</span>, <span class="string">'&gt;'</span>, <span class="string">'&lt;='</span>, <span class="string">'&gt;='</span>, <span class="string">'&lt;&gt;'</span>, <span class="string">'like'</span>, <span class="string">'not like'</span>, <span class="string">'between'</span>, <span class="string">'ilike'</span>];
_.extend(Builder.prototype, Common, {
_source: <span class="string">'Builder'</span>,
_idAttribute: <span class="string">'id'</span>,</pre></div></div>
</li>
<li id="section-49">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-49">&#182;</a>
</div>
<p>Sets the <code>returning</code> for the query - only necessary
to set the &quot;returning&quot; value for the postgres insert,
defaults to <code>id</code>.</p>
</div>
<div class="content"><div class='highlight'><pre> idAttribute: <span class="keyword">function</span>(val) {
<span class="keyword">this</span>._idAttribute = val;
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-50">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-50">&#182;</a>
</div>
<p>Sets the <code>tableName</code> on the query.</p>
</div>
<div class="content"><div class='highlight'><pre> from: <span class="keyword">function</span>(tableName) {
<span class="keyword">if</span> (!tableName) <span class="keyword">return</span> <span class="keyword">this</span>.table;
<span class="keyword">this</span>.table = tableName;
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-51">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-51">&#182;</a>
</div>
<p>Adds a column to the list of &quot;columns&quot; being selected
on the query.</p>
</div>
<div class="content"><div class='highlight'><pre> column: <span class="keyword">function</span>(value) {
<span class="keyword">this</span>.columns.push(value);
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-52">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-52">&#182;</a>
</div>
<p>Adds a <code>distinct</code> clause to the query.</p>
</div>
<div class="content"><div class='highlight'><pre> distinct: <span class="keyword">function</span>(column) {
<span class="keyword">this</span>.column(column);
<span class="keyword">this</span>.isDistinct = <span class="literal">true</span>;
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-53">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-53">&#182;</a>
</div>
<p>Compiles the current query builder.</p>
</div>
<div class="content"><div class='highlight'><pre> toSql: <span class="keyword">function</span>() {
<span class="keyword">this</span>.type || (<span class="keyword">this</span>.type = <span class="string">'select'</span>);
<span class="keyword">return</span> <span class="keyword">this</span>.grammar[<span class="string">'compile'</span> + capitalize(<span class="keyword">this</span>.type)](<span class="keyword">this</span>);
},</pre></div></div>
</li>
<li id="section-54">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-54">&#182;</a>
</div>
<p>Clones the current query builder, including any
pieces that have been set thus far.</p>
</div>
<div class="content"><div class='highlight'><pre> clone: <span class="keyword">function</span>() {
<span class="keyword">var</span> item = <span class="keyword">new</span> Builder(<span class="keyword">this</span>.table);
item.client = <span class="keyword">this</span>.client;
item.grammar = <span class="keyword">this</span>.grammar;
<span class="keyword">var</span> items = [
<span class="string">'_idAttribute'</span>, <span class="string">'isDistinct'</span>, <span class="string">'joins'</span>, <span class="string">'wheres'</span>, <span class="string">'orders'</span>,
<span class="string">'columns'</span>, <span class="string">'bindings'</span>, <span class="string">'grammar'</span>, <span class="string">'transaction'</span>, <span class="string">'unions'</span>
];
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = items.length; i &lt; l; i++) {
<span class="keyword">var</span> k = items[i];
item[k] = <span class="keyword">this</span>[k];
}
<span class="keyword">return</span> item;
},</pre></div></div>
</li>
<li id="section-55">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-55">&#182;</a>
</div>
<p>Resets all attributes on the query builder.</p>
</div>
<div class="content"><div class='highlight'><pre> reset: <span class="keyword">function</span>() {
<span class="keyword">this</span>.joins = [];
<span class="keyword">this</span>.values = [];
<span class="keyword">this</span>.unions = [];
<span class="keyword">this</span>.wheres = [];
<span class="keyword">this</span>.orders = [];
<span class="keyword">this</span>.columns = [];
<span class="keyword">this</span>.bindings = [];
<span class="keyword">this</span>.isDistinct = <span class="literal">false</span>;
},</pre></div></div>
</li>
<li id="section-56">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-56">&#182;</a>
</div>
<p>Adds a join clause to the query, allowing for advanced joins
with an anonymous function as the second argument.</p>
</div>
<div class="content"><div class='highlight'><pre> join: <span class="keyword">function</span>(table, first, operator, second, type) {
<span class="keyword">var</span> join;
<span class="keyword">if</span> (_.isFunction(first)) {
type = operator;
join = <span class="keyword">new</span> JoinClause(type || <span class="string">'inner'</span>, table);
first.call(join, join);
} <span class="keyword">else</span> {
join = <span class="keyword">new</span> JoinClause(type || <span class="string">'inner'</span>, table);
join.on(first, operator, second);
}
<span class="keyword">this</span>.joins.push(join);
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-57">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-57">&#182;</a>
</div>
<p>The where function can be used in several ways:
The most basic is <code>where(key, value)</code>, which expands to
where key = value.</p>
</div>
<div class="content"><div class='highlight'><pre> where: <span class="keyword">function</span>(column, operator, value, bool) {
bool || (bool = <span class="string">'and'</span>);
<span class="keyword">if</span> (_.isFunction(column)) {
<span class="keyword">return</span> <span class="keyword">this</span>._whereNested(column, bool);
}
<span class="keyword">if</span> (_.isObject(column)) {
<span class="keyword">for</span> (<span class="keyword">var</span> key <span class="keyword">in</span> column) {
value = column[key];
<span class="keyword">this</span>[bool + <span class="string">'Where'</span>](key, <span class="string">'='</span>, value);
}
<span class="keyword">return</span> <span class="keyword">this</span>;
}
<span class="keyword">if</span> (!_.contains(operators, operator)) {
value = operator;
operator = <span class="string">'='</span>;
}
<span class="keyword">if</span> (_.isFunction(value)) {
<span class="keyword">return</span> <span class="keyword">this</span>._whereSub(column, operator, value, bool);
}
<span class="keyword">this</span>.wheres.push({
type: <span class="string">'Basic'</span>,
column: column,
operator: operator,
value: value,
bool: bool
});
<span class="keyword">this</span>.bindings.push(value);
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-58">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-58">&#182;</a>
</div>
<p>Alias to <code>where</code>, for internal builder consistency.</p>
</div>
<div class="content"><div class='highlight'><pre> andWhere: <span class="keyword">function</span>() {
<span class="keyword">return</span> <span class="keyword">this</span>.where.apply(<span class="keyword">this</span>, arguments);
},</pre></div></div>
</li>
<li id="section-59">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-59">&#182;</a>
</div>
<p>Adds an <code>or where</code> clause to the query.</p>
</div>
<div class="content"><div class='highlight'><pre> orWhere: <span class="keyword">function</span>(column, operator, value) {
<span class="keyword">return</span> <span class="keyword">this</span>.where(column, operator, value, <span class="string">'or'</span>);
},</pre></div></div>
</li>
<li id="section-60">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-60">&#182;</a>
</div>
<p>Adds a raw <code>where</code> clause to the query.</p>
</div>
<div class="content"><div class='highlight'><pre> whereRaw: <span class="keyword">function</span>(sql, bindings, bool) {
bindings || (bindings = []);
bool || (bool = <span class="string">'and'</span>);
<span class="keyword">this</span>.wheres.push({type: <span class="string">'Raw'</span>, sql:sql, bool:bool});
push.apply(<span class="keyword">this</span>.bindings, bindings);
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-61">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-61">&#182;</a>
</div>
<p>Adds a raw <code>or where</code> clause to the query.</p>
</div>
<div class="content"><div class='highlight'><pre> orWhereRaw: <span class="keyword">function</span>(sql, bindings) {
<span class="keyword">return</span> <span class="keyword">this</span>.whereRaw(sql, bindings, <span class="string">'or'</span>);
},</pre></div></div>
</li>
<li id="section-62">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-62">&#182;</a>
</div>
<p>Adds a <code>where exists</code> clause to the query.</p>
</div>
<div class="content"><div class='highlight'><pre> whereExists: <span class="keyword">function</span>(callback, bool, type) {
<span class="keyword">var</span> query = <span class="keyword">new</span> Builder(<span class="keyword">this</span>);
callback.call(query, query);
<span class="keyword">this</span>.wheres.push({
type: (type || <span class="string">'Exists'</span>),
query: query,
bool: (bool || <span class="string">'and'</span>)
});
push.apply(<span class="keyword">this</span>.bindings, query.bindings);
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-63">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-63">&#182;</a>
</div>
<p>Adds an <code>or where exists</code> clause to the query.</p>
</div>
<div class="content"><div class='highlight'><pre> orWhereExists: <span class="keyword">function</span>(callback) {
<span class="keyword">return</span> <span class="keyword">this</span>.whereExists(callback, <span class="string">'or'</span>);
},</pre></div></div>
</li>
<li id="section-64">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-64">&#182;</a>
</div>
<p>Adds a <code>where not exists</code> clause to the query.</p>
</div>
<div class="content"><div class='highlight'><pre> whereNotExists: <span class="keyword">function</span>(callback) {
<span class="keyword">return</span> <span class="keyword">this</span>.whereExists(callback, <span class="string">'and'</span>, <span class="string">'NotExists'</span>);
},</pre></div></div>
</li>
<li id="section-65">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-65">&#182;</a>
</div>
<p>Adds a <code>or where not exists</code> clause to the query.</p>
</div>
<div class="content"><div class='highlight'><pre> orWhereNotExists: <span class="keyword">function</span>(callback) {
<span class="keyword">return</span> <span class="keyword">this</span>.whereExists(callback, <span class="string">'or'</span>, <span class="string">'NotExists'</span>);
},</pre></div></div>
</li>
<li id="section-66">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-66">&#182;</a>
</div>
<p>Adds a <code>where in</code> clause to the query.</p>
</div>
<div class="content"><div class='highlight'><pre> whereIn: <span class="keyword">function</span>(column, values, bool, condition) {
bool || (bool = <span class="string">'and'</span>);
<span class="keyword">if</span> (_.isFunction(values)) {
<span class="keyword">return</span> <span class="keyword">this</span>._whereInSub(column, values, bool, (condition || <span class="string">'In'</span>));
}
<span class="keyword">this</span>.wheres.push({
type: (condition || <span class="string">'In'</span>),
column: column,
value: values,
bool: bool
});
push.apply(<span class="keyword">this</span>.bindings, values);
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-67">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-67">&#182;</a>
</div>
<p>Adds a <code>or where in</code> clause to the query.</p>
</div>
<div class="content"><div class='highlight'><pre> orWhereIn: <span class="keyword">function</span>(column, values) {
<span class="keyword">return</span> <span class="keyword">this</span>.whereIn(column, values, <span class="string">'or'</span>);
},</pre></div></div>
</li>
<li id="section-68">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-68">&#182;</a>
</div>
<p>Adds a <code>where not in</code> clause to the query.</p>
</div>
<div class="content"><div class='highlight'><pre> whereNotIn: <span class="keyword">function</span>(column, values) {
<span class="keyword">return</span> <span class="keyword">this</span>.whereIn(column, values, <span class="string">'and'</span>, <span class="string">'NotIn'</span>);
},</pre></div></div>
</li>
<li id="section-69">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-69">&#182;</a>
</div>
<p>Adds a <code>or where not in</code> clause to the query.</p>
</div>
<div class="content"><div class='highlight'><pre> orWhereNotIn: <span class="keyword">function</span>(column, values) {
<span class="keyword">return</span> <span class="keyword">this</span>.whereIn(column, values, <span class="string">'or'</span>, <span class="string">'NotIn'</span>);
},</pre></div></div>
</li>
<li id="section-70">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-70">&#182;</a>
</div>
<p>Adds a <code>where null</code> clause to the query.</p>
</div>
<div class="content"><div class='highlight'><pre> whereNull: <span class="keyword">function</span>(column, bool, type) {
<span class="keyword">this</span>.wheres.push({type: (type || <span class="string">'Null'</span>), column: column, bool: (bool || <span class="string">'and'</span>)});
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-71">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-71">&#182;</a>
</div>
<p>Adds a <code>or where null</code> clause to the query.</p>
</div>
<div class="content"><div class='highlight'><pre> orWhereNull: <span class="keyword">function</span>(column) {
<span class="keyword">return</span> <span class="keyword">this</span>.whereNull(column, <span class="string">'or'</span>, <span class="string">'Null'</span>);
},</pre></div></div>
</li>
<li id="section-72">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-72">&#182;</a>
</div>
<p>Adds a <code>where not null</code> clause to the query.</p>
</div>
<div class="content"><div class='highlight'><pre> whereNotNull: <span class="keyword">function</span>(column) {
<span class="keyword">return</span> <span class="keyword">this</span>.whereNull(column, <span class="string">'and'</span>, <span class="string">'NotNull'</span>);
},</pre></div></div>
</li>
<li id="section-73">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-73">&#182;</a>
</div>
<p>Adds a <code>or where not null</code> clause to the query.</p>
</div>
<div class="content"><div class='highlight'><pre> orWhereNotNull: <span class="keyword">function</span>(column) {
<span class="keyword">return</span> <span class="keyword">this</span>.whereNull(column, <span class="string">'or'</span>, <span class="string">'NotNull'</span>);
},</pre></div></div>
</li>
<li id="section-74">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-74">&#182;</a>
</div>
<p>Adds a <code>where between</code> clause to the query.</p>
</div>
<div class="content"><div class='highlight'><pre> whereBetween: <span class="keyword">function</span>(column, values) {
<span class="keyword">this</span>.wheres.push({column: column, type: <span class="string">'Between'</span>, bool: <span class="string">'and'</span>});
push.apply(<span class="keyword">this</span>.bindings, values);
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-75">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-75">&#182;</a>
</div>
<p>Adds a <code>or where between</code> clause to the query.</p>
</div>
<div class="content"><div class='highlight'><pre> orWhereBetween: <span class="keyword">function</span>(column, values) {
<span class="keyword">this</span>.wheres.push({column: column, type: <span class="string">'Between'</span>, bool: <span class="string">'or'</span>});
push.apply(<span class="keyword">this</span>.bindings, values);
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-76">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-76">&#182;</a>
</div>
<hr>
</div>
</li>
<li id="section-77">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-77">&#182;</a>
</div>
<p>Adds a <code>group by</code> clause to the query.</p>
</div>
<div class="content"><div class='highlight'><pre> groupBy: <span class="keyword">function</span>() {
<span class="keyword">this</span>.groups = (<span class="keyword">this</span>.groups || []).concat(_.toArray(arguments));
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-78">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-78">&#182;</a>
</div>
<p>Adds a <code>order by</code> clause to the query.</p>
</div>
<div class="content"><div class='highlight'><pre> orderBy: <span class="keyword">function</span>(column, direction) {
<span class="keyword">this</span>.orders.push({column: column, direction: (direction || <span class="string">'asc'</span>)});
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-79">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-79">&#182;</a>
</div>
<p>Add a union statement to the query.</p>
</div>
<div class="content"><div class='highlight'><pre> union: <span class="keyword">function</span>(callback) {
<span class="keyword">this</span>._union(callback, <span class="literal">false</span>);
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-80">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-80">&#182;</a>
</div>
<p>Adds a union all statement to the query.</p>
</div>
<div class="content"><div class='highlight'><pre> unionAll: <span class="keyword">function</span>(callback) {
<span class="keyword">this</span>._union(callback, <span class="literal">true</span>);
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-81">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-81">&#182;</a>
</div>
<p>Adds a <code>having</code> clause to the query.</p>
</div>
<div class="content"><div class='highlight'><pre> having: <span class="keyword">function</span>(column, operator, value) {
<span class="keyword">this</span>.havings.push({column: column, operator: (operator || <span class="string">''</span>), value: (value || <span class="string">''</span>)});
<span class="keyword">this</span>.bindings.push(value);
<span class="keyword">return</span> <span class="keyword">this</span>;
},
havingRaw: <span class="keyword">function</span>(sql, bindings) {
<span class="keyword">this</span>.havings.push({type: <span class="string">'Raw'</span>, sql: sql, bool: <span class="string">'and'</span>});
<span class="keyword">this</span>.bindings.push(bindings);
<span class="keyword">return</span> <span class="keyword">this</span>;
},
orHavingRaw: <span class="keyword">function</span>(sql, bindings) {
<span class="keyword">this</span>.havings.push({type: <span class="string">'Raw'</span>, sql: sql, bool: <span class="string">'or'</span>});
<span class="keyword">this</span>.bindings.push(bindings);
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-82">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-82">&#182;</a>
</div>
<hr>
</div>
</li>
<li id="section-83">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-83">&#182;</a>
</div>
</div>
<div class="content"><div class='highlight'><pre> offset: <span class="keyword">function</span>(value) {
<span class="keyword">if</span> (value == <span class="literal">null</span>) <span class="keyword">return</span> <span class="keyword">this</span>.isOffset;
<span class="keyword">this</span>.isOffset = value;
<span class="keyword">return</span> <span class="keyword">this</span>;
},
limit: <span class="keyword">function</span>(value) {
<span class="keyword">if</span> (value == <span class="literal">null</span>) <span class="keyword">return</span> <span class="keyword">this</span>.isLimit;
<span class="keyword">this</span>.isLimit = value;
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-84">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-84">&#182;</a>
</div>
<hr>
</div>
</li>
<li id="section-85">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-85">&#182;</a>
</div>
<p>Retrieve the &quot;count&quot; result of the query.</p>
</div>
<div class="content"><div class='highlight'><pre> count: <span class="keyword">function</span>(column) {
<span class="keyword">return</span> <span class="keyword">this</span>._aggregate(<span class="string">'count'</span>, column);
},</pre></div></div>
</li>
<li id="section-86">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-86">&#182;</a>
</div>
<p>Retrieve the minimum value of a given column.</p>
</div>
<div class="content"><div class='highlight'><pre> min: <span class="keyword">function</span>(column) {
<span class="keyword">return</span> <span class="keyword">this</span>._aggregate(<span class="string">'min'</span>, column);
},</pre></div></div>
</li>
<li id="section-87">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-87">&#182;</a>
</div>
<p>Retrieve the maximum value of a given column.</p>
</div>
<div class="content"><div class='highlight'><pre> max: <span class="keyword">function</span>(column) {
<span class="keyword">return</span> <span class="keyword">this</span>._aggregate(<span class="string">'max'</span>, column);
},</pre></div></div>
</li>
<li id="section-88">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-88">&#182;</a>
</div>
<p>Retrieve the sum of the values of a given column.</p>
</div>
<div class="content"><div class='highlight'><pre> sum: <span class="keyword">function</span>(column) {
<span class="keyword">return</span> <span class="keyword">this</span>._aggregate(<span class="string">'sum'</span>, column);
},</pre></div></div>
</li>
<li id="section-89">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-89">&#182;</a>
</div>
<p>Increments a column&#39;s value by the specified amount.</p>
</div>
<div class="content"><div class='highlight'><pre> increment: <span class="keyword">function</span>(column, amount) {
<span class="keyword">return</span> <span class="keyword">this</span>._counter(column, amount);
},</pre></div></div>
</li>
<li id="section-90">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-90">&#182;</a>
</div>
<p>Decrements a column&#39;s value by the specified amount.</p>
</div>
<div class="content"><div class='highlight'><pre> decrement: <span class="keyword">function</span>(column, amount) {
<span class="keyword">return</span> <span class="keyword">this</span>._counter(column, amount, <span class="string">'-'</span>);
},</pre></div></div>
</li>
<li id="section-91">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-91">&#182;</a>
</div>
<p>Sets the values for a <code>select</code> query.</p>
</div>
<div class="content"><div class='highlight'><pre> select: <span class="keyword">function</span>(columns) {
<span class="keyword">if</span> (columns) {
push.apply(<span class="keyword">this</span>.columns, _.isArray(columns) ? columns : _.toArray(arguments));
}
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'select'</span>);
},</pre></div></div>
</li>
<li id="section-92">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-92">&#182;</a>
</div>
<p>Sets the values for an <code>insert</code> query.</p>
</div>
<div class="content"><div class='highlight'><pre> insert: <span class="keyword">function</span>(values) {
<span class="keyword">this</span>.values = <span class="keyword">this</span>._prepValues(values);
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'insert'</span>);
},</pre></div></div>
</li>
<li id="section-93">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-93">&#182;</a>
</div>
<p>Sets the values for an <code>update</code> query.</p>
</div>
<div class="content"><div class='highlight'><pre> update: <span class="keyword">function</span>(values) {
<span class="keyword">var</span> obj = sortObject(values);
<span class="keyword">var</span> bindings = [];
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = obj.length; i &lt; l; i++) {
bindings[i] = obj[i][<span class="number">1</span>];
}
<span class="keyword">this</span>.bindings = bindings.concat(<span class="keyword">this</span>.bindings || []);
<span class="keyword">this</span>.values = obj;
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'update'</span>);
},</pre></div></div>
</li>
<li id="section-94">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-94">&#182;</a>
</div>
<p>Alias to del.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="string">"delete"</span>: <span class="keyword">function</span>() {
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'delete'</span>);
},</pre></div></div>
</li>
<li id="section-95">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-95">&#182;</a>
</div>
<p>Executes a delete statement on the query;</p>
</div>
<div class="content"><div class='highlight'><pre> del: <span class="keyword">function</span>() {
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'delete'</span>);
},</pre></div></div>
</li>
<li id="section-96">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-96">&#182;</a>
</div>
<p>Truncate</p>
</div>
<div class="content"><div class='highlight'><pre> truncate: <span class="keyword">function</span>() {
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'truncate'</span>);
},</pre></div></div>
</li>
<li id="section-97">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-97">&#182;</a>
</div>
<p>Set by <code>transacting</code> - contains the object with the connection
needed to execute a transaction</p>
</div>
<div class="content"><div class='highlight'><pre> transaction: <span class="literal">false</span>,</pre></div></div>
</li>
<li id="section-98">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-98">&#182;</a>
</div>
<p>Sets the current Builder connection to that of the
the currently running transaction</p>
</div>
<div class="content"><div class='highlight'><pre> transacting: <span class="keyword">function</span>(t) {
<span class="keyword">if</span> (!t) <span class="keyword">throw</span> <span class="keyword">new</span> Error(<span class="string">'A transaction object must be passed to "transacting".'</span>);
<span class="keyword">this</span>.transaction = t;
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-99">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-99">&#182;</a>
</div>
<hr>
</div>
</li>
<li id="section-100">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-100">&#182;</a>
</div>
</div>
<div class="content"><div class='highlight'><pre> _prepValues: <span class="keyword">function</span>(values) {
<span class="keyword">if</span> (!_.isArray(values)) values = values ? [values] : [];
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = values.length; i&lt;l; i++) {
<span class="keyword">var</span> obj = sortObject(values[i]);
<span class="keyword">for</span> (<span class="keyword">var</span> i2 = <span class="number">0</span>, l2 = obj.length; i2 &lt; l2; i2++) {
<span class="keyword">this</span>.bindings.push(obj[i2][<span class="number">1</span>]);
}
}
<span class="keyword">return</span> values;
},</pre></div></div>
</li>
<li id="section-101">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-101">&#182;</a>
</div>
<p>Helper for compiling any advanced <code>where in</code> queries.</p>
</div>
<div class="content"><div class='highlight'><pre> _whereInSub: <span class="keyword">function</span>(column, callback, bool, condition) {
condition += <span class="string">'Sub'</span>;
<span class="keyword">var</span> query = <span class="keyword">new</span> Builder(<span class="keyword">this</span>);
callback.call(query, query);
<span class="keyword">this</span>.wheres.push({type: condition, column: column, query: query, bool: bool});
push.apply(<span class="keyword">this</span>.bindings, query.bindings);
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-102">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-102">&#182;</a>
</div>
<p>Helper for compiling any advanced <code>where</code> queries.</p>
</div>
<div class="content"><div class='highlight'><pre> _whereNested: <span class="keyword">function</span>(callback, bool) {
<span class="keyword">var</span> query = <span class="keyword">new</span> Builder(<span class="keyword">this</span>);
query.table = <span class="keyword">this</span>.table;
callback.call(query, query);
<span class="keyword">this</span>.wheres.push({type: <span class="string">'Nested'</span>, query: query, bool: bool});
push.apply(<span class="keyword">this</span>.bindings, query.bindings);
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-103">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-103">&#182;</a>
</div>
<p>Helper for compiling any of the <code>where</code> advanced queries.</p>
</div>
<div class="content"><div class='highlight'><pre> _whereSub: <span class="keyword">function</span>(column, operator, callback, bool) {
<span class="keyword">var</span> query = <span class="keyword">new</span> Builder(<span class="keyword">this</span>);
callback.call(query, query);
<span class="keyword">this</span>.wheres.push({
type: <span class="string">'Sub'</span>,
column: column,
operator: operator,
query: query,
bool: bool
});
push.apply(<span class="keyword">this</span>.bindings, query.bindings);
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-104">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-104">&#182;</a>
</div>
<p>Helper for compiling any aggregate queries.</p>
</div>
<div class="content"><div class='highlight'><pre> _aggregate: <span class="keyword">function</span>(type, columns) {
<span class="keyword">if</span> (!_.isArray(columns)) columns = [columns];
<span class="keyword">this</span>.aggregate = {type: type, columns: columns};
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'select'</span>);
},</pre></div></div>
</li>
<li id="section-105">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-105">&#182;</a>
</div>
<p>Helper for the incrementing/decrementing queries.</p>
</div>
<div class="content"><div class='highlight'><pre> _counter: <span class="keyword">function</span>(column, amount, symbol) {
<span class="keyword">var</span> sql = {};
sql[column] = <span class="keyword">new</span> Raw(<span class="string">''</span> + <span class="keyword">this</span>.grammar.wrap(column) + <span class="string">' '</span> + (symbol || <span class="string">'+'</span>) + <span class="string">' '</span> + amount);
<span class="keyword">return</span> <span class="keyword">this</span>.update(sql);
},</pre></div></div>
</li>
<li id="section-106">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-106">&#182;</a>
</div>
<p>Helper for compiling any <code>union</code> queries.</p>
</div>
<div class="content"><div class='highlight'><pre> _union: <span class="keyword">function</span>(callback, bool) {
<span class="keyword">var</span> query = <span class="keyword">new</span> Builder(<span class="keyword">this</span>);
callback.call(query, query);
<span class="keyword">this</span>.unions.push({query: query, all: bool});
push.apply(<span class="keyword">this</span>.bindings, query.bindings);
}
});</pre></div></div>
</li>
<li id="section-107">
<div class="annotation">
<div class="pilwrap for-h2">
<a class="pilcrow" href="#section-107">&#182;</a>
</div>
<h2>Knex.JoinClause</h2>
</div>
</li>
<li id="section-108">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-108">&#182;</a>
</div>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> JoinClause = Knex.JoinClause = <span class="keyword">function</span>(type, table) {
<span class="keyword">this</span>.clauses = [];
<span class="keyword">this</span>.type = type;
<span class="keyword">this</span>.table = table;
};
JoinClause.prototype = {
on: <span class="keyword">function</span>(first, operator, second) {
<span class="keyword">this</span>.clauses.push({first: first, operator: operator, second: second, bool: <span class="string">'and'</span>});
<span class="keyword">return</span> <span class="keyword">this</span>;
},
andOn: <span class="keyword">function</span>() {
<span class="keyword">this</span>.on.apply(<span class="keyword">this</span>, arguments);
<span class="keyword">return</span> <span class="keyword">this</span>;
},
orOn: <span class="keyword">function</span>(first, operator, second) {
<span class="keyword">this</span>.clauses.push({first: first, operator: operator, second: second, bool: <span class="string">'or'</span>});
<span class="keyword">return</span> <span class="keyword">this</span>;
}
};</pre></div></div>
</li>
<li id="section-109">
<div class="annotation">
<div class="pilwrap for-h2">
<a class="pilcrow" href="#section-109">&#182;</a>
</div>
<h2>Knex.Transaction</h2>
</div>
</li>
<li id="section-110">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-110">&#182;</a>
</div>
</div>
<div class="content"><div class='highlight'><pre> Knex.Transaction = <span class="keyword">function</span>(container) {
<span class="keyword">if</span> (!Knex.Instances[<span class="string">'main'</span>]) {
<span class="keyword">throw</span> <span class="keyword">new</span> Error(<span class="string">'The Knex instance has not been initialized yet.'</span>);
}
<span class="keyword">return</span> transaction.call(Knex.Instances[<span class="string">'main'</span>], container);
};
<span class="keyword">var</span> transaction = <span class="keyword">function</span>(container) {
<span class="keyword">var</span> client = <span class="keyword">this</span>.client;
<span class="keyword">return</span> client.startTransaction().then(<span class="keyword">function</span>(connection) {</pre></div></div>
</li>
<li id="section-111">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-111">&#182;</a>
</div>
<p>Initiate a deferred object, so we know when the
transaction completes or fails, we know what to do.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> dfd = When.defer();</pre></div></div>
</li>
<li id="section-112">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-112">&#182;</a>
</div>
<p>Call the container with the transaction
commit &amp; rollback objects</p>
</div>
<div class="content"><div class='highlight'><pre> container({
commit: <span class="keyword">function</span>() {
client.finishTransaction(<span class="string">'commit'</span>, <span class="keyword">this</span>, dfd);
},
rollback: <span class="keyword">function</span>() {
client.finishTransaction(<span class="string">'rollback'</span>, <span class="keyword">this</span>, dfd);
},</pre></div></div>
</li>
<li id="section-113">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-113">&#182;</a>
</div>
<p>&quot;rollback to&quot;?</p>
</div>
<div class="content"><div class='highlight'><pre> connection: connection
});
<span class="keyword">return</span> dfd.promise;
});
};</pre></div></div>
</li>
<li id="section-114">
<div class="annotation">
<div class="pilwrap for-h2">
<a class="pilcrow" href="#section-114">&#182;</a>
</div>
<h2>Knex.Schema</h2>
</div>
</li>
<li id="section-115">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-115">&#182;</a>
</div>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> initSchema = <span class="keyword">function</span>(Target, client) {</pre></div></div>
</li>
<li id="section-116">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-116">&#182;</a>
</div>
<p>Top level object for Schema related functions</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> Schema = Target.Schema = {};</pre></div></div>
</li>
<li id="section-117">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-117">&#182;</a>
</div>
<p>Attach main static methods, which passthrough to the
SchemaBuilder instance methods</p>
</div>
<div class="content"><div class='highlight'><pre> _.each([<span class="string">'hasTable'</span>, <span class="string">'createTable'</span>, <span class="string">'table'</span>, <span class="string">'dropTable'</span>, <span class="string">'renameTable'</span>, <span class="string">'dropTableIfExists'</span>], <span class="keyword">function</span>(method) {
Schema[method] = <span class="keyword">function</span>() {
<span class="keyword">var</span> args = _.toArray(arguments);
<span class="keyword">var</span> builder = <span class="keyword">new</span> Knex.SchemaBuilder(args[<span class="number">0</span>]);
builder.client = client;
builder.grammar = client.schemaGrammar;
<span class="keyword">return</span> SchemaInterface[method].apply(builder, args.slice(<span class="number">1</span>));
};
});
};</pre></div></div>
</li>
<li id="section-118">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-118">&#182;</a>
</div>
<p>All of the Schame methods that should be called with a
<code>SchemaBuilder</code> context, to disallow calling more than one method at once.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> SchemaInterface = {</pre></div></div>
</li>
<li id="section-119">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-119">&#182;</a>
</div>
<p>Modify a table on the schema.</p>
</div>
<div class="content"><div class='highlight'><pre> table: <span class="keyword">function</span>(callback) {
<span class="keyword">this</span>.callback(callback);
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'table'</span>);
},</pre></div></div>
</li>
<li id="section-120">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-120">&#182;</a>
</div>
<p>Create a new table on the schema.</p>
</div>
<div class="content"><div class='highlight'><pre> createTable: <span class="keyword">function</span>(callback) {
<span class="keyword">this</span>._addCommand(<span class="string">'createTable'</span>);
<span class="keyword">this</span>.callback(callback);
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'createTable'</span>);
},</pre></div></div>
</li>
<li id="section-121">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-121">&#182;</a>
</div>
<p>Drop a table from the schema.</p>
</div>
<div class="content"><div class='highlight'><pre> dropTable: <span class="keyword">function</span>() {
<span class="keyword">this</span>._addCommand(<span class="string">'dropTable'</span>);
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'dropTable'</span>);
},</pre></div></div>
</li>
<li id="section-122">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-122">&#182;</a>
</div>
<p>Drop a table from the schema if it exists.</p>
</div>
<div class="content"><div class='highlight'><pre> dropTableIfExists: <span class="keyword">function</span>() {
<span class="keyword">this</span>._addCommand(<span class="string">'dropTableIfExists'</span>);
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'dropTableIfExists'</span>);
},</pre></div></div>
</li>
<li id="section-123">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-123">&#182;</a>
</div>
<p>Rename a table on the schema.</p>
</div>
<div class="content"><div class='highlight'><pre> renameTable: <span class="keyword">function</span>(to) {
<span class="keyword">this</span>._addCommand(<span class="string">'renameTable'</span>, {to: to});
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'renameTable'</span>);
},</pre></div></div>
</li>
<li id="section-124">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-124">&#182;</a>
</div>
<p>Determine if the given table exists.</p>
</div>
<div class="content"><div class='highlight'><pre> hasTable: <span class="keyword">function</span>() {
<span class="keyword">this</span>.bindings.push(<span class="keyword">this</span>.table);
<span class="keyword">this</span>._addCommand(<span class="string">'tableExists'</span>);
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'tableExists'</span>);
}
};</pre></div></div>
</li>
<li id="section-125">
<div class="annotation">
<div class="pilwrap for-h2">
<a class="pilcrow" href="#section-125">&#182;</a>
</div>
<h2>Knex.SchemaBuilder</h2>
</div>
</li>
<li id="section-126">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-126">&#182;</a>
</div>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> SchemaBuilder = Knex.SchemaBuilder = <span class="keyword">function</span>(table) {
<span class="keyword">this</span>.table = table;
<span class="keyword">this</span>.columns = [];
<span class="keyword">this</span>.commands = [];
<span class="keyword">this</span>.bindings = [];
};
_.extend(SchemaBuilder.prototype, Common, {
_source: <span class="string">'SchemaBuilder'</span>,</pre></div></div>
</li>
<li id="section-127">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-127">&#182;</a>
</div>
<p>A callback from the table building <code>Knex.schemaBuilder</code> calls.</p>
</div>
<div class="content"><div class='highlight'><pre> callback: <span class="keyword">function</span>(callback) {
<span class="keyword">if</span> (callback) callback.call(<span class="keyword">this</span>, <span class="keyword">this</span>);
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-128">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-128">&#182;</a>
</div>
<p>Get the raw sql statements for the blueprint.</p>
</div>
<div class="content"><div class='highlight'><pre> toSql: <span class="keyword">function</span>() {</pre></div></div>
</li>
<li id="section-129">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-129">&#182;</a>
</div>
<p>Add the commands that are implied by the blueprint.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">if</span> (<span class="keyword">this</span>.columns.length &gt; <span class="number">0</span> &amp;&amp; !<span class="keyword">this</span>.creating()) {
<span class="keyword">this</span>.commands.unshift(<span class="keyword">new</span> Chainable({name: <span class="string">'add'</span>}));
}</pre></div></div>
</li>
<li id="section-130">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-130">&#182;</a>
</div>
<p>Add indicies</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = <span class="keyword">this</span>.columns.length; i &lt; l; i++) {
<span class="keyword">var</span> column = <span class="keyword">this</span>.columns[i];
<span class="keyword">var</span> indices = [<span class="string">'primary'</span>, <span class="string">'unique'</span>, <span class="string">'index'</span>];
continueIndex:
<span class="keyword">for</span> (<span class="keyword">var</span> i2 = <span class="number">0</span>, l2 = indices.length; i2 &lt; l2; i2++) {
<span class="keyword">var</span> index = indices[i2];
<span class="keyword">var</span> indexVar = <span class="string">'is'</span> + capitalize(index);</pre></div></div>
</li>
<li id="section-131">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-131">&#182;</a>
</div>
<p>If the index has been specified on the given column, but is simply
equal to &quot;true&quot; (boolean), no name has been specified for this
index, so we will simply call the index methods without one.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">if</span> (column[indexVar] === <span class="literal">true</span>) {
<span class="keyword">this</span>[index](column);
<span class="keyword">continue</span> continueIndex;</pre></div></div>
</li>
<li id="section-132">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-132">&#182;</a>
</div>
<p>If the index has been specified on the column and it is something
other than boolean true, we will assume a name was provided on
the index specification, and pass in the name to the method.</p>
</div>
<div class="content"><div class='highlight'><pre> } <span class="keyword">else</span> <span class="keyword">if</span> (_.has(column, indexVar)) {
<span class="keyword">this</span>[index](column.name, column[indexVar]);
<span class="keyword">continue</span> continueIndex;
}
}
}
<span class="keyword">var</span> statements = [];</pre></div></div>
</li>
<li id="section-133">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-133">&#182;</a>
</div>
<p>Each type of command has a corresponding compiler function on the schema
grammar which is used to build the necessary SQL statements to build
the blueprint element, so we&#39;ll just call that compilers function.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">for</span> (i = <span class="number">0</span>, l = <span class="keyword">this</span>.commands.length; i &lt; l; i++) {
<span class="keyword">var</span> command = <span class="keyword">this</span>.commands[i];
<span class="keyword">var</span> method = <span class="string">'compile'</span> + capitalize(command.name);
<span class="keyword">if</span> (_.has(<span class="keyword">this</span>.grammar, method)) {
<span class="keyword">var</span> sql = <span class="keyword">this</span>.grammar[method](<span class="keyword">this</span>, command);
statements = statements.concat(sql);
}
}
<span class="keyword">return</span> statements;
},</pre></div></div>
</li>
<li id="section-134">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-134">&#182;</a>
</div>
<p>Determine if the blueprint has a create command.</p>
</div>
<div class="content"><div class='highlight'><pre> creating: <span class="keyword">function</span>() {
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = <span class="keyword">this</span>.commands.length; i &lt; l; i++) {
<span class="keyword">if</span> (<span class="keyword">this</span>.commands[i].name == <span class="string">'createTable'</span>) <span class="keyword">return</span> <span class="literal">true</span>;
}
<span class="keyword">return</span> <span class="literal">false</span>;
},</pre></div></div>
</li>
<li id="section-135">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-135">&#182;</a>
</div>
<p>Sets the engine to use when creating the table in MySql</p>
</div>
<div class="content"><div class='highlight'><pre> engine: <span class="keyword">function</span>(name) {
<span class="keyword">if</span> (!<span class="keyword">this</span>.creating()) <span class="keyword">throw</span> <span class="keyword">new</span> Error(<span class="string">'The `engine` modifier may only be used while creating a table.'</span>);
<span class="keyword">this</span>.isEngine = name;
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-136">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-136">&#182;</a>
</div>
<p>Indicate that the given columns should be dropped.</p>
</div>
<div class="content"><div class='highlight'><pre> dropColumn: <span class="keyword">function</span>(columns) {
<span class="keyword">if</span> (!_.isArray(columns)) columns = columns ? [columns] : [];
<span class="keyword">return</span> <span class="keyword">this</span>._addCommand(<span class="string">'dropColumn'</span>, {columns: columns});
},</pre></div></div>
</li>
<li id="section-137">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-137">&#182;</a>
</div>
<p>Indicate that the given columns should be dropped.</p>
</div>
<div class="content"><div class='highlight'><pre> dropColumns: <span class="keyword">function</span>() {
<span class="keyword">return</span> <span class="keyword">this</span>.dropColumn(arguments);
},</pre></div></div>
</li>
<li id="section-138">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-138">&#182;</a>
</div>
<p>Indicate that the given primary key should be dropped.</p>
</div>
<div class="content"><div class='highlight'><pre> dropPrimary: <span class="keyword">function</span>(index) {
<span class="keyword">return</span> <span class="keyword">this</span>._dropIndexCommand(<span class="string">'dropPrimary'</span>, index);
},</pre></div></div>
</li>
<li id="section-139">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-139">&#182;</a>
</div>
<p>Indicate that the given unique key should be dropped.</p>
</div>
<div class="content"><div class='highlight'><pre> dropUnique: <span class="keyword">function</span>(index) {
<span class="keyword">return</span> <span class="keyword">this</span>._dropIndexCommand(<span class="string">'dropUnique'</span>, index);
},</pre></div></div>
</li>
<li id="section-140">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-140">&#182;</a>
</div>
<p>Indicate that the given index should be dropped.</p>
</div>
<div class="content"><div class='highlight'><pre> dropIndex: <span class="keyword">function</span>(index) {
<span class="keyword">return</span> <span class="keyword">this</span>._dropIndexCommand(<span class="string">'dropIndex'</span>, index);
},</pre></div></div>
</li>
<li id="section-141">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-141">&#182;</a>
</div>
<p>Indicate that the given foreign key should be dropped.</p>
</div>
<div class="content"><div class='highlight'><pre> dropForeign: <span class="keyword">function</span>(index) {
<span class="keyword">return</span> <span class="keyword">this</span>._dropIndexCommand(<span class="string">'dropForeign'</span>, index);
},</pre></div></div>
</li>
<li id="section-142">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-142">&#182;</a>
</div>
<p>Specify the primary key(s) for the table.</p>
</div>
<div class="content"><div class='highlight'><pre> primary: <span class="keyword">function</span>(columns, name) {
<span class="keyword">return</span> <span class="keyword">this</span>._indexCommand(<span class="string">'primary'</span>, columns, name);
},</pre></div></div>
</li>
<li id="section-143">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-143">&#182;</a>
</div>
<p>Specify a unique index for the table.</p>
</div>
<div class="content"><div class='highlight'><pre> unique: <span class="keyword">function</span>(columns, name) {
<span class="keyword">return</span> <span class="keyword">this</span>._indexCommand(<span class="string">'unique'</span>, columns, name);
},</pre></div></div>
</li>
<li id="section-144">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-144">&#182;</a>
</div>
<p>Specify an index for the table.</p>
</div>
<div class="content"><div class='highlight'><pre> index: <span class="keyword">function</span>(columns, name) {
<span class="keyword">return</span> <span class="keyword">this</span>._indexCommand(<span class="string">'index'</span>, columns, name);
},</pre></div></div>
</li>
<li id="section-145">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-145">&#182;</a>
</div>
<p>Specify a foreign key for the table.</p>
</div>
<div class="content"><div class='highlight'><pre> foreign: <span class="keyword">function</span>(columns, name) {
<span class="keyword">return</span> <span class="keyword">this</span>._indexCommand(<span class="string">'foreign'</span>, columns, name);
},</pre></div></div>
</li>
<li id="section-146">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-146">&#182;</a>
</div>
<p>Create a new auto-incrementing column on the table.</p>
</div>
<div class="content"><div class='highlight'><pre> increments: <span class="keyword">function</span>(column) {
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'integer'</span>, (column || <span class="string">'id'</span>), {autoIncrement: <span class="literal">true</span>, length: <span class="number">11</span>});
},</pre></div></div>
</li>
<li id="section-147">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-147">&#182;</a>
</div>
<p>Create a new string column on the table.</p>
</div>
<div class="content"><div class='highlight'><pre> string: <span class="keyword">function</span>(column, length) {
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'string'</span>, column, {length: (length || <span class="number">255</span>)});
},</pre></div></div>
</li>
<li id="section-148">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-148">&#182;</a>
</div>
<p>Alias varchar to string</p>
</div>
<div class="content"><div class='highlight'><pre> varchar: <span class="keyword">function</span>(column, length) {
<span class="keyword">return</span> <span class="keyword">this</span>.string(column, length);
},</pre></div></div>
</li>
<li id="section-149">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-149">&#182;</a>
</div>
<p>Create a new text column on the table.</p>
</div>
<div class="content"><div class='highlight'><pre> text: <span class="keyword">function</span>(column, length) {
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'text'</span>, column, {length: (length || <span class="literal">false</span>)});
},</pre></div></div>
</li>
<li id="section-150">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-150">&#182;</a>
</div>
<p>Create a new integer column on the table.</p>
</div>
<div class="content"><div class='highlight'><pre> integer: <span class="keyword">function</span>(column, length) {
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'integer'</span>, column, {length: (length || <span class="number">11</span>)});
},</pre></div></div>
</li>
<li id="section-151">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-151">&#182;</a>
</div>
<p>Create a new tinyinteger column on the table.</p>
</div>
<div class="content"><div class='highlight'><pre> tinyInteger: <span class="keyword">function</span>(column) {
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'tinyInteger'</span>, column);
},</pre></div></div>
</li>
<li id="section-152">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-152">&#182;</a>
</div>
<p>Alias for tinyinteger column.</p>
</div>
<div class="content"><div class='highlight'><pre> tinyint: <span class="keyword">function</span>(column) {
<span class="keyword">return</span> <span class="keyword">this</span>.tinyInteger(column);
},</pre></div></div>
</li>
<li id="section-153">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-153">&#182;</a>
</div>
<p>Create a new float column on the table.</p>
</div>
<div class="content"><div class='highlight'><pre> float: <span class="keyword">function</span>(column, precision, scale) {
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'float'</span>, column, {
precision: (precision == <span class="literal">null</span> ? <span class="number">8</span> : precision),
scale: (scale == <span class="literal">null</span> ? <span class="number">2</span> : scale)
});
},</pre></div></div>
</li>
<li id="section-154">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-154">&#182;</a>
</div>
<p>Create a new decimal column on the table.</p>
</div>
<div class="content"><div class='highlight'><pre> decimal: <span class="keyword">function</span>(column, precision, scale) {
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'decimal'</span>, column, {
precision: (precision == <span class="literal">null</span> ? <span class="number">8</span> : precision),
scale: (scale == <span class="literal">null</span> ? <span class="number">2</span> : scale)
});
},</pre></div></div>
</li>
<li id="section-155">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-155">&#182;</a>
</div>
<p>Alias to &quot;bool&quot;</p>
</div>
<div class="content"><div class='highlight'><pre> boolean: <span class="keyword">function</span>(column) {
<span class="keyword">return</span> <span class="keyword">this</span>.bool(column);
},</pre></div></div>
</li>
<li id="section-156">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-156">&#182;</a>
</div>
<p>Create a new boolean column on the table</p>
</div>
<div class="content"><div class='highlight'><pre> bool: <span class="keyword">function</span>(column) {
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'boolean'</span>, column);
},</pre></div></div>
</li>
<li id="section-157">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-157">&#182;</a>
</div>
<p>Create a new date column on the table.</p>
</div>
<div class="content"><div class='highlight'><pre> date: <span class="keyword">function</span>(column) {
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'date'</span>, column);
},</pre></div></div>
</li>
<li id="section-158">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-158">&#182;</a>
</div>
<p>Create a new date-time column on the table.</p>
</div>
<div class="content"><div class='highlight'><pre> dateTime: <span class="keyword">function</span>(column) {
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'dateTime'</span>, column);
},</pre></div></div>
</li>
<li id="section-159">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-159">&#182;</a>
</div>
<p>Create a new time column on the table.</p>
</div>
<div class="content"><div class='highlight'><pre> time: <span class="keyword">function</span>(column) {
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'time'</span>, column);
},</pre></div></div>
</li>
<li id="section-160">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-160">&#182;</a>
</div>
<p>Create a new timestamp column on the table.</p>
</div>
<div class="content"><div class='highlight'><pre> timestamp: <span class="keyword">function</span>(column) {
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'timestamp'</span>, column);
},</pre></div></div>
</li>
<li id="section-161">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-161">&#182;</a>
</div>
<p>Add creation and update timestamps to the table.</p>
</div>
<div class="content"><div class='highlight'><pre> timestamps: <span class="keyword">function</span>() {
<span class="keyword">this</span>.timestamp(<span class="string">'created_at'</span>);
<span class="keyword">this</span>.timestamp(<span class="string">'updated_at'</span>);
},</pre></div></div>
</li>
<li id="section-162">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-162">&#182;</a>
</div>
<p>Alias to enum.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="string">"enum"</span>: <span class="keyword">function</span>(column, allowed) {
<span class="keyword">return</span> <span class="keyword">this</span>.enu(column, allowed);
},</pre></div></div>
</li>
<li id="section-163">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-163">&#182;</a>
</div>
<p>Create a new enum column on the table.</p>
</div>
<div class="content"><div class='highlight'><pre> enu: <span class="keyword">function</span>(column, allowed) {
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'enum'</span>, column, {allowed: allowed});
},</pre></div></div>
</li>
<li id="section-164">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-164">&#182;</a>
</div>
<p>Create a new bit column on the table.</p>
</div>
<div class="content"><div class='highlight'><pre> bit: <span class="keyword">function</span>(column, length) {
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'bit'</span>, column, {length: (length || <span class="literal">false</span>)});
},</pre></div></div>
</li>
<li id="section-165">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-165">&#182;</a>
</div>
<p>Create a new binary column on the table.</p>
</div>
<div class="content"><div class='highlight'><pre> binary: <span class="keyword">function</span>(column) {
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'binary'</span>, column);
},</pre></div></div>
</li>
<li id="section-166">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-166">&#182;</a>
</div>
<hr>
</div>
</li>
<li id="section-167">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-167">&#182;</a>
</div>
<p>Create a new drop index command on the blueprint.
If the index is an array of columns, the developer means
to drop an index merely by specifying the columns involved.</p>
</div>
<div class="content"><div class='highlight'><pre> _dropIndexCommand: <span class="keyword">function</span>(type, index) {
<span class="keyword">var</span> columns = [];
<span class="keyword">if</span> (_.isArray(index)) {
columns = index;
index = <span class="literal">null</span>;
}
<span class="keyword">return</span> <span class="keyword">this</span>._indexCommand(type, columns, index);
},</pre></div></div>
</li>
<li id="section-168">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-168">&#182;</a>
</div>
<p>Add a new index command to the blueprint.
If no name was specified for this index, we will create one using a basic
convention of the table name, followed by the columns, followed by an
index type, such as primary or index, which makes the index unique.</p>
</div>
<div class="content"><div class='highlight'><pre> _indexCommand: <span class="keyword">function</span>(type, columns, index) {
index || (index = <span class="literal">null</span>);
<span class="keyword">if</span> (!_.isArray(columns)) columns = columns ? [columns] : [];
<span class="keyword">if</span> (index === <span class="literal">null</span>) {
<span class="keyword">var</span> table = <span class="keyword">this</span>.table.replace(<span class="regexp">/\.|-/g</span>, <span class="string">'_'</span>);
index = (table + <span class="string">'_'</span> + _.map(columns, <span class="keyword">function</span>(col) { <span class="keyword">return</span> col.name; }).join(<span class="string">'_'</span>) + <span class="string">'_'</span> + type).toLowerCase();
}
<span class="keyword">return</span> <span class="keyword">this</span>._addCommand(type, {index: index, columns: columns});
},</pre></div></div>
</li>
<li id="section-169">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-169">&#182;</a>
</div>
<p>Add a new column to the blueprint.</p>
</div>
<div class="content"><div class='highlight'><pre> _addColumn: <span class="keyword">function</span>(type, name, parameters) {
<span class="keyword">if</span> (!name) <span class="keyword">throw</span> <span class="keyword">new</span> Error(<span class="string">'A `name` must be defined to add a column'</span>);
<span class="keyword">var</span> attrs = _.extend({type: type, name: name}, parameters);
<span class="keyword">var</span> column = <span class="keyword">new</span> Chainable(attrs);
<span class="keyword">this</span>.columns.push(column);
<span class="keyword">return</span> column;
},</pre></div></div>
</li>
<li id="section-170">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-170">&#182;</a>
</div>
<p>Add a new command to the blueprint.</p>
</div>
<div class="content"><div class='highlight'><pre> _addCommand: <span class="keyword">function</span>(name, parameters) {
<span class="keyword">var</span> command = <span class="keyword">new</span> Chainable(_.extend({name: name}, parameters));
<span class="keyword">this</span>.commands.push(command);
<span class="keyword">return</span> command;
}
});</pre></div></div>
</li>
<li id="section-171">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-171">&#182;</a>
</div>
<p>Chainable object used in creating SchemaBuilder commands.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> Chainable = <span class="keyword">function</span>(obj) {
_.extend(<span class="keyword">this</span>, obj);
};
Chainable.prototype = {</pre></div></div>
</li>
<li id="section-172">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-172">&#182;</a>
</div>
<p>Sets the default value for a column.
For <code>boolean</code> columns, we&#39;ll permit &#39;false&#39;
to be used as default values.</p>
</div>
<div class="content"><div class='highlight'><pre> defaultTo: <span class="keyword">function</span>(value) {
<span class="keyword">if</span> (<span class="keyword">this</span>.type === <span class="string">'boolean'</span>) {
<span class="keyword">if</span> (value === <span class="string">'false'</span>) value = <span class="number">0</span>;
value = (value ? <span class="number">1</span> : <span class="number">0</span>);
}
<span class="keyword">this</span>.defaultValue = value;
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-173">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-173">&#182;</a>
</div>
<p>Sets an integer as unsigned, is a no-op
if the column type is not an integer.</p>
</div>
<div class="content"><div class='highlight'><pre> unsigned: <span class="keyword">function</span>() {
<span class="keyword">this</span>.isUnsigned = <span class="literal">true</span>;
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-174">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-174">&#182;</a>
</div>
<p>Allows the column to contain null values.</p>
</div>
<div class="content"><div class='highlight'><pre> nullable: <span class="keyword">function</span>() {
<span class="keyword">this</span>.isNullable = <span class="literal">true</span>;
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-175">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-175">&#182;</a>
</div>
<p>Adds an index on the specified column.</p>
</div>
<div class="content"><div class='highlight'><pre> index: <span class="keyword">function</span>(name) {
<span class="keyword">this</span>.isIndex = name || <span class="literal">true</span>;
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-176">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-176">&#182;</a>
</div>
<p>Sets this column as the primary key.</p>
</div>
<div class="content"><div class='highlight'><pre> primary: <span class="keyword">function</span>(name) {
<span class="keyword">this</span>.isPrimary = name || <span class="literal">true</span>;
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-177">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-177">&#182;</a>
</div>
<p>Sets this column as unique.</p>
</div>
<div class="content"><div class='highlight'><pre> unique: <span class="keyword">function</span>(name) {
<span class="keyword">this</span>.isUnique = name || <span class="literal">true</span>;
<span class="keyword">return</span> <span class="keyword">this</span>;
},</pre></div></div>
</li>
<li id="section-178">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-178">&#182;</a>
</div>
<p>Sets the column to be inserted after another,
used in MySql alter tables.</p>
</div>
<div class="content"><div class='highlight'><pre> after: <span class="keyword">function</span>(name) {
<span class="keyword">this</span>.isAfter = name;
<span class="keyword">return</span> <span class="keyword">this</span>;
}
};
Knex.SchemaGrammar = {</pre></div></div>
</li>
<li id="section-179">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-179">&#182;</a>
</div>
<p>Compile a foreign key command.</p>
</div>
<div class="content"><div class='highlight'><pre> compileForeign: <span class="keyword">function</span>(blueprint, command) {
<span class="keyword">var</span> table = <span class="keyword">this</span>.wrapTable(blueprint);
<span class="keyword">var</span> on = <span class="keyword">this</span>.wrapTable(command.on);</pre></div></div>
</li>
<li id="section-180">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-180">&#182;</a>
</div>
<p>We need to prepare several of the elements of the foreign key definition
before we can create the SQL, such as wrapping the tables and convert
an array of columns to comma-delimited strings for the SQL queries.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> columns = <span class="keyword">this</span>.columnize(command.columns);
<span class="keyword">var</span> onColumns = <span class="keyword">this</span>.columnize(command.references);
<span class="keyword">var</span> sql = <span class="string">"alter table "</span> + table + <span class="string">" add constraint "</span> + command.index + <span class="string">" "</span>;
sql += <span class="string">"foreign key ("</span> + columns + <span class="string">") references "</span> + on + <span class="string">" ("</span> + onColumns + <span class="string">")"</span>;</pre></div></div>
</li>
<li id="section-181">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-181">&#182;</a>
</div>
<p>Once we have the basic foreign key creation statement constructed we can
build out the syntax for what should happen on an update or delete of
the affected columns, which will get something like &quot;cascade&quot;, etc.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">if</span> (command.onDelete) sql += <span class="string">" on delete "</span> + command.onDelete;
<span class="keyword">if</span> (command.onUpdate) sql += <span class="string">" on update "</span> + command.onUpdate;
<span class="keyword">return</span> sql;
},</pre></div></div>
</li>
<li id="section-182">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-182">&#182;</a>
</div>
<p>Each of the column types have their own compiler functions which are
responsible for turning the column definition into its SQL format
for the platform. Then column modifiers are compiled and added.</p>
</div>
<div class="content"><div class='highlight'><pre> getColumns: <span class="keyword">function</span>(blueprint) {
<span class="keyword">var</span> columns = [];
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = blueprint.columns.length; i &lt; l; i++) {
<span class="keyword">var</span> column = blueprint.columns[i];
<span class="keyword">var</span> sql = <span class="keyword">this</span>.wrap(column) + <span class="string">' '</span> + <span class="keyword">this</span>.getType(column);
columns.push(<span class="keyword">this</span>.addModifiers(sql, blueprint, column));
}
<span class="keyword">return</span> columns;
},</pre></div></div>
</li>
<li id="section-183">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-183">&#182;</a>
</div>
<p>Add the column modifiers to the definition.</p>
</div>
<div class="content"><div class='highlight'><pre> addModifiers: <span class="keyword">function</span>(sql, blueprint, column) {
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = <span class="keyword">this</span>.modifiers.length; i &lt; l; i++) {
<span class="keyword">var</span> modifier = <span class="keyword">this</span>.modifiers[i];
<span class="keyword">var</span> method = <span class="string">"modify"</span> + modifier;
<span class="keyword">if</span> (_.has(<span class="keyword">this</span>, method)) {
sql += <span class="keyword">this</span>[method](blueprint, column) || <span class="string">''</span>;
}
}
<span class="keyword">return</span> sql;
},</pre></div></div>
</li>
<li id="section-184">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-184">&#182;</a>
</div>
<p>Get the SQL for the column data type.</p>
</div>
<div class="content"><div class='highlight'><pre> getType: <span class="keyword">function</span>(column) {
<span class="keyword">return</span> <span class="keyword">this</span>[<span class="string">"type"</span> + capitalize(column.type)](column);
},</pre></div></div>
</li>
<li id="section-185">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-185">&#182;</a>
</div>
<p>Add a prefix to an array of values, utilized in the client libs.</p>
</div>
<div class="content"><div class='highlight'><pre> prefixArray: <span class="keyword">function</span>(prefix, values) {
<span class="keyword">return</span> _.map(values, <span class="keyword">function</span>(value) { <span class="keyword">return</span> prefix + <span class="string">' '</span> + value; });
},</pre></div></div>
</li>
<li id="section-186">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-186">&#182;</a>
</div>
<p>Wrap a table in keyword identifiers.</p>
</div>
<div class="content"><div class='highlight'><pre> wrapTable: <span class="keyword">function</span>(table) {
<span class="keyword">if</span> (table <span class="keyword">instanceof</span> SchemaBuilder) table = table.table;
<span class="keyword">return</span> Knex.Grammar.wrapTable.call(<span class="keyword">this</span>, table);
},</pre></div></div>
</li>
<li id="section-187">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-187">&#182;</a>
</div>
<p>Wrap a value in keyword identifiers.</p>
</div>
<div class="content"><div class='highlight'><pre> wrap: <span class="keyword">function</span>(value) {
<span class="keyword">if</span> (value <span class="keyword">instanceof</span> Chainable) value = value.name;
<span class="keyword">return</span> Knex.Grammar.wrap.call(<span class="keyword">this</span>, value);
},</pre></div></div>
</li>
<li id="section-188">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-188">&#182;</a>
</div>
<p>Format a value so that it can be used in &quot;default&quot; clauses.</p>
</div>
<div class="content"><div class='highlight'><pre> getDefaultValue: <span class="keyword">function</span>(value) {
<span class="keyword">if</span> (value <span class="keyword">instanceof</span> Raw) <span class="keyword">return</span> value.value;
<span class="keyword">if</span> (value === <span class="literal">true</span> || value === <span class="literal">false</span>) {
<span class="keyword">return</span> parseInt(value, <span class="number">10</span>);
}
<span class="keyword">return</span> <span class="string">''</span> + value;
}
};</pre></div></div>
</li>
<li id="section-189">
<div class="annotation">
<div class="pilwrap for-h2">
<a class="pilcrow" href="#section-189">&#182;</a>
</div>
<h2>Knex.Raw</h2>
</div>
</li>
<li id="section-190">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-190">&#182;</a>
</div>
<p>Helpful for injecting a snippet of raw SQL into a
<code>Knex</code> block... in most cases, we&#39;ll check if the value
is an instanceof Raw, and if it is, use the supplied value.</p>
</div>
<div class="content"><div class='highlight'><pre> Knex.Raw = <span class="keyword">function</span>(value) {
<span class="keyword">if</span> (!Knex.Instances[<span class="string">'main'</span>]) {
<span class="keyword">throw</span> <span class="keyword">new</span> Error(<span class="string">'The Knex instance has not been initialized yet.'</span>);
}
<span class="keyword">return</span> Knex.Instances[<span class="string">'main'</span>].Raw(value);
};
<span class="keyword">var</span> Raw = <span class="keyword">function</span>(value) {
<span class="keyword">this</span>.value = value;
};
_.extend(Raw.prototype, Common, {
_source: <span class="string">'Raw'</span>,</pre></div></div>
</li>
<li id="section-191">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-191">&#182;</a>
</div>
<p>Returns the raw sql for the query.</p>
</div>
<div class="content"><div class='highlight'><pre> toSql: <span class="keyword">function</span>() {
<span class="keyword">return</span> <span class="keyword">this</span>.value;
},</pre></div></div>
</li>
<li id="section-192">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-192">&#182;</a>
</div>
<p>Returns the bindings for a raw query.</p>
</div>
<div class="content"><div class='highlight'><pre> _cleanBindings: <span class="keyword">function</span>() {
<span class="keyword">return</span> [];
}
});</pre></div></div>
</li>
<li id="section-193">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-193">&#182;</a>
</div>
<p>Simple capitalization of a word.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> capitalize = <span class="keyword">function</span>(word) {
<span class="keyword">return</span> word.charAt(<span class="number">0</span>).toUpperCase() + word.slice(<span class="number">1</span>);
};</pre></div></div>
</li>
<li id="section-194">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-194">&#182;</a>
</div>
<p>Sorts an object based on the names.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> sortObject = <span class="keyword">function</span>(obj) {
<span class="keyword">return</span> _.sortBy(_.pairs(obj), <span class="keyword">function</span>(a) {
<span class="keyword">return</span> a[<span class="number">0</span>];
});
};</pre></div></div>
</li>
<li id="section-195">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-195">&#182;</a>
</div>
<p>Sets up a multi-query to be executed with serial promises.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> multiQuery = <span class="keyword">function</span>(builder, i, chain) {
<span class="keyword">if</span> (chain) {
<span class="keyword">return</span> <span class="keyword">function</span>() {
<span class="keyword">return</span> multiQuery(builder, i);
};
}
<span class="keyword">return</span> builder.client.query(_.extend({}, builder, {sql: builder.sql[i]}));
};</pre></div></div>
</li>
<li id="section-196">
<div class="annotation">
<div class="pilwrap for-h2">
<a class="pilcrow" href="#section-196">&#182;</a>
</div>
<h2>Knex.Initialize</h2>
</div>
</li>
<li id="section-197">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-197">&#182;</a>
</div>
<p>Takes a hash of options to initialize the database
connection. The <code>client</code> is required to choose which client
path above is loaded, or to specify a custom path to a client.
Other options, such as <code>connection</code> or <code>pool</code> are passed
into <code>client.initialize</code>.</p>
</div>
<div class="content"><div class='highlight'><pre> Knex.Initialize = <span class="keyword">function</span>(name, options) {
<span class="keyword">var</span> Target, ClientCtor, client;</pre></div></div>
</li>
<li id="section-198">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-198">&#182;</a>
</div>
<p>A name for the connection isn&#39;t required in
cases where there is only a single connection.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">if</span> (_.isObject(name)) {
options = name;
name = <span class="string">'main'</span>;
}</pre></div></div>
</li>
<li id="section-199">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-199">&#182;</a>
</div>
<p>Don&#39;t try to initialize the same <code>name</code> twice... If necessary,
delete the instance from <code>Knex.Instances</code>.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">if</span> (Knex.Instances[name]) {
<span class="keyword">throw</span> <span class="keyword">new</span> Error(<span class="string">'An instance named '</span> + name + <span class="string">' already exists'</span>);
}
client = options.client;
<span class="keyword">if</span> (!client) <span class="keyword">throw</span> <span class="keyword">new</span> Error(<span class="string">'The client is required to use Knex.'</span>);</pre></div></div>
</li>
<li id="section-200">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-200">&#182;</a>
</div>
<p>Checks if this is a default client. If it&#39;s not,
that means it&#39;s a custom lib, set the object to the client.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">if</span> (_.isString(client)) {
client = client.toLowerCase();
ClientCtor = require(Clients[client]);
} <span class="keyword">else</span> {
ClientCtor = client;
}</pre></div></div>
</li>
<li id="section-201">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-201">&#182;</a>
</div>
<p>Creates a new instance of the db client, passing the name and options.</p>
</div>
<div class="content"><div class='highlight'><pre> client = <span class="keyword">new</span> ClientCtor(name, _.omit(options, <span class="string">'client'</span>));</pre></div></div>
</li>
<li id="section-202">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-202">&#182;</a>
</div>
<p>Setup the grammars specific to the client.</p>
</div>
<div class="content"><div class='highlight'><pre> client.grammar = _.extend({}, Knex.Grammar, client.grammar);
client.schemaGrammar = _.extend({}, client.grammar, Knex.SchemaGrammar, client.schemaGrammar);</pre></div></div>
</li>
<li id="section-203">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-203">&#182;</a>
</div>
<p>If this is named &quot;default&quot; then we&#39;re setting this on the Knex</p>
</div>
<div class="content"><div class='highlight'><pre> Target = <span class="keyword">function</span>(table) {
<span class="keyword">var</span> builder = <span class="keyword">new</span> Knex.Builder(table);
builder.client = client;
builder.grammar = client.grammar;
<span class="keyword">return</span> builder;
};</pre></div></div>
</li>
<li id="section-204">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-204">&#182;</a>
</div>
<p>Inherit static properties, without any that don&#39;t apply except
on the &quot;root&quot; <code>Knex</code>.</p>
</div>
<div class="content"><div class='highlight'><pre> _.extend(Target, _.omit(Knex, <span class="string">'Initialize'</span>, <span class="string">'Instances'</span>, <span class="string">'VERSION'</span>));</pre></div></div>
</li>
<li id="section-205">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-205">&#182;</a>
</div>
<p>Initialize the schema builder methods.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">if</span> (name === <span class="string">'main'</span>) {
initSchema(Knex, client);
}
initSchema(Target, client);</pre></div></div>
</li>
<li id="section-206">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-206">&#182;</a>
</div>
<p>Specifically set the client on the current target.</p>
</div>
<div class="content"><div class='highlight'><pre> Target.client = client;
Target.instanceName = name;</pre></div></div>
</li>
<li id="section-207">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-207">&#182;</a>
</div>
<p>Setup the transacting function properly for this connection.</p>
</div>
<div class="content"><div class='highlight'><pre> Target.Transaction = <span class="keyword">function</span>(handler) {
<span class="keyword">return</span> transaction.call(<span class="keyword">this</span>, handler);
};</pre></div></div>
</li>
<li id="section-208">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-208">&#182;</a>
</div>
<p>Executes a Raw query.</p>
</div>
<div class="content"><div class='highlight'><pre> Target.Raw = <span class="keyword">function</span>(value) {
<span class="keyword">var</span> raw = <span class="keyword">new</span> Raw(value);
raw.client = client;
<span class="keyword">return</span> raw;
};</pre></div></div>
</li>
<li id="section-209">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-209">&#182;</a>
</div>
<p>Add this instance to the global <code>Knex</code> instances, and return.</p>
</div>
<div class="content"><div class='highlight'><pre> Knex.Instances[name] = Target;
<span class="keyword">return</span> Target;
};</pre></div></div>
</li>
<li id="section-210">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-210">&#182;</a>
</div>
<p>Default client paths, located in the <code>./clients</code> directory.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> Clients = {
<span class="string">'mysql'</span> : <span class="string">'./clients/mysql.js'</span>,
<span class="string">'pg'</span> : <span class="string">'./clients/postgres.js'</span>,
<span class="string">'postgres'</span> : <span class="string">'./clients/postgres.js'</span>,
<span class="string">'sqlite'</span> : <span class="string">'./clients/sqlite3.js'</span>,
<span class="string">'sqlite3'</span> : <span class="string">'./clients/sqlite3.js'</span>
};</pre></div></div>
</li>
<li id="section-211">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-211">&#182;</a>
</div>
<p>Named instances of Knex, presumably with different database
connections, the main instance being named &quot;main&quot;...</p>
</div>
<div class="content"><div class='highlight'><pre> Knex.Instances = {};</pre></div></div>
</li>
<li id="section-212">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-212">&#182;</a>
</div>
<p>Export the Knex module</p>
</div>
<div class="content"><div class='highlight'><pre> module.exports = Knex;
}).call(<span class="keyword">this</span>);</pre></div></div>
</li>
</ul>
</div>
</body>
</html>