Skip to content

Commit

Permalink
Added support for object removal (via persistence.remove).
Browse files Browse the repository at this point in the history
  • Loading branch information
Zef Hemel committed Feb 5, 2010
1 parent b07a858 commit 4941cd3
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 43 deletions.
6 changes: 5 additions & 1 deletion README.md
Expand Up @@ -108,7 +108,7 @@ through the `QueryCollection` API that will be discussed later:
tasks.tags.remove(tag)l tasks.tags.remove(tag)l
tasks.tags.list(tx, function(allTags) { console.log(allTags); }); tasks.tags.list(tx, function(allTags) { console.log(allTags); });


Persisting objects Persisting/removing objects
------------------ ------------------


Similar to [hibernate](http://www.hibernate.org), `persistence.js` Similar to [hibernate](http://www.hibernate.org), `persistence.js`
Expand All @@ -127,6 +127,10 @@ be persisted using the `persistence.add` function:
persistence.add(t); persistence.add(t);
} }


Objects can also be removed from the database:

persistence.remove(c);

All changes made to tracked objects can be flushed to the database by All changes made to tracked objects can be flushed to the database by
using `persistence.flush`, which takes a transaction object and using `persistence.flush`, which takes a transaction object and
callback function as arguments. A new transaction can be started using callback function as arguments. A new transaction can be started using
Expand Down
72 changes: 56 additions & 16 deletions persistence.js
Expand Up @@ -29,6 +29,7 @@ var persistence = window.persistence || {};
var conn = null; var conn = null;
var entityMeta = {}; var entityMeta = {};
var trackedObjects = {}; var trackedObjects = {};
var objectsToRemove = {};


persistence.trackedObjects = trackedObjects; persistence.trackedObjects = trackedObjects;


Expand Down Expand Up @@ -99,16 +100,16 @@ var persistence = window.persistence || {};
*/ */
persistence.schemaSync = function (callback) { persistence.schemaSync = function (callback) {
var queries = []; var queries = [];
for ( var entityName in entityMeta) { for (var entityName in entityMeta) {
if (entityMeta.hasOwnProperty(entityName)) { if (entityMeta.hasOwnProperty(entityName)) {
var meta = entityMeta[entityName]; var meta = entityMeta[entityName];
var rowDef = ''; var rowDef = '';
for ( var prop in meta.fields) { for (var prop in meta.fields) {
if (meta.fields.hasOwnProperty(prop)) { if (meta.fields.hasOwnProperty(prop)) {
rowDef += prop + " " + meta.fields[prop] + ", "; rowDef += prop + " " + meta.fields[prop] + ", ";
} }
} }
for ( var rel in meta.hasOne) { for (var rel in meta.hasOne) {
if (meta.hasOne.hasOwnProperty(rel)) { if (meta.hasOne.hasOwnProperty(rel)) {
var otherMeta = meta.hasOne[rel].type.meta; var otherMeta = meta.hasOne[rel].type.meta;
rowDef += rel + " VARCHAR(255), "; rowDef += rel + " VARCHAR(255), ";
Expand All @@ -117,7 +118,7 @@ var persistence = window.persistence || {};
+ "` ON `" + meta.name + "` (`" + rel + "`)", null ]); + "` ON `" + meta.name + "` (`" + rel + "`)", null ]);
} }
} }
for ( var rel in meta.hasMany) { for (var rel in meta.hasMany) {
if (meta.hasMany.hasOwnProperty(rel) && meta.hasMany[rel].manyToMany) { if (meta.hasMany.hasOwnProperty(rel) && meta.hasMany[rel].manyToMany) {
var tableName = meta.hasMany[rel].tableName; var tableName = meta.hasMany[rel].tableName;
if (!generatedTables[tableName]) { if (!generatedTables[tableName]) {
Expand Down Expand Up @@ -161,6 +162,16 @@ var persistence = window.persistence || {};
} }
}; };


/**
* Marks the object to be removed (on next flush)
* @param obj object to be removed
*/
persistence.remove = function(obj) {
if (!objectsToRemove[obj.id]) {
objectsToRemove[obj.id] = obj;
}
};

/** /**
* Persists all changes to the database * Persists all changes to the database
* *
Expand All @@ -174,24 +185,45 @@ var persistence = window.persistence || {};
persistence.transaction(function(tx) { persistence.flush(tx, callback); }); persistence.transaction(function(tx) { persistence.flush(tx, callback); });
return; return;
} }
var objArray = []; var persistObjArray = [];
for ( var id in trackedObjects) { for (var id in trackedObjects) {
if (trackedObjects.hasOwnProperty(id)) { if (trackedObjects.hasOwnProperty(id)) {
objArray.push(trackedObjects[id]); persistObjArray.push(trackedObjects[id]);
}
}
var removeObjArray = [];
for (var id in objectsToRemove) {
if (objectsToRemove.hasOwnProperty(id)) {
removeObjArray.push(objectsToRemove[id]);
delete trackedObjects[id]; // Stop tracking
} }
} }
function persistOneEntity () { function removeOneObject() {
var obj = objArray.pop(); var obj = removeObjArray.pop();
remove(obj, tx, function () {
if (removeObjArray.length > 0) {
removeOneObject();
} else if (callback) {
callback();
}
});
}
function persistOneObject () {
var obj = persistObjArray.pop();
save(obj, tx, function () { save(obj, tx, function () {
if (objArray.length > 0) { if (persistObjArray.length > 0) {
persistOneEntity(); persistOneObject();
} else if(removeObjArray.length > 0) {
removeOneObject();
} else if (callback) { } else if (callback) {
callback(); callback();
} }
}); });
} }
if (objArray.length > 0) { if (persistObjArray.length > 0) {
persistOneEntity(); persistOneObject();
} else if(removeObjArray.length > 0) {
removeOneObject();
} else if(callback) { } else if(callback) {
callback(); callback();
} }
Expand Down Expand Up @@ -528,8 +560,16 @@ var persistence = window.persistence || {};
} }


function remove (obj, tx, callback) { function remove (obj, tx, callback) {
var sql = "DELETE FROM `" + obj._type + "` WHERE id = '" + obj.id + "'"; var queries = [["DELETE FROM `" + obj._type + "` WHERE id = '" + obj.id + "'", null]];
tx.executeSql(sql, null, callback); var meta = persistence.getMeta(obj._type);
for (var rel in meta.hasMany) {
if (meta.hasMany.hasOwnProperty(rel) && meta.hasMany[rel].manyToMany) {
var tableName = meta.hasMany[rel].tableName;
//var inverseProperty = meta.hasMany[rel].inverseProperty;
queries.push(["DELETE FROM `" + tableName + "` WHERE `" + meta.name + '_' + rel + "` = '" + obj.id + "'", null]);
}
}
executeQueriesSeq(tx, queries, callback);
} }


/** /**
Expand All @@ -552,7 +592,7 @@ var persistence = window.persistence || {};
} else if (callback) { } else if (callback) {
callback.apply(this, callbackArgs); callback.apply(this, callbackArgs);
} }
}); }, function(_, err) { console.log(err); });
} }
if (queries.length > 0) { if (queries.length > 0) {
executeOne(); executeOne();
Expand Down

0 comments on commit 4941cd3

Please sign in to comment.