Comparing version 0.1.6 to 0.2.0
@@ -188,6 +188,7 @@ /** | ||
MongoDB.prototype.findById = function findById(model, id, callback) { | ||
id = getObjectId(id); | ||
this.collection(model).findOne({_id: id}, function (err, data) { | ||
var self = this; id = getObjectId(id); | ||
self.collection(model).findOne({_id: id}, function (err, data) { | ||
if (data) { | ||
data.id = id; | ||
data = self.fromDatabase(model, data); | ||
} | ||
@@ -242,3 +243,3 @@ callback(err, data); | ||
} | ||
var cursor = this.collection(model).find(query); | ||
var self = this, cursor = this.collection(model).find(query); | ||
@@ -270,7 +271,7 @@ if (filter.order) { | ||
cursor.toArray(function (err, data) { | ||
if (err) | ||
if (err) { | ||
return callback(err); | ||
} | ||
callback(null, data.map(function (o) { | ||
o.id = o._id; | ||
return o; | ||
return self.fromDatabase(model, o); | ||
})); | ||
@@ -299,2 +300,23 @@ }); | ||
MongoDB.prototype.fromDatabase = function (model, data) { | ||
var props = this._models[model].properties; | ||
var clean = {}; | ||
Object.keys(data).forEach(function(key){ | ||
if (!props[key]) { | ||
return; | ||
} | ||
if(props[key].type.name.toString().toLowerCase() === 'date') { | ||
if(data[key]) { | ||
clean[key] = new Date(data[key]); | ||
} else { | ||
clean[key] = data[key]; | ||
} | ||
} else { | ||
clean[key] = data[key]; | ||
} | ||
}); | ||
clean.id = data._id; | ||
return clean; | ||
}; | ||
MongoDB.prototype.disconnect = function () { | ||
@@ -301,0 +323,0 @@ this.client.close(); |
@@ -218,4 +218,6 @@ /** | ||
Object.keys(data).forEach(function (key) { | ||
if (!props[key]) return; | ||
cdata[key] = self.toDatabase(props[key], data[key]); | ||
}); | ||
self.client.insertNode(cdata, model, function (err, node) { | ||
@@ -391,7 +393,7 @@ if (err) { | ||
} | ||
if (prop.type.name === 'Number') { | ||
var type = (prop.type.name || '').toString().toLowerCase(); | ||
if (type === 'number') { | ||
return val; | ||
} | ||
if (prop.type.name === 'Date') { | ||
if (type === 'date') { | ||
if (!val) { | ||
@@ -408,5 +410,10 @@ return 0; | ||
} | ||
if (prop.type.name === "Boolean") { | ||
if (type === "boolean") { | ||
return val ? 1 : 0; | ||
} | ||
if (type === "json") { | ||
if (typeof val === 'object') { | ||
val = JSON.stringify(val); | ||
} | ||
} | ||
return esc ? '\'' + val.toString() + '\'' : val.toString(); | ||
@@ -426,4 +433,5 @@ }; | ||
} | ||
var type = (props[key].type.name || '').toString().toLowerCase(); | ||
if (props[key].type.name === 'Date' && val !== null) { | ||
if (type === 'date' && val !== null) { | ||
if (val !== '') { | ||
@@ -434,2 +442,11 @@ clean[key] = new Date(val); | ||
} | ||
} else if (type === 'json') { | ||
if (typeof val === 'string') { | ||
try { | ||
clean[key] = JSON.parse(val); | ||
} catch(err){} | ||
} else { | ||
clean[key] = val; | ||
} | ||
} else { | ||
@@ -507,7 +524,7 @@ clean[key] = val; | ||
case 'nin': | ||
sqlCond = ' NOT ( '+keyEscaped+' IN ['+val+'])'; | ||
sqlCond = ' NOT ( ' + keyEscaped + ' IN [' + val + '])'; | ||
break; | ||
case 'neq': | ||
case 'ne': | ||
sqlCond = ' NOT ( '+keyEscaped+' = '+val+' )'; | ||
sqlCond = ' NOT ( ' + keyEscaped + ' = ' + val + ' )'; | ||
break; | ||
@@ -514,0 +531,0 @@ case 'regex': |
@@ -36,2 +36,4 @@ /** | ||
database: s.database || process.env.USER, | ||
poolIdleTimeout: s.poolIdleTimeout || 15000, | ||
poolSize: s.poolSize || s.pool || 25, | ||
debug: s.debug | ||
@@ -57,3 +59,3 @@ }); | ||
if (!err) { | ||
callback(); | ||
return callback && callback(); | ||
} else { | ||
@@ -68,3 +70,3 @@ throw err; | ||
var s = schema.settings; | ||
pg.connect({ | ||
return pg.connect({ | ||
host: s.host || 'localhost', | ||
@@ -80,3 +82,3 @@ port: s.port || 5432, | ||
} | ||
client.query('CREATE DATABASE ' + s.database + ' OWNER ' + s.username + ' ENCODING \'UTF8\'', function (err) { | ||
return client.query('CREATE DATABASE ' + s.database + ' OWNER ' + s.username + ' ENCODING \'UTF8\'', function (err) { | ||
if (err) { | ||
@@ -86,3 +88,4 @@ // console.log(err, 'ignoring the error'); | ||
client.end(); | ||
callback(); | ||
done(); | ||
return callback && callback(); | ||
}); | ||
@@ -96,8 +99,11 @@ }); | ||
PG.prototype.query = function (sql, callback) { | ||
var self = this,time = Date.now(); | ||
var log = self.log; | ||
self.client.query(sql, function (err, data) { | ||
PG.prototype.query = function (sql, vals, callback) { | ||
var self = this, time = Date.now(), log = self.log; | ||
if (typeof vals === 'function') { | ||
callback = vals; | ||
vals = {}; | ||
} | ||
self.client.query(sql, vals, function (err, data) { | ||
if (log) { | ||
log(sql, time); | ||
log(time, sql); | ||
} | ||
@@ -123,2 +129,3 @@ callback(err, data ? data.rows : null); | ||
sql += ' RETURNING id'; | ||
this.query(sql, function (err, info) { | ||
@@ -129,3 +136,3 @@ if (err) { | ||
callback(err, info && info[0] && info[0].id); | ||
}); | ||
}.bind(this)); | ||
}; | ||
@@ -238,4 +245,5 @@ | ||
if (props[key]) { | ||
if (key === 'id') | ||
if (key === 'id') { | ||
return; | ||
} | ||
columns.push('"' + key + '"'); | ||
@@ -249,4 +257,5 @@ fields.push(this.toDatabase(props[key], data[key])); | ||
if (props[key]) { | ||
if (key === 'id') | ||
if (key === 'id') { | ||
return; | ||
} | ||
fields.push('"' + key + '" = ' + this.toDatabase(props[key], data[key])); | ||
@@ -286,16 +295,4 @@ } | ||
} | ||
if (val.constructor.name === 'Object') { | ||
var operator = Object.keys(val)[0]; | ||
val = val[operator]; | ||
if (operator === 'between') { | ||
return this.toDatabase(prop, val[0]) + ' AND ' + this.toDatabase(prop, val[1]); | ||
} | ||
if (operator === 'inq' || operator === 'nin') { | ||
for (var i = 0; i < val.length; i++) { | ||
val[i] = escape(val[i]); | ||
} | ||
return val.join(','); | ||
} | ||
} | ||
if (prop.type.name === 'Number') { | ||
var type = (prop.type.name || '').toString().toLowerCase(); | ||
if (type === 'number') { | ||
if (!val && val !== 0) { | ||
@@ -312,3 +309,3 @@ if (prop.autoIncrement) { | ||
if (prop.type.name === 'Date') { | ||
if (type === 'date') { | ||
if (!val) { | ||
@@ -327,2 +324,7 @@ if (prop.autoIncrement) { | ||
} | ||
if (type === 'json') { | ||
return '\'' + JSON.stringify(val) + '\''; | ||
} | ||
return escape(val.toString()); | ||
@@ -341,7 +343,3 @@ | ||
if (props[key]) { | ||
if ((props[key].type.name || '').toString().toLowerCase() === 'json' && typeof val == "string") { | ||
data[key] = JSON.parse(val); | ||
} else { | ||
data[key] = val; | ||
} | ||
data[key] = val; | ||
} | ||
@@ -386,20 +384,14 @@ }); | ||
function getTableStatus(cls, model, callback) { | ||
function decoratedCallback(err, data) { | ||
data.forEach(function (field) { | ||
field.Type = mapPostgresDatatypes(field.Type); | ||
}); | ||
return callback && callback(err, data); | ||
} | ||
cls.query('SELECT column_name as "Field", udt_name as "Type", is_nullable as "Null", column_default as "Default" FROM information_schema.COLUMNS WHERE table_name = \'' + cls.table(model) + '\'', decoratedCallback); | ||
} | ||
PG.prototype.autoupdate = function (callback) { | ||
var self = this; | ||
var wait = 0; | ||
Object.keys(this._models).forEach(function (model) { | ||
Object.keys(self._models).forEach(function (model) { | ||
wait += 1; | ||
var indexes = []; | ||
getTableStatus(self, model, function (err, fields) { | ||
var sql = 'SELECT column_name as "Field", udt_name as "Type", is_nullable as "Null", column_default as "Default" FROM information_schema.COLUMNS WHERE table_name = \'' + self.table(model) + '\';'; | ||
self.client.query(sql, function (err, fields) { | ||
if (!err && fields.length) { | ||
fields.forEach(function (field) { | ||
field.Type = mapPostgresDatatypes(field.Type); | ||
}); | ||
self.alterTable(model, fields, indexes, done); | ||
@@ -409,4 +401,5 @@ } else { | ||
} | ||
}); | ||
}); | ||
}.bind(self)); | ||
@@ -413,0 +406,0 @@ function done(err) { |
@@ -198,3 +198,3 @@ /** | ||
BridgeToRedis.prototype.forDb = function (model, data) { | ||
BridgeToRedis.prototype.forDatabase = function (model, data) { | ||
var p = this._models[model].properties; | ||
@@ -205,3 +205,2 @@ for (var i in data) { | ||
} | ||
if (typeof data[i] === 'undefined' || data[i] === null) { | ||
@@ -236,7 +235,9 @@ if(p[i].default || p[i].default === 0) { | ||
break; | ||
case "string": | ||
case "text": | ||
case "json": | ||
if(typeof data[i] === 'object') { | ||
data[i] = JSON.stringify(data[i]); | ||
} | ||
break; | ||
default: | ||
data[i] = JSON.stringify(data[i]); | ||
data[i] = data[i].toString(); | ||
} | ||
@@ -248,3 +249,3 @@ | ||
BridgeToRedis.prototype.fromDb = function (model, data) { | ||
BridgeToRedis.prototype.fromDatabase = function (model, data) { | ||
var p = this._models[model].properties, d; | ||
@@ -255,3 +256,3 @@ for (var i in data) { | ||
} | ||
var type = (p[i].type.name || '').toString().toLowerCase(); | ||
if (typeof data[i] === 'undefined' || data[i] === null) { | ||
@@ -270,3 +271,11 @@ if(p[i].default || p[i].default === 0) { | ||
switch ((p[i].type.name || '').toString().toLowerCase()) { | ||
switch (type) { | ||
case "json": | ||
try { | ||
if(typeof data[i] === 'string') { | ||
data[i] = JSON.parse(data[i]); | ||
} | ||
} catch(err) { | ||
} | ||
break; | ||
case "date": | ||
@@ -283,13 +292,3 @@ d = new Date(data[i]); | ||
break; | ||
default: | ||
d = data[i]; | ||
try { | ||
data[i] = JSON.parse(data[i]); | ||
if (typeof data[i] !== 'object') { | ||
data[i] = d; | ||
} | ||
} | ||
catch (e) { | ||
data[i] = d; | ||
} | ||
} | ||
@@ -302,3 +301,3 @@ } | ||
var self = this; | ||
data = self.forDb(model, data); | ||
data = self.forDatabase(model, data); | ||
deleteNulls(data); | ||
@@ -309,3 +308,3 @@ self.client.hgetall(model + ':' + data.id, function (err, prevData) { | ||
} | ||
self.client.hmset([model + ':' + data.id, self.forDb(model, data)], function (err) { | ||
self.client.hmset([model + ':' + data.id, self.forDatabase(model, data)], function (err) { | ||
if (err) { | ||
@@ -322,3 +321,3 @@ return callback(err); | ||
} | ||
self.updateIndexes(model, data.id, data, callback, self.forDb(model, prevData)); | ||
self.updateIndexes(model, data.id, data, callback, self.forDatabase(model, prevData)); | ||
}.bind(this)); | ||
@@ -427,3 +426,3 @@ }.bind(this)); | ||
} | ||
data = self.fromDb(model, data); | ||
data = self.fromDatabase(model, data); | ||
callback(err, data); | ||
@@ -683,3 +682,3 @@ }.bind(this)); | ||
callback(err, (replies || []).map(function (r) { | ||
return self.fromDb(model, r); | ||
return self.fromDatabase(model, r); | ||
})); | ||
@@ -819,2 +818,2 @@ }.bind(this)); | ||
this.client.quit(); | ||
}; | ||
}; |
@@ -241,6 +241,19 @@ /** | ||
Object.keys(data).forEach(function (key) { | ||
var val = data[key]; | ||
var val = data[key], type = (props[key].type.name || '').toString().toLowerCase(); | ||
if (props[key]) { | ||
if ((props[key].type.name || '').toString().toLowerCase() === 'json' && typeof val == "string") { | ||
if (type === 'json' && typeof val == "string") { | ||
data[key] = JSON.parse(val); | ||
} else if (type === 'date') { | ||
if (!val) { | ||
val = null; | ||
} | ||
if (typeof val === 'string') { | ||
val = val.split('.')[0].replace('T', ' '); | ||
val = Date.parse(val); | ||
} | ||
if (typeof val === 'number') { | ||
val = new Date(val); | ||
} | ||
data[key] = val; | ||
} else { | ||
@@ -247,0 +260,0 @@ data[key] = val; |
{ | ||
"name": "caminte", | ||
"description": "ORM for every database: redis, mysql, neo4j, mongodb, rethinkdb, postgres, sqlite, tingodb", | ||
"version": "0.1.6", | ||
"version": "0.2.0", | ||
"author": { | ||
@@ -100,30 +100,31 @@ "name": "Aleksej Gordejev", | ||
"dependencies": { | ||
"node-uuid": ">= 1.3.3" | ||
"node-uuid": ">= 1.3.3", | ||
"sqlite3": "^3.1.1" | ||
}, | ||
"devDependencies": { | ||
"arangojs": ">= 4.2.0", | ||
"async": "latest", | ||
"cassandra-driver": ">=2.1.0", | ||
"coffee-script": "*", | ||
"semicov": "latest", | ||
"underscore": "latest", | ||
"cradle": ">= 0.6.0", | ||
"felix-couchdb": ">= 1.0.0", | ||
"generic-pool": "latest", | ||
"moment": "latest", | ||
"async": "latest", | ||
"mocha": "latest", | ||
"should": "latest", | ||
"istanbul": "latest", | ||
"jshint": "2.x", | ||
"redis": ">= 0.12.0", | ||
"mocha": "latest", | ||
"moment": "latest", | ||
"mongodb": ">= 2.0.0", | ||
"mongoose": ">= 3.0.0", | ||
"mysql": ">= 2.0.0", | ||
"node-neo4j": "^2.0.3", | ||
"pg": ">= 4.0.0", | ||
"sqlite3": ">= 3.0.0", | ||
"redis": ">= 0.12.0", | ||
"rethinkdb": ">= 1.16", | ||
"riak-js": ">= 1.0.0", | ||
"node-neo4j": "^2.0.3", | ||
"mongodb": ">= 2.0.0", | ||
"felix-couchdb": ">= 1.0.0", | ||
"cradle": ">= 0.6.0", | ||
"rethinkdb": ">= 1.16", | ||
"cassandra-driver": ">=2.1.0", | ||
"arangojs": ">= 4.2.0" | ||
"semicov": "latest", | ||
"should": "latest", | ||
"sqlite3": "^3.1.1", | ||
"underscore": "latest" | ||
}, | ||
"optionalDependencies": {} | ||
} |
@@ -18,2 +18,3 @@ /** | ||
mainpage: {type: schema.Number, limit: 1, index: true}, | ||
featured: {type: schema.Boolean, default: true, index: true}, | ||
language: {type: schema.String, limit: 5, default: "en", index: true}, | ||
@@ -30,10 +31,14 @@ category_id: {type: schema.Number, limit: 11, default: 0, index: true}, | ||
template: {type: schema.String, limit: 255, default: "default"}, | ||
params: {type: schema.Text}, | ||
create_ts: {type: schema.Date}, | ||
params: {type: schema.Json}, | ||
longitude: {type: schema.Double}, | ||
latitude: {type: schema.Real}, | ||
price: {type: schema.Float}, | ||
create_ts: {type: schema.Date, default: Date.now}, | ||
modify_ts: {type: schema.Date}, | ||
create_id: {type: schema.Number, limit: 21, index: true}, | ||
modify_id: {type: schema.Number, limit: 21, index: true}, | ||
meta_keys: {type: schema.String, limit: 155}, | ||
meta_keys: {type: schema.Json}, | ||
meta_desc: {type: schema.String, limit: 155} | ||
}, {}); | ||
/* Validators */ | ||
@@ -40,0 +45,0 @@ Article.validatesPresenceOf('title', 'alias'); |
@@ -72,3 +72,9 @@ /** | ||
categories: 1 | ||
} | ||
}, | ||
content_short: 'Application developer focusing on web, mobile and server platforms. Always aiming to use software engineering’s best practices, like testability and design patterns, in a system’s implementation to achieve flexibility and scalability.', | ||
content_full: 'Application developer focusing on web, mobile and server platforms. Always aiming to use software engineering’s best practices, like testability and design patterns, in a system’s implementation to achieve flexibility and scalability.', | ||
meta_keys: ['app', 'developer', 'web'], | ||
longitude: 56.9496490, | ||
latitude: 24.1051860, | ||
price: 23.56 | ||
}, | ||
@@ -75,0 +81,0 @@ { |
@@ -58,3 +58,3 @@ /** | ||
should.not.exist(err); | ||
found.id.should.equal(id); | ||
found.id.should.deepEqual(id); | ||
done(); | ||
@@ -61,0 +61,0 @@ }); |
@@ -57,3 +57,3 @@ /** | ||
should.not.exist(err); | ||
found.id.should.equal(id); | ||
found.id.should.deepEqual(id); | ||
done(); | ||
@@ -60,0 +60,0 @@ }); |
@@ -54,3 +54,3 @@ /** | ||
should.not.exist(err); | ||
found.id.should.equal(id); | ||
found.id.should.deepEqual(id); | ||
done(); | ||
@@ -57,0 +57,0 @@ }); |
@@ -12,2 +12,3 @@ /** | ||
var config = require('./../lib/database'); | ||
var samples = require('./../lib/data'); | ||
var dbConf = config[driver]; | ||
@@ -20,13 +21,5 @@ var UserModel = require('./../lib/User'); | ||
describe(driver + ' - hooks:', function () { | ||
describe(driver + ' - schema hooks:', function () { | ||
'use strict'; | ||
var user, nuser, newUser = { | ||
language: 'en', | ||
first_name: 'Alex', | ||
last_name: 'Gordan', | ||
screen_name: 'alex', | ||
email: 'bubles@example.com', | ||
password: 'AAAAAAAAA', | ||
age: 45 | ||
}; | ||
var user, nuser, newUser = samples.users[0]; | ||
@@ -37,2 +30,6 @@ before(function (done) { | ||
after(function (done) { | ||
User.destroyAll(done); | ||
}); | ||
it("#afterInitialize", function (done) { | ||
@@ -39,0 +36,0 @@ User.afterInitialize = function () { |
@@ -25,3 +25,3 @@ /** | ||
*/ | ||
describe(driver + ' - scope:', function () { | ||
describe(driver + ' - schema scope:', function () { | ||
'use strict'; | ||
@@ -28,0 +28,0 @@ var category, newCategory = samples.categories[0]; |
@@ -25,3 +25,3 @@ /** | ||
*/ | ||
describe(driver + ' - validation:', function () { | ||
describe(driver + ' - schema validation:', function () { | ||
'use strict'; | ||
@@ -28,0 +28,0 @@ var user1, user2, |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
697057
73
13780
2
65
+ Addedsqlite3@^3.1.1
+ Addednan@2.7.0(transitive)
+ Addedsqlite3@3.1.13(transitive)