From 94d6f77a1396257647caaf4a0cd8a5afcf0d22d4 Mon Sep 17 00:00:00 2001 From: eliasjpr Date: Wed, 4 Dec 2024 20:58:43 -0500 Subject: [PATCH] Refactor database interaction to use exec_query method and add schema structure dump functionality --- spec/schema_spec.cr | 9 +++++++++ src/delete.cr | 4 +++- src/insert.cr | 8 ++++++-- src/query.cr | 20 +++++++++++++++----- src/schema.cr | 30 ++++++++++++++++++++++++------ src/update.cr | 4 +++- 6 files changed, 60 insertions(+), 15 deletions(-) create mode 100644 spec/schema_spec.cr diff --git a/spec/schema_spec.cr b/spec/schema_spec.cr new file mode 100644 index 0000000..4882338 --- /dev/null +++ b/spec/schema_spec.cr @@ -0,0 +1,9 @@ +require "./spec_helper" + +describe CQL::Schema do + it "dumps database structure" do + Example.dump_structure + + File.exists?("db/structure.sql").should eq(true) + end +end diff --git a/src/delete.cr b/src/delete.cr index 154af07..4660019 100644 --- a/src/delete.cr +++ b/src/delete.cr @@ -43,7 +43,9 @@ module CQL # ``` def commit query, params = to_sql - @schema.db.exec query, args: params + @schame.exec_query do |db| + db.exec query, args: params + end end # Generates the SQL query and parameters diff --git a/src/insert.cr b/src/insert.cr index 537ac0a..d84d4cf 100644 --- a/src/insert.cr +++ b/src/insert.cr @@ -60,7 +60,9 @@ module CQL # Reset to ensure nothing else but the :id is returned @back = Array(Expression::Column).new query, params = back(:id).to_sql - @schema.db.query_one(query, args: params, as: type) + @schame.exec_query do |db| + db.query_one(query, args: params, as: type) + end else commit.last_insert_id end @@ -85,7 +87,9 @@ module CQL # ``` def commit query, params = to_sql - @schema.db.exec(query, args: params) + @schame.exec_query do |db| + db.exec(query, args: params) + end rescue ex Log.error { "Insert failed: #{ex.message}" } raise ex diff --git a/src/query.cr b/src/query.cr index 8bd7802..8e01a21 100644 --- a/src/query.cr +++ b/src/query.cr @@ -66,7 +66,11 @@ module CQL # ``` def all(as as_kind) query, params = to_sql - as_kind.from_rs @schema.db.query(query, args: params) + as_kind.from_rs + + @schame.exec_query do |db| + db.query(query, args: params) + end end # - **@param** as [Type] The type to cast the results to @@ -101,7 +105,9 @@ module CQL def first(as as_kind) query, params = to_sql Log.debug { "Query: #{query}, Params: #{params}" } - @schema.db.query_one(query, args: params, as: as_kind) + @schame.exec_query do |db| + db.query_one(query, args: params, as: as_kind) + end end # - **@param** as [Type] The type to cast the result to @@ -133,7 +139,9 @@ module CQL # ``` def get(as as_kind) query, params = to_sql - @schema.db.scalar(query, args: params, as: as_kind) + @schame.exec_query do |db| + db.scalar(query, args: params, as: as_kind) + end end # Iterates over each result and yields it to the provided block. @@ -147,8 +155,10 @@ module CQL # ``` def each(as as_kind, &) query, params = to_sql - @schema.db.query_each(query, args: params) do |result| - yield as_kind.from_rs(result) + @schame.exec_query do |db| + db.query_each(query, args: params) do |result| + yield as_kind.from_rs(result) + end end end diff --git a/src/schema.cr b/src/schema.cr index 114da06..65f0a2b 100644 --- a/src/schema.cr +++ b/src/schema.cr @@ -86,7 +86,6 @@ module CQL # schema = CQL::Schema.new(:northwind, "sqlite3://db.sqlite3") # ``` def initialize(@name : Symbol, @uri : String, @adapter : Adapter = Adapter::SQLite, @version : String = "1.0") - @db = DB.connect(@uri) @gen = Expression::Generator.new(@adapter) end @@ -114,10 +113,17 @@ module CQL # schema.exec("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)") # ``` def exec(sql : String) - @db.transaction do |tx| - cnn = tx.connection - cnn.exec(sql) - end + db = DB.open(@uri) + db.exec(sql) + ensure + db.close + end + + def exec_query(&) + db = DB.open(@uri) + yield db + ensure + db.close end # Creates a new query for the schema. @@ -234,7 +240,19 @@ module CQL # ``` # schema.dump_structure("db/structure.sql") # ``` - def dump_structure + def dump_structure(file = "db/structure.sql") + Dir.mkdir_p(File.dirname(file)) + + tables_structure = @tables.map do |_, table| + String.build do |str| + str << "-- Table: #{table.table_name}\n\n" + str << "-- Primary Key: #{table.primary.name} - Type: #{table.primary.type} \n\n" + str << table.create_sql + str << "\n\n" + end + end.join("\n") + + File.write(file, tables_structure) end macro method_missing(call) diff --git a/src/update.cr b/src/update.cr index d0c44a5..e0740ba 100644 --- a/src/update.cr +++ b/src/update.cr @@ -48,7 +48,9 @@ module CQL # ``` def commit query, params = to_sql - @schema.db.exec query, args: params + @schame.exec_query do |db| + db.exec query, args: params + end end # Generates the SQL query and parameters.