diff options
author | Jamis Buck <jamis@37signals.com> | 2007-01-30 00:07:47 +0000 |
---|---|---|
committer | Jamis Buck <jamis@37signals.com> | 2007-01-30 00:07:47 +0000 |
commit | a1472f5339fb163b0ca5a330c8c599e51f0468f0 (patch) | |
tree | 8bd8363035d2adbc459d4752c7debd178a3bf134 /lib/sqlite3 | |
parent | 5f4b8ddb1e2f9a36d5d1408c4630a63df49e8aa5 (diff) | |
download | third_party-sqlite3-ruby-a1472f5339fb163b0ca5a330c8c599e51f0468f0.tar.gz third_party-sqlite3-ruby-a1472f5339fb163b0ca5a330c8c599e51f0468f0.tar.xz third_party-sqlite3-ruby-a1472f5339fb163b0ca5a330c8c599e51f0468f0.zip |
make the table_info method adjust the returned default value for the rows so that the sqlite3 change in 3.3.8 and greater can be handled transparently
Diffstat (limited to 'lib/sqlite3')
-rw-r--r-- | lib/sqlite3/pragmas.rb | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/lib/sqlite3/pragmas.rb b/lib/sqlite3/pragmas.rb index 7247387..20b3180 100644 --- a/lib/sqlite3/pragmas.rb +++ b/lib/sqlite3/pragmas.rb @@ -246,9 +246,56 @@ module SQLite3 end def table_info( table, &block ) # :yields: row - get_query_pragma "table_info", table, &block + columns, *rows = execute2("PRAGMA table_info(#{table})") + + needs_tweak_default = version_compare(driver.libversion, "3.3.7") > 0 + + result = [] unless block_given? + rows.each do |row| + new_row = {} + columns.each_with_index do |name, index| + new_row[name] = row[index] + end + + tweak_default(new_row) if needs_tweak_default + + if block_given? + yield new_row + else + result << new_row + end + end + + result end - + + private + + # Compares two version strings + def version_compare(v1, v2) + v1 = v1.split(".").map { |i| i.to_i } + v2 = v2.split(".").map { |i| i.to_i } + parts = [v1.length, v2.length].max + v1.push 0 while v1.length < parts + v2.push 0 while v2.length < parts + v1.zip(v2).each do |a,b| + return -1 if a < b + return 1 if a > b + end + return 0 + end + + # Since SQLite 3.3.8, the table_info pragma has returned the default + # value of the row as a quoted SQL value. This method essentially + # unquotes those values. + def tweak_default(hash) + case hash["dflt_value"] + when /^null$/i then + hash["dflt_value"] = nil + when /^'(.*)'$/ + hash["dflt_value"] = $1.gsub(/''/, "'") + end + end end end |