diff --git a/chrome/chromeFiles/content/scholar/xpcom/data_access.js b/chrome/chromeFiles/content/scholar/xpcom/data_access.js index e4dd09dda..58d050efd 100644 --- a/chrome/chromeFiles/content/scholar/xpcom/data_access.js +++ b/chrome/chromeFiles/content/scholar/xpcom/data_access.js @@ -350,18 +350,23 @@ Scholar.Item.prototype.save = function(){ // var sql = "UPDATE items SET "; var sql2; + var sqlValues = []; if (this._changed.has('itemTypeID')){ - sql += "itemTypeID='" + this.getField('itemTypeID') + "', "; + sql += "itemTypeID=?, "; + sqlValues.push({'int':this.getField('itemTypeID')}); } if (this._changed.has('title')){ - sql += "title='" + this.getField('title') + "', "; + sql += "title=?, "; + sqlValues.push({'string':this.getField('title')}); } // Always update modified time sql += "dateModified=CURRENT_TIMESTAMP "; - sql += "WHERE itemID=" + this.getID() + ";\n"; + sql += "WHERE itemID=?;\n"; + sqlValues.push({'int':this.getID()}); + Scholar.DB.query(sql, sqlValues); // // Creators @@ -403,25 +408,40 @@ Scholar.Item.prototype.save = function(){ + ' AND orderIndex=' + orderIndex; if (Scholar.DB.valueQuery(sql2)){ - sql += 'UPDATE itemCreators SET ' - + 'creatorID=' + creatorID +', ' - + 'creatorTypeID=' + creator['creatorTypeID'] + ' ' - + 'WHERE itemID=' + this.getID() - + ' AND orderIndex=' + orderIndex + ";\n"; + sql = 'UPDATE itemCreators SET creatorID=?, ' + + 'creatorTypeID=? WHERE itemID=?' + + " AND orderIndex=?;\n"; + + sqlValues = [ + {'int':creatorID}, + {'int':creator['creatorTypeID']}, + {'int':this.getID()}, + {'int':orderIndex} + ]; + + Scholar.DB.query(sql, sqlValues); } // Otherwise insert else { - sql += 'INSERT INTO itemCreators VALUES (' - + itemID + ', ' + creatorID + ', ' - + creator['creatorTypeID'] + ', ' + orderIndex - + ");\n"; + sql = "INSERT INTO itemCreators VALUES (?,?,?,?);\n"; + + sqlValues = [ + {'int':itemID}, + {'int':creatorID}, + {'int':creator['creatorTypeID']}, + {'int':orderIndex} + ]; + + Scholar.DB.query(sql, sqlValues); } } // Append the SQL to delete obsolete creators // // TODO: fix this so it actually purges the internal memory - sql += Scholar.Creators.purge(true) + "\n"; + if (sql = Scholar.Creators.purge(true)){ + Scholar.DB.query(sql); + } } @@ -438,28 +458,41 @@ Scholar.Item.prototype.save = function(){ + ' AND fieldID=' + fieldID; if (Scholar.DB.valueQuery(sql2)){ - sql += "UPDATE itemData SET value="; + sqlValues = []; + + sql = "UPDATE itemData SET value=?"; // Take advantage of SQLite's manifest typing if (Scholar.ItemFields.isInteger(fieldID)){ - sql += this.getField(fieldID); + sqlValues.push({'int':this.getField(fieldID)}); } else { - sql += "'" + this.getField(fieldID) + "'"; + sqlValues.push({'string':this.getField(fieldID)}); } - sql += " WHERE itemID=" + this.getID() - + ' AND fieldID=' + fieldID + ";\n"; + sql += " WHERE itemID=? AND fieldID=?;\n"; + + sqlValues.push( + {'int':this.getID()}, + {'int':fieldID} + ); + + Scholar.DB.query(sql, sqlValues); } else { - sql += 'INSERT INTO itemData VALUES (' - + this.getID() + ',' + fieldID + ','; + sql = "INSERT INTO itemData VALUES (?,?,?);\n"; + sqlValues = [ + {'int':this.getID()}, + {'int':fieldID}, + ]; + if (Scholar.ItemFields.isInteger(fieldID)){ - sql += this.getField(fieldID); + sqlValues.push({'int':this.getField(fieldID)}); } else { - sql += "'" + this.getField(fieldID) + "'"; + sqlValues.push({'string':this.getField(fieldID)}); } - sql += ");\n"; + + Scholar.DB.query(sql, sqlValues); } } // If field changed and is empty, mark row for deletion @@ -470,14 +503,13 @@ Scholar.Item.prototype.save = function(){ // Delete blank fields if (del.length){ - sql += 'DELETE from itemData ' + sql = 'DELETE from itemData ' + 'WHERE itemID=' + this.getID() + ' ' + 'AND fieldID IN (' + del.join() + ");\n"; + Scholar.DB.query(sql); } } - - Scholar.DB.query(sql); Scholar.DB.commitTransaction(); } catch (e){ @@ -528,24 +560,33 @@ Scholar.Item.prototype.save = function(){ // Set itemData if (this._changedItemData.length){ sql = ''; + sqlValues = []; + for (fieldID in this._changedItemData.items){ if (!this.getField(fieldID)){ continue; } - sql += 'INSERT INTO itemData VALUES (' + - itemID + ',' + fieldID + ','; - if (Scholar.ItemFields.isInteger(fieldID)){ - sql += this.getField(fieldID); - } - else { - sql += "'" + this.getField(fieldID) + "'"; - } - sql += ");\n"; + // TODO: update DB methods so that this can be + // implemented as a prepared statement that gets + // called multiple times + sql += "INSERT INTO itemData VALUES (?,?,?);\n"; + + sqlValues.push( + {'int':itemID}, + {'int':fieldID} + ); + + if (Scholar.ItemFields.isInteger(fieldID)){ + sqlValues.push({'int':this.getField(fieldID)}); + } + else { + sqlValues.push({'string':this.getField(fieldID)}); + } } if (sql){ - Scholar.DB.query(sql); + Scholar.DB.query(sql, sqlValues); } }