From 23d068490efb03bf94e89b3c314c0d99b21ab8a4 Mon Sep 17 00:00:00 2001 From: Simo Kinnunen Date: Mon, 27 Jan 2014 19:47:37 +0900 Subject: [PATCH] Add rethinkdb. --- .gitignore | 1 + lib/db/index.js | 22 ++++++++++++++++++++++ lib/db/setup.js | 46 ++++++++++++++++++++++++++++++++++++++++++++++ lib/db/tables.js | 5 +++++ lib/util/rutil.js | 17 +++++++++++++++++ 5 files changed, 91 insertions(+) create mode 100644 lib/db/index.js create mode 100644 lib/db/setup.js create mode 100644 lib/db/tables.js create mode 100644 lib/util/rutil.js diff --git a/.gitignore b/.gitignore index a5dfca7f..450a766b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /node_modules/ /app/lib/ +/rethinkdb_data/ diff --git a/lib/db/index.js b/lib/db/index.js new file mode 100644 index 00000000..58e0327a --- /dev/null +++ b/lib/db/index.js @@ -0,0 +1,22 @@ +var setup = require('./setup') +var rutil = require('../util/rutil') +var logger = require('../util/logger') + +function connect() { + var log = logger.createLogger('db') + return rutil.connect({ + host: process.env.RDB_HOST || 'localhost' + , port: process.env.RDB_PORT || 28015 + , db: process.env.RDB_DB || 'stf' + , authKey: process.env.RDB_AUTHKEY + }) + .then(function(conn) { + conn.on('error', function(err) { + log.fatal('Connection error', err.stack) + process.exit(1) + }) + return conn + }) +} + +module.exports = connect().then(setup) diff --git a/lib/db/setup.js b/lib/db/setup.js new file mode 100644 index 00000000..e5806bfd --- /dev/null +++ b/lib/db/setup.js @@ -0,0 +1,46 @@ +var assert = require('assert') +var util = require('util') + +var r = require('rethinkdb') +var Promise = require('bluebird') + +var logger = require('../util/logger') +var rutil = require('../util/rutil') +var tables = require('./tables') + +module.exports = function(conn) { + var log = logger.createLogger('db:setup') + + function createDatabase() { + return rutil.run(conn, r.dbCreate(conn.db)) + .then(function() { + log.info('Database "%s" created', conn.db) + }) + .catch(rutil.errors.RqlRuntimeError, function(err) { + var expected = util.format('Database `%s` already exists.', conn.db) + assert.equal(expected, err.msg) + log.info('Database "%s" already exists', conn.db) + }) + } + + function createTable(table, options) { + return rutil.run(conn, r.tableCreate(table, options)) + .then(function() { + log.info('Table "%s" created', table) + return Promise.resolve() + }) + .catch(rutil.errors.RqlRuntimeError, function(err) { + var expected = util.format('Table `%s` already exists.', table) + assert.equal(expected, err.msg) + log.info('Table "%s" already exists', table) + }) + } + + return createDatabase() + .then(function() { + return Promise.all(Object.keys(tables).map(function(table) { + return createTable(table, tables[table]) + })) + }) + .return(conn) +} diff --git a/lib/db/tables.js b/lib/db/tables.js new file mode 100644 index 00000000..98bd7ae6 --- /dev/null +++ b/lib/db/tables.js @@ -0,0 +1,5 @@ +module.exports = { + users: { + primaryKey: 'id' + } +} diff --git a/lib/util/rutil.js b/lib/util/rutil.js new file mode 100644 index 00000000..a3d5c990 --- /dev/null +++ b/lib/util/rutil.js @@ -0,0 +1,17 @@ +var r = require('rethinkdb') +var re = require('rethinkdb/errors') +var Promise = require('bluebird') + +module.exports.errors = re + +module.exports.connect = function(options) { + var resolver = Promise.defer() + r.connect(options, resolver.callback) + return resolver.promise +} + +module.exports.run = function(conn, q) { + var resolver = Promise.defer() + q.run(conn, resolver.callback) + return resolver.promise +}