aboutsummaryrefslogtreecommitdiff
path: root/src/guff/database.cr
diff options
context:
space:
mode:
Diffstat (limited to 'src/guff/database.cr')
-rw-r--r--src/guff/database.cr141
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