mirror of
https://github.com/knex/knex.git
synced 2025-08-02 22:02:05 +00:00
162 lines
37 KiB
HTML
162 lines
37 KiB
HTML
![]() |
<!DOCTYPE html><html lang="en"><head><title>lib/migrate</title></head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0"><meta name="groc-relative-root" content="../"><meta name="groc-document-path" content="lib/migrate"><meta name="groc-project-path" content="lib/migrate.js"><link rel="stylesheet" type="text/css" media="all" href="../assets/style.css"><script type="text/javascript" src="../assets/behavior.js"></script><body><div id="meta"><div class="file-path">lib/migrate.js</div></div><div id="document"><div class="segment"><div class="code"><div class="wrapper"><span class="kd">var</span> <span class="nx">fs</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'fs'</span><span class="p">);</span>
|
||
|
<span class="kd">var</span> <span class="nx">path</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'path'</span><span class="p">);</span>
|
||
|
|
||
|
<span class="kd">var</span> <span class="nx">_</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'underscore'</span><span class="p">);</span>
|
||
|
<span class="kd">var</span> <span class="nx">_str</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'underscore.string'</span><span class="p">);</span>
|
||
|
<span class="kd">var</span> <span class="nx">mkdirp</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'mkdirp'</span><span class="p">);</span>
|
||
|
<span class="kd">var</span> <span class="nx">when</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'when'</span><span class="p">);</span>
|
||
|
<span class="kd">var</span> <span class="nx">nodefn</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'when/node/function'</span><span class="p">);</span>
|
||
|
<span class="kd">var</span> <span class="nx">sequence</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'when/sequence'</span><span class="p">);</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>The new migration we're performing.
|
||
|
Takes a <code>config</code> object, which has the name
|
||
|
of the current migration (<code>main</code> if not otherwise specified)</p></div></div><div class="code"><div class="wrapper"><span class="kd">var</span> <span class="nx">Migrate</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">instance</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="k">this</span><span class="p">.</span><span class="nx">knex</span> <span class="o">=</span> <span class="nx">instance</span><span class="p">;</span>
|
||
|
<span class="nx">_</span><span class="p">.</span><span class="nx">bindAll</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="s1">'currentVersion'</span><span class="p">,</span> <span class="s1">'createMigrationTable'</span><span class="p">,</span> <span class="s1">'_migrationData'</span><span class="p">);</span>
|
||
|
<span class="p">};</span>
|
||
|
|
||
|
<span class="nx">Migrate</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="p">{</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Initializes the migration, by creating the proper migration
|
||
|
file or database table, depending on the migration config settings.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="nx">config</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">defaults</span><span class="p">(</span><span class="nx">config</span> <span class="o">||</span> <span class="p">{},</span> <span class="p">{</span>
|
||
|
<span class="nx">extension</span><span class="o">:</span> <span class="s1">'js'</span><span class="p">,</span>
|
||
|
<span class="nx">tableName</span><span class="o">:</span> <span class="s1">'knex_migrations'</span><span class="p">,</span>
|
||
|
<span class="nx">namespace</span><span class="o">:</span> <span class="s1">'main'</span><span class="p">,</span>
|
||
|
<span class="nx">directory</span><span class="o">:</span> <span class="nx">process</span><span class="p">.</span><span class="nx">cwd</span><span class="p">()</span> <span class="o">+</span> <span class="s1">'/migrations'</span>
|
||
|
<span class="p">});</span>
|
||
|
|
||
|
<span class="kd">var</span> <span class="nx">Knex</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">Knex</span><span class="p">;</span>
|
||
|
<span class="kd">var</span> <span class="nx">directory</span> <span class="o">=</span> <span class="nx">config</span><span class="p">.</span><span class="nx">directory</span><span class="p">;</span>
|
||
|
<span class="kd">var</span> <span class="nx">tableName</span> <span class="o">=</span> <span class="nx">config</span><span class="p">.</span><span class="nx">tableName</span><span class="p">;</span>
|
||
|
|
||
|
<span class="k">return</span> <span class="nx">nodefn</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">fs</span><span class="p">.</span><span class="nx">stat</span><span class="p">,</span> <span class="nx">directory</span><span class="p">).</span><span class="nx">then</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
||
|
<span class="k">return</span> <span class="nx">nodefn</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">mkdirp</span><span class="p">,</span> <span class="nx">directory</span><span class="p">);</span>
|
||
|
<span class="p">})</span>
|
||
|
<span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
||
|
<span class="k">return</span> <span class="nx">Knex</span><span class="p">.</span><span class="nx">Schema</span><span class="p">.</span><span class="nx">hasTable</span><span class="p">(</span><span class="nx">tableName</span><span class="p">);</span>
|
||
|
<span class="p">})</span>
|
||
|
<span class="p">.</span><span class="nx">tap</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">exists</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="k">if</span> <span class="p">(</span><span class="nx">exists</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">createMigrationTable</span><span class="p">(</span><span class="nx">tableName</span><span class="p">);</span>
|
||
|
<span class="p">})</span>
|
||
|
<span class="p">.</span><span class="nx">yield</span><span class="p">(</span><span class="nx">config</span><span class="p">);</span>
|
||
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Create the migration table, if it doesn't already exist.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">createMigrationTable</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">tableName</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="k">return</span> <span class="nx">Knex</span><span class="p">.</span><span class="nx">Schema</span><span class="p">.</span><span class="nx">createTable</span><span class="p">(</span><span class="nx">tableName</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="nx">t</span><span class="p">.</span><span class="nx">increments</span><span class="p">();</span>
|
||
|
<span class="nx">t</span><span class="p">.</span><span class="nx">string</span><span class="p">(</span><span class="s1">'name'</span><span class="p">);</span>
|
||
|
<span class="nx">t</span><span class="p">.</span><span class="nx">integer</span><span class="p">(</span><span class="s1">'batch'</span><span class="p">);</span>
|
||
|
<span class="nx">t</span><span class="p">.</span><span class="nx">dateTime</span><span class="p">(</span><span class="s1">'migration_time'</span><span class="p">);</span>
|
||
|
<span class="p">});</span>
|
||
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Runs a specific migration, based on the migration version number.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">run</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">version</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="nx">version</span> <span class="o">=</span> <span class="nx">parseVersion</span><span class="p">(</span><span class="nx">version</span><span class="p">);</span>
|
||
|
<span class="kd">var</span> <span class="nx">migration</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
|
||
|
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">initialize</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span>
|
||
|
<span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_migrationData</span><span class="p">(</span><span class="nx">config</span><span class="p">))</span>
|
||
|
<span class="p">.</span><span class="nx">spread</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">all</span><span class="p">,</span> <span class="nx">completed</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">hasRun</span><span class="p">(</span><span class="nx">completed</span><span class="p">,</span> <span class="nx">version</span><span class="p">))</span> <span class="p">{</span>
|
||
|
<span class="k">return</span> <span class="nx">migration</span><span class="p">.</span><span class="nx">runBatch</span><span class="p">([</span><span class="nx">getMigration</span><span class="p">(</span><span class="nx">all</span><span class="p">,</span> <span class="nx">version</span><span class="p">,</span> <span class="nx">config</span><span class="p">)]);</span>
|
||
|
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
||
|
<span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s1">'Migration '</span> <span class="o">+</span> <span class="nx">version</span> <span class="o">+</span> <span class="s1">' already exists'</span><span class="p">);</span>
|
||
|
<span class="p">}</span>
|
||
|
<span class="p">})</span>
|
||
|
<span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
||
|
<span class="k">return</span> <span class="s1">'Migration '</span> <span class="o">+</span> <span class="nx">version</span> <span class="o">+</span> <span class="s1">' successfully run'</span><span class="p">;</span>
|
||
|
<span class="p">});</span>
|
||
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Migrate "up" to a specific migration id
|
||
|
otherwise, migrates all migrations which have
|
||
|
not been run yet.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">up</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">version</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">_direction</span><span class="p">(</span><span class="s1">'up'</span><span class="p">,</span> <span class="nx">version</span><span class="p">,</span> <span class="nx">config</span><span class="p">);</span>
|
||
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Migrate "down" to a specific migration id,
|
||
|
otherwise rolls back the last migration "batch".</p></div></div><div class="code"><div class="wrapper"> <span class="nx">down</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">version</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">_direction</span><span class="p">(</span><span class="s1">'down'</span><span class="p">,</span> <span class="nx">version</span><span class="p">,</span> <span class="nx">config</span><span class="p">);</span>
|
||
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Run a batch of current migrations, in sequence.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">runBatch</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">migrations</span><span class="p">,</span> <span class="nx">direction</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="nx">migrations</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">migrations</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">item</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="kd">var</span> <span class="nx">migration</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="nx">item</span><span class="p">);</span>
|
||
|
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">_</span><span class="p">.</span><span class="nx">isFunction</span><span class="p">(</span><span class="nx">migration</span><span class="p">.</span><span class="nx">up</span><span class="p">)</span> <span class="o">||</span> <span class="o">!</span><span class="nx">_</span><span class="p">.</span><span class="nx">isFunction</span><span class="p">(</span><span class="nx">migration</span><span class="p">.</span><span class="nx">down</span><span class="p">))</span> <span class="p">{</span>
|
||
|
<span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s1">'Invalid migration: '</span> <span class="o">+</span> <span class="nx">item</span> <span class="o">+</span> <span class="s1">' must have both an up and down function'</span><span class="p">);</span>
|
||
|
<span class="p">}</span>
|
||
|
<span class="k">return</span> <span class="nx">migration</span><span class="p">[</span><span class="nx">direction</span><span class="p">];</span>
|
||
|
<span class="p">});</span>
|
||
|
<span class="k">return</span> <span class="nx">sequence</span><span class="p">(</span><span class="nx">migrations</span><span class="p">);</span>
|
||
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Retrieves and returns the current migration version
|
||
|
we're on, as a promise. If there aren't any migrations run yet,
|
||
|
return "none" as the value for the <code>currentVersion</code>.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">currentVersion</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">listCompleted</span><span class="p">(</span><span class="nx">config</span><span class="p">).</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">completed</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="kd">var</span> <span class="nx">val</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">chain</span><span class="p">(</span><span class="nx">completed</span><span class="p">).</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="k">return</span> <span class="nx">value</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s1">'_'</span><span class="p">)[</span><span class="mi">0</span><span class="p">];</span>
|
||
|
<span class="p">}).</span><span class="nx">max</span><span class="p">().</span><span class="nx">value</span><span class="p">();</span>
|
||
|
<span class="k">return</span> <span class="p">(</span><span class="nx">val</span> <span class="o">===</span> <span class="o">-</span><span class="kc">Infinity</span> <span class="o">?</span> <span class="s1">'none'</span> <span class="o">:</span> <span class="nx">val</span><span class="p">);</span>
|
||
|
<span class="p">});</span>
|
||
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Creates a new migration, with a given name.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">create</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">initialize</span><span class="p">(</span><span class="nx">config</span><span class="p">).</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="k">return</span> <span class="nx">when</span><span class="p">.</span><span class="nx">all</span><span class="p">([</span><span class="nx">nodefn</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">fs</span><span class="p">.</span><span class="nx">readFile</span><span class="p">,</span> <span class="nx">config</span><span class="p">.</span><span class="nx">stub</span> <span class="o">||</span> <span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">__dirname</span><span class="p">,</span> <span class="s1">'stub'</span><span class="p">,</span> <span class="nx">config</span><span class="p">.</span><span class="nx">extension</span> <span class="o">+</span> <span class="s1">'.stub'</span><span class="p">)),</span> <span class="nx">config</span><span class="p">]);</span>
|
||
|
<span class="p">}).</span><span class="nx">spread</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">stub</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="nx">name</span> <span class="o">=</span> <span class="nx">_str</span><span class="p">.</span><span class="nx">dasherize</span><span class="p">(</span><span class="nx">name</span><span class="p">);</span>
|
||
|
<span class="k">if</span> <span class="p">(</span><span class="nx">name</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">===</span> <span class="s1">'-'</span><span class="p">)</span> <span class="nx">name</span> <span class="o">=</span> <span class="nx">name</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
|
||
|
<span class="kd">var</span> <span class="nx">filename</span> <span class="o">=</span> <span class="nx">yyyymmddhhmmss</span><span class="p">()</span> <span class="o">+</span> <span class="s1">'_'</span> <span class="o">+</span> <span class="nx">name</span> <span class="o">+</span> <span class="s1">'.'</span> <span class="o">+</span> <span class="nx">config</span><span class="p">.</span><span class="nx">extension</span><span class="p">;</span>
|
||
|
<span class="k">return</span> <span class="nx">nodefn</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">fs</span><span class="p">.</span><span class="nx">writeFile</span><span class="p">,</span> <span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">config</span><span class="p">.</span><span class="nx">directory</span><span class="p">,</span> <span class="nx">filename</span><span class="p">),</span> <span class="nx">stub</span><span class="p">).</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
||
|
<span class="k">return</span> <span class="nx">filename</span><span class="p">;</span>
|
||
|
<span class="p">});</span>
|
||
|
<span class="p">});</span>
|
||
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Lists all available migration versions, as an array.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">listAll</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">initialize</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span>
|
||
|
<span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="k">return</span> <span class="nx">nodefn</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">fs</span><span class="p">.</span><span class="nx">readdir</span><span class="p">,</span> <span class="nx">config</span><span class="p">.</span><span class="nx">directory</span><span class="p">);</span>
|
||
|
<span class="p">})</span>
|
||
|
<span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">files</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">reduce</span><span class="p">(</span><span class="nx">files</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">memo</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="nx">memo</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">value</span><span class="p">);</span>
|
||
|
<span class="k">return</span> <span class="nx">memo</span><span class="p">;</span>
|
||
|
<span class="p">},</span> <span class="p">[]);</span>
|
||
|
<span class="p">});</span>
|
||
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Lists all migrations that have been completed for the current db, as an array.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">listCompleted</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="kd">var</span> <span class="nx">Knex</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">Knex</span><span class="p">;</span>
|
||
|
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">initialize</span><span class="p">(</span><span class="nx">config</span><span class="p">).</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="k">return</span> <span class="nx">Knex</span><span class="p">(</span><span class="nx">config</span><span class="p">.</span><span class="nx">tableName</span><span class="p">).</span><span class="nx">orderBy</span><span class="p">(</span><span class="s1">'id'</span><span class="p">).</span><span class="nx">select</span><span class="p">(</span><span class="s1">'name'</span><span class="p">);</span>
|
||
|
<span class="p">}).</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">values</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="k">return</span> <span class="nx">values</span><span class="p">;</span>
|
||
|
<span class="p">});</span>
|
||
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Gets the migration list, and the list of completed migrations
|
||
|
to check what should be run.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">_migrationData</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="kd">var</span> <span class="nx">migration</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
|
||
|
<span class="k">return</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
||
|
<span class="k">return</span> <span class="nx">when</span><span class="p">.</span><span class="nx">all</span><span class="p">([</span><span class="nx">migration</span><span class="p">.</span><span class="nx">listAll</span><span class="p">(),</span> <span class="nx">migration</span><span class="p">.</span><span class="nx">listCompleted</span><span class="p">()]);</span>
|
||
|
<span class="p">};</span>
|
||
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Shared between the <code>up</code> and <code>down</code> migrations, this
|
||
|
helps to create the batch of migrations that need to be run.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">_direction</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">direction</span><span class="p">,</span> <span class="nx">version</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="nx">version</span> <span class="o">=</span> <span class="nx">parseVersion</span><span class="p">(</span><span class="nx">version</span> <span class="o">||</span> <span class="s1">'latest'</span><span class="p">);</span>
|
||
|
<span class="kd">var</span> <span class="nx">migration</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
|
||
|
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">initialize</span><span class="p">(</span><span class="nx">config</span><span class="p">).</span><span class="nx">then</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_migrationData</span><span class="p">(</span><span class="nx">config</span><span class="p">)).</span><span class="nx">spread</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">all</span><span class="p">,</span> <span class="nx">completed</span><span class="p">,</span> <span class="nx">version</span><span class="p">)</span> <span class="p">{</span>
|
||
|
|
||
|
<span class="p">});</span>
|
||
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Gets the current migration.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">getMigration</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">all</span><span class="p">,</span> <span class="nx">version</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="kd">var</span> <span class="nx">found</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">all</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">item</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="nx">item</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">version</span><span class="p">)</span> <span class="o">===</span> <span class="mi">0</span><span class="p">;</span>
|
||
|
<span class="p">});</span>
|
||
|
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">found</span><span class="p">)</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s1">'Unable to locate the specified migration '</span> <span class="o">+</span> <span class="nx">version</span><span class="p">);</span>
|
||
|
<span class="k">return</span> <span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">config</span><span class="p">.</span><span class="nx">directory</span><span class="p">,</span> <span class="nx">found</span><span class="p">);</span>
|
||
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Get all of the migrations that need to be run in the current batch.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">getMigrations</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">all</span><span class="p">,</span> <span class="nx">version</span><span class="p">,</span> <span class="nx">direction</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">reduce</span><span class="p">(</span><span class="nx">all</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
||
|
|
||
|
<span class="p">});</span>
|
||
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Check if the current version of the query has run.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">hasRun</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">versions</span><span class="p">,</span> <span class="nx">check</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">some</span><span class="p">(</span><span class="nx">versions</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">version</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="k">return</span> <span class="p">(</span><span class="nx">version</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">check</span><span class="p">)</span> <span class="o">===</span> <span class="mi">0</span><span class="p">);</span>
|
||
|
<span class="p">});</span>
|
||
|
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Parse the version, which really only needs to be the
|
||
|
timestamp of the migration we wish to migrate to.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">parseVersion</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">version</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="k">if</span> <span class="p">(</span><span class="nx">version</span> <span class="o">!==</span> <span class="s1">'latest'</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="nx">version</span> <span class="o">=</span> <span class="nx">version</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">14</span><span class="p">);</span>
|
||
|
<span class="k">if</span> <span class="p">(</span><span class="nx">version</span><span class="p">.</span><span class="nx">length</span> <span class="o">!==</span> <span class="mi">14</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s1">'Invalid version number provided'</span><span class="p">);</span>
|
||
|
<span class="p">}</span>
|
||
|
<span class="p">}</span>
|
||
|
<span class="k">return</span> <span class="nx">version</span><span class="p">;</span>
|
||
|
<span class="p">}</span>
|
||
|
|
||
|
<span class="p">};</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Get a date object in this form</p></div></div><div class="code"><div class="wrapper"><span class="kd">var</span> <span class="nx">yyyymmddhhmmss</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
||
|
<span class="kd">var</span> <span class="nx">d</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">();</span>
|
||
|
<span class="k">return</span> <span class="nx">d</span><span class="p">.</span><span class="nx">getFullYear</span><span class="p">().</span><span class="nx">toString</span><span class="p">()</span> <span class="o">+</span> <span class="nx">padDate</span><span class="p">(</span><span class="nx">d</span><span class="p">.</span><span class="nx">getMonth</span><span class="p">()</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="nx">padDate</span><span class="p">(</span><span class="nx">d</span><span class="p">.</span><span class="nx">getDate</span><span class="p">())</span> <span class="o">+</span> <span class="nx">padDate</span><span class="p">(</span><span class="nx">d</span><span class="p">.</span><span class="nx">getHours</span><span class="p">())</span> <span class="o">+</span> <span class="nx">padDate</span><span class="p">(</span><span class="nx">d</span><span class="p">.</span><span class="nx">getMinutes</span><span class="p">())</span> <span class="o">+</span> <span class="nx">padDate</span><span class="p">(</span><span class="nx">d</span><span class="p">.</span><span class="nx">getSeconds</span><span class="p">());</span>
|
||
|
<span class="p">};</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Ensure that we have 2 places for each of the date segments</p></div></div><div class="code"><div class="wrapper"><span class="kd">var</span> <span class="nx">padDate</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">segment</span><span class="p">)</span> <span class="p">{</span>
|
||
|
<span class="nx">segment</span> <span class="o">=</span> <span class="nx">segment</span><span class="p">.</span><span class="nx">toString</span><span class="p">();</span>
|
||
|
<span class="k">return</span> <span class="nx">segment</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">?</span> <span class="nx">segment</span> <span class="o">:</span> <span class="s1">'0'</span> <span class="o">+</span> <span class="nx">segment</span><span class="p">;</span>
|
||
|
<span class="p">};</span>
|
||
|
|
||
|
|
||
|
<span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">Migrate</span><span class="p">;</span></div></div></div></div></body></html>
|