rhubarb 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES CHANGED
@@ -1,4 +1,13 @@
1
- version 0.2.2
1
+ version 0.2.3
2
+
3
+ * Rhubarb now uses prepared statements almost exclusively. This
4
+ should result in an appreciable speedup (I observed around 10% on
5
+ the test suite; a large rhubarb-based application I have previously
6
+ spent over 12% of runtime preparing one-off statemtents).
7
+
8
+ * Fixed a crashing bug introduced in 0.2.2.
9
+
10
+ version 0.2.2 (8859efbbbca5e80d64e3bd8e6e5ba2ffd8a3e83d)
2
11
 
3
12
  * explicit support for :blob-typed columns (blob values will be
4
13
  appropriately stored in create statements and attribute assignments).
data/TODO CHANGED
@@ -4,7 +4,6 @@
4
4
  * Bring code coverage up to 100%
5
5
  * Documentation
6
6
  * Standalone examples (i.e. not just "please see the test suite")
7
- * Resolve issues related to using prepared statements
8
7
  * Find rows by value of blob-valued field
9
8
  * Automatic zlib compression of blobs (:zblob type)
10
9
  * Automatic yaml serialization of arbitrary Ruby objects (:rubyobj type)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.2.3
@@ -53,13 +53,18 @@ module Rhubarb
53
53
  valid_cols = self.colnames.intersection arg_hash.keys
54
54
  select_criteria = valid_cols.map {|col| "#{col.to_s} = #{col.inspect}"}.join(" AND ")
55
55
  arg_hash.each {|k,v| arg_hash[k] = v.row_id if v.respond_to? :row_id}
56
-
57
- self.db.execute("select * from #{table_name} where #{select_criteria} order by row_id", arg_hash).map {|tup| self.new(tup) }
56
+ find_by_text = "select * from #{table_name} where #{select_criteria} order by row_id"
57
+ find_by_stmt = (db.stmts[find_by_text] ||= db.prepare(find_by_text))
58
+ find_by_stmt.execute!(arg_hash).map {|tup| self.new(tup) }
58
59
  end
59
60
 
60
61
  # Does what it says on the tin. Since this will allocate an object for each row, it isn't recomended for huge tables.
61
62
  def find_all
62
- self.db.execute("SELECT * from #{table_name}").map {|tup| self.new(tup)}
63
+ results = []
64
+ find_all_text = "SELECT * from #{table_name}"
65
+ find_all_stmt = (db.stmts[find_all_text] ||= db.prepare(find_all_text))
66
+ find_all_stmt.execute! {|tup| results << self.new(tup)}
67
+ results
63
68
  end
64
69
 
65
70
  def delete_all
@@ -78,8 +83,10 @@ module Rhubarb
78
83
  define_method name.to_s do |*args|
79
84
  # handle reference parameters
80
85
  args = args.map {|arg| Util::rhubarb_fk_identity(arg)}
81
-
82
- res = self.db.execute(query.gsub("__TABLE__", "#{self.table_name}"), args)
86
+ cq_text = query.gsub("__TABLE__", "#{self.table_name}")
87
+ cq_stmt = (db.stmts[cq_text] ||= db.prepare(cq_text))
88
+
89
+ res = cq_stmt.execute!(args)
83
90
  res.map {|row| self.new(row) }
84
91
  end
85
92
  end
@@ -212,8 +219,9 @@ module Rhubarb
212
219
  new_row[column] = colkinds[column] == :blob ? Util::blobify(value) : Util::rhubarb_fk_identity(value)
213
220
  end
214
221
 
215
- stmt = "insert into #{table_name} (#{colspec}) values (#{valspec})"
216
- db.execute(stmt, new_row)
222
+ create_text = "insert into #{table_name} (#{colspec}) values (#{valspec})"
223
+ create_stmt = (self.db.stmts[create_text] ||= db.prepare(create_text))
224
+ create_stmt.execute!(new_row)
217
225
  res = find(db.last_insert_row_id)
218
226
 
219
227
  res
@@ -272,11 +280,11 @@ module Rhubarb
272
280
  self.db.get_first_value("select count(row_id) from #{table_name}").to_i
273
281
  end
274
282
 
275
- def find_tuple(id)
276
- self.db.get_first_row("select * from #{table_name} where row_id = ?", id)
283
+ def find_tuple(tid)
284
+ self.db.get_first_row("select * from #{table_name} where row_id = ?", tid)
277
285
  end
278
286
 
279
287
  include FindFreshest
280
288
 
281
289
  end
282
- end
290
+ end
@@ -24,6 +24,13 @@ module Rhubarb
24
24
  def setup_db(db)
25
25
  db.results_as_hash = true
26
26
  db.type_translation = true
27
+ db.busy_timeout(150)
28
+ class << db
29
+ def stmts
30
+ @rhubarb_stmts ||= {}
31
+ @rhubarb_stmts
32
+ end
33
+ end
27
34
  end
28
35
  end
29
36
 
@@ -34,9 +41,11 @@ module Rhubarb
34
41
  end
35
42
 
36
43
  def self.close(which=:default)
37
- if dbs[which]
38
- dbs[which].close
44
+ current_db = dbs[which]
45
+ if current_db
39
46
  dbs.delete(which)
47
+ current_db.stmts.values.each {|pstmt| pstmt.close }
48
+ current_db.close
40
49
  end
41
50
  end
42
51
 
@@ -37,7 +37,7 @@ module Rhubarb
37
37
 
38
38
  def hash
39
39
  freshen
40
- @row_id ^ self.table_name.hash
40
+ @row_id ^ self.class.table_name.hash
41
41
  end
42
42
 
43
43
  def ==(other)
@@ -62,7 +62,9 @@ module Rhubarb
62
62
  # Deletes the row corresponding to this object from the database;
63
63
  # invalidates =self= and any other objects backed by this row
64
64
  def delete
65
- self.db.execute("delete from #{self.class.table_name} where row_id = ?", @row_id)
65
+ delete_text = "delete from #{self.class.table_name} where row_id = ?"
66
+ delete_stmt = (self.db.stmts[delete_text] ||= self.db.prepare(delete_text))
67
+ delete_stmt.execute!(@row_id)
66
68
  mark_dirty
67
69
  @tuple = nil
68
70
  @row_id = nil
@@ -110,7 +112,10 @@ module Rhubarb
110
112
  # Helper method to update the row in the database when one of our fields changes
111
113
  def update(attr_name, value)
112
114
  mark_dirty
113
- self.db.execute("update #{self.class.table_name} set #{attr_name} = ?, updated = ? where row_id = ?", value, Util::timestamp, @row_id)
115
+
116
+ update_text = "update #{self.class.table_name} set #{attr_name} = ?, updated = ? where row_id = ?"
117
+ update_stmt = (self.db.stmts[update_text] ||= self.db.prepare(update_text))
118
+ update_stmt.execute!(value, Util::timestamp, @row_id)
114
119
  end
115
120
 
116
121
  # Resolve any fields that reference other tables, replacing row ids with referred objects
@@ -129,4 +134,4 @@ module Rhubarb
129
134
  end
130
135
 
131
136
  end
132
- end
137
+ end
@@ -11,7 +11,6 @@
11
11
  #
12
12
  # http://www.apache.org/licenses/LICENSE-2.0
13
13
 
14
- require 'rubygems'
15
14
  require 'set'
16
15
  require 'sqlite3'
17
16
  require 'rhubarb/util'
data/ruby-rhubarb.spec.in CHANGED
@@ -1,5 +1,5 @@
1
1
  %{!?ruby_sitelib: %global ruby_sitelib %(ruby -rrbconfig -e 'puts Config::CONFIG["sitelibdir"] ')}
2
- %define rel 0.1
2
+ %define rel 1.0
3
3
 
4
4
  Summary: Simple versioned object-graph persistence layer
5
5
  Name: ruby-rhubarb
@@ -48,6 +48,12 @@ rm -rf %{buildroot}
48
48
  %{ruby_sitelib}/rhubarb/persistence.rb
49
49
 
50
50
  %changelog
51
+ * Thu Feb 25 2010 willb <willb@redhat> - 0.2.3-1.0
52
+ * updated to version 0.2.3 from source
53
+
54
+ * Thu Feb 25 2010 willb <willb@redhat> - 0.2.2-2.0
55
+ * removed rubygems include
56
+
51
57
  * Fri Feb 5 2010 <rrat@redhat> - 0.2.0-0.3
52
58
  - Explicitly list files
53
59
  - Added ruby(abi) and dependency
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rhubarb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - William Benton
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-02-22 00:00:00 -06:00
12
+ date: 2010-02-26 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency