1
0
Fork 0
mirror of https://github.com/SunRed/haste-server.git synced 2024-11-23 17:50:19 +01:00

Added postgres adapter

This commit is contained in:
John Crepezzi 2014-06-09 16:50:43 -04:00
parent 447d0aae76
commit ab029eae2f
3 changed files with 66 additions and 61 deletions

View file

@ -56,7 +56,6 @@ DocumentHandler.prototype.handlePost = function (request, response) {
// What to do when done // What to do when done
var onSuccess = function () { var onSuccess = function () {
// Check length // Check length
console.log(buffer);
if (_this.maxLength && buffer.length > _this.maxLength) { if (_this.maxLength && buffer.length > _this.maxLength) {
cancelled = true; cancelled = true;
winston.warn('document >maxLength', { maxLength: _this.maxLength }); winston.warn('document >maxLength', { maxLength: _this.maxLength });

View file

@ -3,28 +3,27 @@
var postgres = require('pg'); var postgres = require('pg');
var winston = require('winston'); var winston = require('winston');
(function () { // create table entries (id SERIAL primary key, key varchar(255) not null, value text not null, expiration int);
// CREATE UNIQUE INDEX unique_key ON entries (key);
'use strict'; // A postgres document store
var PostgresDocumentStore = function (options) {
this.expireJS = options.expire;
this.connectionUrl = process.env.DATABASE_URL || options.connectionUrl;
};
// A postgres document store PostgresDocumentStore.prototype = {
var PostgresDocumentStore = function (options) {
this.expireJS = options.expire * 1000;
this.connectionString = process.env.DATABASE_URL;
};
PostgresDocumentStore.prototype = {
// Set a given key // Set a given key
set: function (key, data, callback, skipExpire) { set: function (key, data, callback, skipExpire) {
var now = new Date().getTime() / 1000; var now = Math.floor(new Date().getTime() / 1000);
var that = this; var that = this;
this.safeConnect(function (err, client, done) { this.safeConnect(function (err, client, done) {
if (err) { return callback(false); } if (err) { return callback(false); }
client.query('INSERT INTO entries (key, value, expiration) VALUES ($1, $2, $3)', [ client.query('INSERT INTO entries (key, value, expiration) VALUES ($1, $2, $3)', [
key, key,
data, data,
that.expireJS && !skipExpire ? now + that.expireJS : null that.expireJS && !skipExpire ? that.expireJS + now : null
], function (err, result) { ], function (err, result) {
if (err) { if (err) {
winston.error('error persisting value to postgres', { error: err }); winston.error('error persisting value to postgres', { error: err });
@ -38,26 +37,35 @@ var winston = require('winston');
// Get a given key's data // Get a given key's data
get: function (key, callback, skipExpire) { get: function (key, callback, skipExpire) {
var now = new Date().getTime() / 1000; var now = Math.floor(new Date().getTime() / 1000);
var that = this; var that = this;
this.safeConnect(function (err, client, done) { this.safeConnect(function (err, client, done) {
if (err) { return callback(false); } if (err) { return callback(false); }
client.query('SELECT value from entries where KEY = $1 AND (expiration IS NULL or expiration < $2)', [ client.query('SELECT id,value,expiration from entries where KEY = $1 and (expiration IS NULL or expiration > $2)', [key, now], function (err, result) {
key,
that.expireJS ? now - that.expireJS : 0
], function (err, result) {
if (err) { if (err) {
winston.error('error retrieving value from postgres', { error: err }); winston.error('error retrieving value from postgres', { error: err });
return callback(false); return callback(false);
} }
callback(result.rows.length ? result.rows[0].value : false); callback(result.rows.length ? result.rows[0].value : false);
if (result.rows.length && that.expireJS && !skipExpire) {
client.query('UPDATE entries SET expiration = $1 WHERE ID = $2', [
that.expireJS + now,
result.rows[0].id
], function (err, result) {
if (!err) {
done();
}
});
} else {
done();
}
}); });
}); });
}, },
// A connection wrapper // A connection wrapper
safeConnect: function (callback) { safeConnect: function (callback) {
postgres.connect(this.connectionString, function (err, client, done) { postgres.connect(this.connectionUrl, function (err, client, done) {
if (err) { if (err) {
winston.error('error connecting to postgres', { error: err }); winston.error('error connecting to postgres', { error: err });
callback(err); callback(err);
@ -67,8 +75,6 @@ var winston = require('winston');
}); });
} }
}; };
module.export = PostgresDocumentStore; module.exports = PostgresDocumentStore;
}());

View file

@ -37,7 +37,7 @@ if (!config.storage.type) {
var Store, preferredStore; var Store, preferredStore;
if (process.env.REDISTOGO_URL) { if (process.env.REDISTOGO_URL && config.storage.type === 'redis') {
var redisClient = require('redis-url').connect(process.env.REDISTOGO_URL); var redisClient = require('redis-url').connect(process.env.REDISTOGO_URL);
Store = require('./lib/document_stores/redis'); Store = require('./lib/document_stores/redis');
preferredStore = new Store(config.storage, redisClient); preferredStore = new Store(config.storage, redisClient);