Skip to content

Commit

Permalink
better JSON stringify support
Browse files Browse the repository at this point in the history
  • Loading branch information
joeferner committed Dec 15, 2011
1 parent cc396e0 commit ad689b5
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 65 deletions.
14 changes: 7 additions & 7 deletions lib/connection.js
Expand Up @@ -28,10 +28,10 @@ var Connection = persistUtils.Class.extend({
this.runSql(sqlAndValues.sql, sqlAndValues.values, function(err, data) {
if(err) { callback(err); return; }
if(data.lastId) {
var idPropName = obj._model.getIdPropertyName();
var idPropName = obj._model().getIdPropertyName();
obj[idPropName] = data.lastId;
}
obj._connection = self;
obj._connection = function() { return self; }; // hide from JSON.stringify
obj._persisted = true;
self.saveAssociations(obj, callback);
});
Expand All @@ -54,7 +54,7 @@ var Connection = persistUtils.Class.extend({
this.runSql(sqlAndValues.sql, sqlAndValues.values, function(err, data) {
if(err) { callback(err); return; }
if(data.lastId) {
var idPropName = obj._model.getIdPropertyName();
var idPropName = obj._model().getIdPropertyName();
obj[idPropName] = data.lastId;
}
obj._persisted = true;
Expand Down Expand Up @@ -83,10 +83,10 @@ var Connection = persistUtils.Class.extend({
saveAssociations: function(obj, callback) {
var self = this;
var associations = [];
for(var name in obj._model.associations) {
for(var name in obj._model().associations) {
associations.push({
name: name,
association: obj._model.associations[name]
association: obj._model().associations[name]
});
}

Expand All @@ -103,7 +103,7 @@ var Connection = persistUtils.Class.extend({
this.runSqlEach(sqlAndValues.sql, sqlAndValues.values, function(err, data) {
if(err) { callback(err); return; }
var obj = sqlTree.toObject(data);
obj._connection = self;
obj._connection = function() { return self; }; // hide from JSON.stringify

callback(null, obj);
}, function() {
Expand All @@ -122,7 +122,7 @@ var Connection = persistUtils.Class.extend({

// add connections to all the objects
for(var i=0; i<objs.length; i++) {
objs[i]._connection = self;
objs[i]._connection = function() { return self; }; // hide from JSON.stringify
}

callback(null, objs);
Expand Down
14 changes: 7 additions & 7 deletions lib/driver.js
Expand Up @@ -16,15 +16,15 @@ var Driver = persistUtils.Class.extend({
var valuesSql = [];
var values = [];

for(var columnKey in obj._model.columns) {
var column = obj._model.columns[columnKey];
for(var columnKey in obj._model().columns) {
var column = obj._model().columns[columnKey];
if(column.primaryKey && column.autoIncrement) continue;
columnNamesSql.push(column.dbColumnName);
valuesSql.push('?');
values.push(obj[columnKey]);
}

var sql = 'INSERT INTO ' + obj._model.modelName + '(' + columnNamesSql.join(',') + ') VALUES (' + valuesSql.join(',') + ');';
var sql = 'INSERT INTO ' + obj._model().modelName + '(' + columnNamesSql.join(',') + ') VALUES (' + valuesSql.join(',') + ');';
var result = { sql: sql, values: values };
//console.log(result);
return result;
Expand All @@ -45,17 +45,17 @@ var Driver = persistUtils.Class.extend({
var columnNamesSql = [];
var values = [];

for(var columnKey in obj._model.columns) {
var column = obj._model.columns[columnKey];
for(var columnKey in obj._model().columns) {
var column = obj._model().columns[columnKey];
if(column.primaryKey && column.autoIncrement) continue;
columnNamesSql.push(column.dbColumnName + ' = ?');
values.push(obj[columnKey]);
}

var idColumndName = obj._model.getIdPropertyName();
var idColumndName = obj._model().getIdPropertyName();
values.push(obj.getId());

var sql = 'UPDATE ' + obj._model.modelName + ' SET ' + columnNamesSql.join(',') + ' WHERE ' + idColumndName + ' = ?;';
var sql = 'UPDATE ' + obj._model().modelName + ' SET ' + columnNamesSql.join(',') + ' WHERE ' + idColumndName + ' = ?;';
//console.log(sql);
return { sql: sql, values: values };
},
Expand Down
52 changes: 31 additions & 21 deletions lib/model.js
Expand Up @@ -36,35 +36,45 @@ function saveInstance(connection, callback) {
if(!connection.update) throw new Error("argument 1 to save does not appear to be a connection");

var self = this;
this._model.emit("beforeSave", this);
this._model().emit("beforeSave", this);
if(this._persisted) {
self._model.emit("beforeUpdate", self);
self._model().emit("beforeUpdate", self);
connection.update(this, function() {
self._model.emit("afterUpdate", self);
self._model.emit("afterSave", self);
self._model().emit("afterUpdate", self);
self._model().emit("afterSave", self);
callback.apply(self, arguments);
});
} else {
this._model.emit("beforeCreate", this);
this._model().emit("beforeCreate", this);
connection.save(this, function() {
self._model.emit("afterCreate", self);
self._model.emit("afterSave", self);
self._model().emit("afterCreate", self);
self._model().emit("afterSave", self);
callback.apply(self, arguments);
});
}
}

function deleteInstance(connection, callback) {
var self = this;
this._model.emit("beforeDelete", this);
var query = new Query(connection, this._model);
query.where("id = ?", this[this._model.getIdPropertyName()]);
this._model().emit("beforeDelete", this);
var query = new Query(connection, this._model());
query.where("id = ?", this[this._model().getIdPropertyName()]);
query.deleteAll(function() {
self._model.emit("afterDelete", self);
self._model().emit("afterDelete", self);
callback.apply(self, arguments);
});
}

function doesObjectHaveAConnection(obj) {
if(!obj._connection) {
return false;
}
if(obj._connection && !obj._connection()) {
return false;
}
return true;
}

function addHasManyAssociationMethod(obj, associationName, association) {
// create getter to allow this... person1.phones.all(function() {});
// where model == 'Person' and associationName == 'phone'
Expand All @@ -75,10 +85,10 @@ function addHasManyAssociationMethod(obj, associationName, association) {
// INNER JOIN person_phone ON person_phone.phone_id = phones.id
// WHERE person_phone.person_id = 5
obj.__defineGetter__(associationName, function() {
if(!obj._connection) {
if(!doesObjectHaveAConnection(obj)) {
return [];
}
var query = new Query(obj._connection, association.model);
var query = new Query(obj._connection(), association.model);
if(association.through) {
query = query.join(association.through, association.manyToManyForeignKey, association.model.getIdColumn().dbColumnName)
}
Expand Down Expand Up @@ -118,12 +128,12 @@ function addHasOneAssociationMethod(obj, associationName, association) {
}

// object didn't come from the database so we can't fetch the query.
if(!obj._connection) {
if(!doesObjectHaveAConnection(obj)) {
return null;
}

// value was not set on the object so we need to query for it.
var query = new Query(obj._connection, association.model);
var query = new Query(obj._connection(), association.model);
var foreignKey = obj['_' + foreignKeyPropertyName];
var idColumn = association.model.getIdColumn().dbColumnName;
var result = query.where(idColumn + " = ?", foreignKey);
Expand All @@ -149,8 +159,8 @@ function addAssociationMethod(obj, associationName, association) {
}

function addAssociationMethods(obj) {
for(var associationName in obj._model.associations) {
var association = obj._model.associations[associationName];
for(var associationName in obj._model().associations) {
var association = obj._model().associations[associationName];
addAssociationMethod(obj, associationName, association);
}
}
Expand All @@ -167,8 +177,8 @@ function copyValuesIntoObject(values, obj) {
}

function createColumnPropertiesOnObject(obj) {
for(var columnName in obj._model.columns) {
var column = obj._model.columns[columnName];
for(var columnName in obj._model().columns) {
var column = obj._model().columns[columnName];
if(!obj[columnName]) {
if(!column.foreignKey) {
obj[columnName] = column.defaultValue();
Expand Down Expand Up @@ -201,7 +211,7 @@ function getIdColumn() {
}

function getId() {
return this[this._model.getIdPropertyName()];
return this[this._model().getIdPropertyName()];
}

function normalizeHasManyOptions(associatedModel, opts) {
Expand Down Expand Up @@ -318,7 +328,7 @@ function max(fieldName) {

exports.define = function(name, columnDefs) {
var Model = function(values) {
this._model = Model;
this._model = function() { return Model; } // hide from JSON.stringify
this.save = persistUtil.bind('save', saveInstance, this);
this.delete = persistUtil.bind('delete', deleteInstance, this);
this.getId = persistUtil.bind('getId', getId, this);
Expand Down

0 comments on commit ad689b5

Please sign in to comment.