diff options
Diffstat (limited to 'src/guff/database.cr')
-rw-r--r-- | src/guff/database.cr | 141 |
1 files changed, 48 insertions, 93 deletions
diff --git a/src/guff/database.cr b/src/guff/database.cr index e94a085..67a7a1a 100644 --- a/src/guff/database.cr +++ b/src/guff/database.cr @@ -4,60 +4,28 @@ module Guff class Database < ::SQLite3::Database SQL = { table_exists: " - SELECT tbl_name + SELECT name FROM sqlite_master WHERE type = 'table' - AND tbl_name = ? + AND name = ? ", } - # TODO (add table_exists?) - def table_exists?(table_name : String) - one(SQL[:table_exists], [table_name]) == table_name + def table_exists?(table : String) : Bool + one(SQL[:table_exists], [table]) == table end def one( - sql : String - ) - r = nil - - run(sql).execute do |rs| - if rs.next - # FIXME - r = rs[0] - end - end - - # return result - r - end - - def one( - sql : String, - args : Array(String) | Hash(String, String) + sql : String, + args = nil : Array(String) | Hash(String, String) | Nil ) r = nil - run(sql, args).execute do |rs| + run(sql, args) do |rs| if rs.next - # FIXME - r = rs[0] - end - end - - # return result - r - end - - def row(sql : String) - r = nil - - # exec query - run(sql).execute do |rs| - if rs.next - r = to_row(rs) + r = rs[0] as String end end @@ -66,16 +34,14 @@ module Guff end def row( - sql : String, - args : Array(String) | Hash(String, String) + sql : String, + args = nil : Array(String) | Hash(String, String) | Nil ) r = nil # exec query - run(sql, args).execute do |rs| - if rs.next - r = to_row(rs) - end + run(sql, args) do |rs| + r = to_row(rs) if rs.next end # return result @@ -83,10 +49,12 @@ module Guff end def all( - sql : String, - &block : Proc(Hash(String, ::SQLite3::Value), Nil) \ + sql : String, + args = nil : Array(String) | Hash(String, String) | Nil, + &block : Proc(Hash(String, ::SQLite3::Value), Nil) \ ) - run(sql).execute do |rs| + # build statement + run(sql, args) do |rs| # walk results while rs.next # build row and pass it to callback @@ -94,79 +62,66 @@ module Guff end end - # close statement, return nil nil end - def all( - sql : String, - args : Array(String) | Hash(String, String), - &block : Proc(Hash(String, ::SQLite3::Value), Nil) \ + def query( + sql : String ) - # build statement - run(sql, args).execute do |rs| - # walk results - while rs.next - # build row and pass it to callback - block.call(to_row(rs)) - end + run(sql, nil) do |rs| + # make sure query executes + rs.next + nil end + end - nil + # + # NOTE: if you pass a block, be sure to call rs.next at least once, + # or the query will _not_ execute!!! + # + def query( + sql : String, + args = nil : Array(String) | Hash(String, String) | Nil, + &block : Proc(::SQLite3::ResultSet, Nil) \ + ) + run(sql, args, &block) end def transaction(&block) query("BEGIN") - block.call(self) + block.call query("COMMIT") end - private def run(sql : String) - # build statement - prepare(sql) - end - private def run( sql : String, - args : Array(String)? + args : Hash(String, String), + &block : Proc(::SQLite3::ResultSet, Nil) \ ) - # build statement - st = prepare(sql) - - # bind args - if args && args.size > 0 - args.each_with_index do |val, i| - st[i + 1] = val - end - end - - # return result - st + run(sql, [args], &block) end private def run( - sql : String, - args : Hash(String, String)? + sql : String, + args = nil : Array(String | Hash(String, String))?, + &block : Proc(::SQLite3::ResultSet, Nil) \ ) # build statement st = prepare(sql) - # bind args + # exec and close statement if args && args.size > 0 - st[0] = args + st.execute(args, &block) + else + st.execute(&block) end # return result - st + nil end - private def to_row(rs : SQLite3::ResultSet) : Hash(String, ::SQLite3::Value) - 0.upto(rs.column_count).inject( - {} of String => ::SQLite3::Value - ) do |r, i| - r[rs.columns[i]] = r[i] - r - end + private def to_row(rs) + Hash(String, ::SQLite3::Value).zip(rs.columns, rs.to_a) end end end |