[Nitro] Sqlite bug fix patch for og 0.18.1

Ghislain Mary nospam at lunacymaze.org
Wed Jun 1 17:09:08 EDT 2005


I found a bug, still in the sqlite store. Here's a little program that 
shows the wrong behaviour:


require 'og'

# Enables debug.
$DBG = true

# A class representing a blog Entry.
class Entry

   property :title, String
   property :body, String

   has_many :comments, Comment

   def initialize(body = nil)
     @body = body
   end

   def to_s
     @body
   end

end


# A class representing a Comment to a blog Entry.
class Comment

   property :body, String

   belongs_to Entry

   def initialize(body = nil)
     @body = body
   end

   def to_s
     @body
   end

end



# Initializes Og.
manager = Og.setup(
   :destroy  => true,   # Destroy tables created from earlier runs.
   :store    => 'sqlite',
   :name     => 'ogtest'
)


# Create an Entry.
e1 = Entry.create('Body1')
p e1

# Test the creation of a Comment.
c1 = Comment.create('Comment1')
p c1

# Attach a Comment to an Entry.
c1.entry = e1
c1.save


The problem here is that when created, the Entry has an oid of 0 whereas 
in the database the oid for this row is 1. So the attachement of a 
Comment to the Entry has no effect because refering an unknown Entry.
Here is a patch incorporating the last one, fixing this problem and also 
enabling the printing of queries when debug is on:


diff -ru og-0.18.1/lib/og/store/sqlite.rb 
og-0.18.1-modified/lib/og/store/sqlite.rb
--- og-0.18.1/lib/og/store/sqlite.rb    Fri May 20 13:52:50 2005
+++ og-0.18.1-modified/lib/og/store/sqlite.rb   Wed Jun  1 23:00:06 2005
@@ -14,6 +14,7 @@

  class SQLite3::ResultSet
         alias_method :blank?, :eof?
+       alias_method :fields, :columns

         def each_row
                 each do |row|
@@ -96,6 +97,10 @@
                 @conn.rollback if @transaction_nesting < 1
         end

+        def last_insert_rowid
+                conn.query("SELECT last_insert_rowid()").first_value.to_i
+        end
+
  private

         def create_table(klass)
@@ -182,8 +187,8 @@
                 klass.class_eval %{
                         def og_insert(store)
                                 #{Aspects.gen_advice_code(:og_insert, 
klass.advices, :pre) if klass.respond_to?(:advices)}
-                               store.conn.query("#{sql}").close
-                               @#{pk} = store.conn.last_insert_row_id
+                               store.query("#{sql}").close
+                               @#{pk} = store.last_insert_rowid
                                 #{Aspects.gen_advice_code(:og_insert, 
klass.advices, :post) if klass.respond_to?(:advices)}
                         end
                 }


Ghislain



More information about the Nitro-general mailing list