Skip to content

Commit

Permalink
Merge pull request #6495 from ErisDS/db-config
Browse files Browse the repository at this point in the history
Move db connection out of config
  • Loading branch information
sebgie committed Feb 13, 2016
2 parents d593425 + 1c85650 commit 21c272b
Show file tree
Hide file tree
Showing 15 changed files with 134 additions and 155 deletions.
34 changes: 3 additions & 31 deletions core/server/config/index.js
Expand Up @@ -7,7 +7,7 @@ var path = require('path'),
fs = require('fs'),
url = require('url'),
_ = require('lodash'),
knex = require('knex'),

validator = require('validator'),
readDirectory = require('../utils/read-directory'),
readThemes = require('../utils/read-themes'),
Expand All @@ -18,8 +18,7 @@ var path = require('path'),
appRoot = path.resolve(__dirname, '../../../'),
corePath = path.resolve(appRoot, 'core/'),
testingEnvs = ['testing', 'testing-mysql', 'testing-pg'],
defaultConfig = {},
knexInstance;
defaultConfig = {};

function ConfigManager(config) {
/**
Expand Down Expand Up @@ -86,25 +85,6 @@ ConfigManager.prototype.init = function (rawConfig) {
});
};

function configureDriver(client) {
var pg;

if (client === 'pg' || client === 'postgres' || client === 'postgresql') {
try {
pg = require('pg');
} catch (e) {
pg = require('pg.js');
}

// By default PostgreSQL returns data as strings along with an OID that identifies
// its type. We're setting the parser to convert OID 20 (int8) into a javascript
// integer.
pg.types.setTypeParser(20, function (val) {
return val === null ? null : parseInt(val, 10);
});
}
}

/**
* Allows you to set the config object.
* @param {Object} config Only accepts an object at the moment.
Expand Down Expand Up @@ -156,12 +136,7 @@ ConfigManager.prototype.set = function (config) {
assetHash = this._config.assetHash ||
(crypto.createHash('md5').update(packageInfo.version + Date.now()).digest('hex')).substring(0, 10);

if (!knexInstance && this._config.database && this._config.database.client) {
configureDriver(this._config.database.client);
knexInstance = knex(this._config.database);
}

// Protect against accessing a non-existant object.
// Protect against accessing a non-existent object.
// This ensures there's always at least a storage object
// because it's referenced in multiple places.
this._config.storage = this._config.storage || {};
Expand All @@ -174,9 +149,6 @@ ConfigManager.prototype.set = function (config) {
}

_.merge(this._config, {
database: {
knex: knexInstance
},
ghostVersion: packageInfo.version,
paths: {
appRoot: appRoot,
Expand Down
30 changes: 30 additions & 0 deletions core/server/data/db/connection.js
@@ -0,0 +1,30 @@
var knex = require('knex'),
config = require('../../config'),
dbConfig = config.database,
knexInstance;

function configureDriver(client) {
var pg;

if (client === 'pg' || client === 'postgres' || client === 'postgresql') {
try {
pg = require('pg');
} catch (e) {
pg = require('pg.js');
}

// By default PostgreSQL returns data as strings along with an OID that identifies
// its type. We're setting the parser to convert OID 20 (int8) into a javascript
// integer.
pg.types.setTypeParser(20, function (val) {
return val === null ? null : parseInt(val, 10);
});
}
}

if (!knexInstance && dbConfig && dbConfig.client) {
configureDriver(dbConfig.client);
knexInstance = knex(dbConfig);
}

module.exports = knexInstance;
10 changes: 10 additions & 0 deletions core/server/data/db/index.js
@@ -0,0 +1,10 @@
var connection;

Object.defineProperty(exports, 'knex', {
enumerable: true,
configurable: false,
get: function get() {
connection = connection || require('./connection');
return connection;
}
});
4 changes: 2 additions & 2 deletions core/server/data/export/index.js
@@ -1,6 +1,6 @@
var _ = require('lodash'),
Promise = require('bluebird'),
config = require('../../config'),
db = require('../../data/db'),
commands = require('../schema').commands,
versioning = require('../schema').versioning,
serverUtils = require('../../utils'),
Expand Down Expand Up @@ -33,7 +33,7 @@ exporter = function () {
tables = results[1],
selectOps = _.map(tables, function (name) {
if (excludedTables.indexOf(name) < 0) {
return config.database.knex(name).select();
return db.knex(name).select();
}
});

Expand Down
10 changes: 5 additions & 5 deletions core/server/data/schema/clients/mysql.js
@@ -1,5 +1,5 @@
var _ = require('lodash'),
config = require('../../../config/index'),
var _ = require('lodash'),
db = require('../../../data/db'),

// private
doRawAndFlatten,
Expand All @@ -11,7 +11,7 @@ var _ = require('lodash'),
checkPostTable;

doRawAndFlatten = function doRaw(query, flattenFn) {
return config.database.knex.raw(query).then(function (response) {
return db.knex.raw(query).then(function (response) {
return _.flatten(flattenFn(response));
});
};
Expand Down Expand Up @@ -39,10 +39,10 @@ getColumns = function getColumns(table) {
// data type text instead of mediumtext.
// For details see: https://github.com/TryGhost/Ghost/issues/1947
checkPostTable = function checkPostTable() {
return config.database.knex.raw('SHOW FIELDS FROM posts where Field ="html" OR Field = "markdown"').then(function (response) {
return db.knex.raw('SHOW FIELDS FROM posts where Field ="html" OR Field = "markdown"').then(function (response) {
return _.flatten(_.map(response[0], function (entry) {
if (entry.Type.toLowerCase() !== 'mediumtext') {
return config.database.knex.raw('ALTER TABLE posts MODIFY ' + entry.Field + ' MEDIUMTEXT');
return db.knex.raw('ALTER TABLE posts MODIFY ' + entry.Field + ' MEDIUMTEXT');
}
}));
});
Expand Down
6 changes: 3 additions & 3 deletions core/server/data/schema/clients/pg.js
@@ -1,5 +1,5 @@
var _ = require('lodash'),
config = require('../../../config/index'),
var _ = require('lodash'),
db = require('../../../data/db'),

// private
doRawFlattenAndPluck,
Expand All @@ -10,7 +10,7 @@ var _ = require('lodash'),
getColumns;

doRawFlattenAndPluck = function doRaw(query, name) {
return config.database.knex.raw(query).then(function (response) {
return db.knex.raw(query).then(function (response) {
return _.flatten(_.pluck(response.rows, name));
});
};
Expand Down
6 changes: 3 additions & 3 deletions core/server/data/schema/clients/sqlite3.js
@@ -1,5 +1,5 @@
var _ = require('lodash'),
config = require('../../../config/index'),
var _ = require('lodash'),
db = require('../../../data/db'),

// private
doRaw,
Expand All @@ -10,7 +10,7 @@ var _ = require('lodash'),
getColumns;

doRaw = function doRaw(query, fn) {
return config.database.knex.raw(query).then(function (response) {
return db.knex.raw(query).then(function (response) {
return fn(response);
});
};
Expand Down
37 changes: 12 additions & 25 deletions core/server/data/schema/commands.js
@@ -1,11 +1,9 @@
var _ = require('lodash'),
Promise = require('bluebird'),
config = require('../../config'),
i18n = require('../../i18n'),
db = require('../db'),
schema = require('./schema'),
clients = require('./clients'),

dbConfig;
clients = require('./clients');

function addTableColumn(tablename, table, columnname) {
var column,
Expand Down Expand Up @@ -44,37 +42,31 @@ function addTableColumn(tablename, table, columnname) {
}

function addColumn(table, column) {
dbConfig = dbConfig || config.database;
return dbConfig.knex.schema.table(table, function (t) {
return db.knex.schema.table(table, function (t) {
addTableColumn(table, t, column);
});
}

function dropColumn(table, column) {
dbConfig = dbConfig || config.database;

return dbConfig.knex.schema.table(table, function (table) {
return db.knex.schema.table(table, function (table) {
table.dropColumn(column);
});
}

function addUnique(table, column) {
dbConfig = dbConfig || config.database;
return dbConfig.knex.schema.table(table, function (table) {
return db.knex.schema.table(table, function (table) {
table.unique(column);
});
}

function dropUnique(table, column) {
dbConfig = dbConfig || config.database;
return dbConfig.knex.schema.table(table, function (table) {
return db.knex.schema.table(table, function (table) {
table.dropUnique(column);
});
}

function createTable(table) {
dbConfig = dbConfig || config.database;
return dbConfig.knex.schema.createTable(table, function (t) {
return db.knex.schema.createTable(table, function (t) {
var columnKeys = _.keys(schema[table]);
_.each(columnKeys, function (column) {
return addTableColumn(table, t, column);
Expand All @@ -83,13 +75,11 @@ function createTable(table) {
}

function deleteTable(table) {
dbConfig = dbConfig || config.database;
return dbConfig.knex.schema.dropTableIfExists(table);
return db.knex.schema.dropTableIfExists(table);
}

function getTables() {
dbConfig = dbConfig || config.database;
var client = dbConfig.client;
var client = db.knex.client.config.client;

if (_.contains(_.keys(clients), client)) {
return clients[client].getTables();
Expand All @@ -99,8 +89,7 @@ function getTables() {
}

function getIndexes(table) {
dbConfig = dbConfig || config.database;
var client = dbConfig.client;
var client = db.knex.client.config.client;

if (_.contains(_.keys(clients), client)) {
return clients[client].getIndexes(table);
Expand All @@ -110,8 +99,7 @@ function getIndexes(table) {
}

function getColumns(table) {
dbConfig = dbConfig || config.database;
var client = dbConfig.client;
var client = db.knex.client.config.client;

if (_.contains(_.keys(clients), client)) {
return clients[client].getColumns(table);
Expand All @@ -121,8 +109,7 @@ function getColumns(table) {
}

function checkTables() {
dbConfig = dbConfig || config.database;
var client = dbConfig.client;
var client = db.knex.client.config.client;

if (client === 'mysql') {
return clients[client].checkPostTable();
Expand Down
10 changes: 4 additions & 6 deletions core/server/data/schema/versioning.js
@@ -1,6 +1,6 @@
var _ = require('lodash'),
db = require('../db'),
errors = require('../../errors'),
config = require('../../config'),
i18n = require('../../i18n'),
defaultSettings = require('./default-settings'),

Expand All @@ -23,13 +23,11 @@ function getDefaultDatabaseVersion() {
// The migration version number according to the database
// This is what the database is currently at and may need to be updated
function getDatabaseVersion() {
var knex = config.database.knex;

return knex.schema.hasTable('settings').then(function (exists) {
return db.knex.schema.hasTable('settings').then(function (exists) {
// Check for the current version from the settings table
if (exists) {
// Temporary code to deal with old databases with currentVersion settings
return knex('settings')
return db.knex('settings')
.where('key', 'databaseVersion')
.orWhere('key', 'currentVersion')
.select('value')
Expand All @@ -54,7 +52,7 @@ function getDatabaseVersion() {
}

function setDatabaseVersion() {
return config.database.knex('settings')
return db.knex('settings')
.where('key', 'databaseVersion')
.update({value: defaultDatabaseVersion});
}
Expand Down
1 change: 0 additions & 1 deletion core/server/index.js
Expand Up @@ -9,7 +9,6 @@ var express = require('express'),
uuid = require('node-uuid'),
Promise = require('bluebird'),
i18n = require('./i18n'),

api = require('./api'),
config = require('./config'),
errors = require('./errors'),
Expand Down
3 changes: 2 additions & 1 deletion core/server/models/base/index.js
Expand Up @@ -8,6 +8,7 @@
var _ = require('lodash'),
bookshelf = require('bookshelf'),
config = require('../../config'),
db = require('../../data/db'),
errors = require('../../errors'),
filters = require('../../filters'),
moment = require('moment'),
Expand All @@ -25,7 +26,7 @@ var _ = require('lodash'),

// ### ghostBookshelf
// Initializes a new Bookshelf instance called ghostBookshelf, for reference elsewhere in Ghost.
ghostBookshelf = bookshelf(config.database.knex);
ghostBookshelf = bookshelf(db.knex);

// Load the Bookshelf registry plugin, which helps us avoid circular dependencies
ghostBookshelf.plugin('registry');
Expand Down
3 changes: 2 additions & 1 deletion core/test/integration/import_spec.js
Expand Up @@ -10,14 +10,15 @@ var testUtils = require('../utils/index'),
validator = require('validator'),

// Stuff we are testing
db = require('../../server/data/db'),
config = require('../../server/config'),
defaultConfig = rewire('../../../config.example')[process.env.NODE_ENV],
migration = rewire('../../server/data/migration'),
exporter = require('../../server/data/export'),
importer = require('../../server/data/import'),
DataImporter = require('../../server/data/import/data-importer'),

knex = config.database.knex,
knex = db.knex,
sandbox = sinon.sandbox.create();

// Tests in here do an import for each test
Expand Down
4 changes: 2 additions & 2 deletions core/test/integration/model/model_settings_spec.js
Expand Up @@ -6,7 +6,7 @@ var testUtils = require('../../utils'),

// Stuff we are testing
SettingsModel = require('../../../server/models/settings').Settings,
config = require('../../../server/config'),
db = require('../../../server/data/db'),
events = require('../../../server/events'),
sandbox = sinon.sandbox.create(),
context = testUtils.context.admin;
Expand Down Expand Up @@ -176,7 +176,7 @@ describe('Settings Model', function () {

describe('populating defaults from settings.json', function () {
beforeEach(function (done) {
config.database.knex('settings').truncate().then(function () {
db.knex('settings').truncate().then(function () {
done();
});
});
Expand Down

0 comments on commit 21c272b

Please sign in to comment.