From: Jacob F. <lu...@us...> - 2004-07-02 00:26:09
|
Update of /cvsroot/neelix/neelix/model In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28236/model Modified Files: model.rb Log Message: Fixed so ingredients are immediately deleted from DB when removed from a recipe. They're instead orphaned and then the ingredient must be explicitly deleted (added Ingredient.delete). Also added checks so you can't perform operations on an ingredient that's been deleted from DB, in case a reference to is still floats around somewhere. Added quick method to delete all observers from an observable, gets called in ingredient deletion process to minimize the number of those lingering references. Index: model.rb =================================================================== RCS file: /cvsroot/neelix/neelix/model/model.rb,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- model.rb 29 Jun 2004 14:24:06 -0000 1.13 +++ model.rb 2 Jul 2004 00:25:58 -0000 1.14 @@ -17,6 +17,11 @@ @observers.delete(callback) end + # Delete all observer callbacks + def delete_all_observers( &callback ) + @observers = [] + end + protected # Notify the observers by executing the callbacks. def notify_observers @@ -150,40 +155,49 @@ end def recipe + raise "Operating on invalidated ingredient" if @id.nil? $replication.get('recipe',@dbh.select_one("select recipe_id from ingredient where ingredient_id=?",@id)['recipe_id']) end def measure + raise "Operating on invalidated ingredient" if @id.nil? $replicator.get('measure',@dbh.select_one("select measure_id from ingredient where ingredient_id=?",@id)['measure_id']) end def measure=(m) + raise "Operating on invalidated ingredient" if @id.nil? @dbh.do("update ingredient set measure_id=? where ingredient_id=?", m.id, @id) notify_observers m end def food + raise "Operating on invalidated ingredient" if @id.nil? $replicator.get('food',@dbh.select_one("select food_id from ingredient where ingredient_id=?",@id)['food_id']) end def food=(f) + raise "Operating on invalidated ingredient" if @id.nil? @dbh.do("update ingredient set food_id=? where ingredient_id=?", f.id, @id) notify_observers f end def quantity + raise "Operating on invalidated ingredient" if @id.nil? @dbh.select_one("select quantity from ingredient where ingredient_id=?",@id)['quantity'] end def quantity=(q) + raise "Operating on invalidated ingredient" if @id.nil? @dbh.do("update ingredient set quantity=? where ingredient_id=?", q, @id) notify_observers q end def modifier + raise "Operating on invalidated ingredient" if @id.nil? @dbh.select_one("select modifier from ingredient where ingredient_id=?",@id)['modifier'] end def modifier=(m) + raise "Operating on invalidated ingredient" if @id.nil? @dbh.do("update ingredient set modifier=? where ingredient_id=?", m, @id) notify_observers m @@ -191,9 +205,11 @@ # The position in the list of ingredients def position + raise "Operating on invalidated ingredient" if @id.nil? @dbh.select_one("select position from ingredient where ingredient_id=?",@id)['position'] end def position=(p) + raise "Operating on invalidated ingredient" if @id.nil? p2 = position if p2 != p then @dbh.do("update ingredient set position=? where ingredient_id=?", p, @id) @@ -203,14 +219,22 @@ end def to_s + raise "Operating on invalidated ingredient" if @id.nil? s = "#{quantity} #{measure} #{food}" m = modifier s += " (#{m})" if m return s end def <=>(other) + raise "Operating on invalidated ingredient" if @id.nil? self.position <=> other.position end + def delete + raise "Operating on invalidated ingredient" if @id.nil? + @dbh.do("delete from ingredient where ingredient_id=?",@id) + @id = nil + delete_all_observers + end end # A Recipe is a collection of ingredients and some metadata about the recipe. @@ -241,9 +265,11 @@ @dbh.do("update ingredient set recipe_id=? where ingredient_id=?",@id,ingredient.id) end - # remove any no longer used from the DB + # remove any no longer used from the recipe (ingredient is now + # orphaned, requires explicit deletion by party that removed it, + # unless only being moved. Vacuuming will catch any refugees) (old_ingredients - @ingredients).each do |ingredient| - @dbh.do("delete from ingredient where ingredient_id=?",ingredient.id) + @dbh.do("update ingredient set recipe_id=? where ingredient_id=?", nil, ingredient.id) end } @ingredients.each { |i| i.add_observer { @ingredients.notify_observers } } |