baza 0.0.20 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +84 -0
- data/.rubocop_todo.yml +17 -135
- data/.travis.yml +21 -0
- data/Gemfile +10 -7
- data/Gemfile.lock +39 -44
- data/README.md +61 -3
- data/VERSION +1 -1
- data/baza.gemspec +146 -98
- data/config/best_project_practice_rubocop.yml +8 -0
- data/config/best_project_practice_rubocop_todo.yml +6 -0
- data/lib/baza.rb +8 -12
- data/lib/baza/base_sql_driver.rb +198 -52
- data/lib/baza/cloner.rb +1 -0
- data/lib/baza/column.rb +26 -0
- data/lib/baza/database.rb +19 -3
- data/lib/baza/db.rb +69 -271
- data/lib/baza/driver.rb +1 -6
- data/lib/baza/{drivers → driver}/active_record.rb +65 -21
- data/lib/baza/{drivers → driver}/active_record/columns.rb +0 -0
- data/lib/baza/driver/active_record/commands.rb +10 -0
- data/lib/baza/driver/active_record/databases.rb +10 -0
- data/lib/baza/{drivers → driver}/active_record/indexes.rb +0 -0
- data/lib/baza/{drivers → driver}/active_record/result.rb +3 -1
- data/lib/baza/{drivers → driver}/active_record/tables.rb +0 -0
- data/lib/baza/driver/active_record/users.rb +12 -0
- data/lib/baza/{drivers → driver}/mysql.rb +9 -26
- data/lib/baza/{drivers → driver}/mysql/column.rb +14 -35
- data/lib/baza/{drivers → driver}/mysql/columns.rb +9 -12
- data/lib/baza/driver/mysql/commands.rb +39 -0
- data/lib/baza/driver/mysql/database.rb +64 -0
- data/lib/baza/driver/mysql/databases.rb +63 -0
- data/lib/baza/{drivers → driver}/mysql/index.rb +0 -0
- data/lib/baza/{drivers → driver}/mysql/indexes.rb +0 -0
- data/lib/baza/{drivers → driver}/mysql/result.rb +15 -7
- data/lib/baza/{drivers → driver}/mysql/sqlspecs.rb +0 -0
- data/lib/baza/{drivers → driver}/mysql/table.rb +27 -43
- data/lib/baza/{drivers → driver}/mysql/tables.rb +5 -34
- data/lib/baza/{drivers → driver}/mysql/unbuffered_result.rb +8 -2
- data/lib/baza/driver/mysql/user.rb +22 -0
- data/lib/baza/driver/mysql/users.rb +39 -0
- data/lib/baza/{drivers → driver}/mysql2.rb +19 -49
- data/lib/baza/{drivers → driver}/mysql2/column.rb +0 -0
- data/lib/baza/{drivers → driver}/mysql2/columns.rb +0 -0
- data/lib/baza/driver/mysql2/commands.rb +2 -0
- data/lib/baza/{drivers → driver}/mysql2/database.rb +0 -0
- data/lib/baza/{drivers → driver}/mysql2/databases.rb +0 -0
- data/lib/baza/{drivers → driver}/mysql2/index.rb +0 -0
- data/lib/baza/{drivers → driver}/mysql2/indexes.rb +0 -0
- data/lib/baza/{drivers → driver}/mysql2/result.rb +3 -1
- data/lib/baza/{drivers → driver}/mysql2/table.rb +0 -0
- data/lib/baza/{drivers → driver}/mysql2/tables.rb +0 -0
- data/lib/baza/driver/mysql2/user.rb +2 -0
- data/lib/baza/driver/mysql2/users.rb +2 -0
- data/lib/baza/{drivers → driver}/mysql_java.rb +60 -38
- data/lib/baza/{drivers → driver}/mysql_java/column.rb +0 -0
- data/lib/baza/{drivers → driver}/mysql_java/columns.rb +0 -0
- data/lib/baza/driver/mysql_java/commands.rb +2 -0
- data/lib/baza/driver/mysql_java/database.rb +2 -0
- data/lib/baza/driver/mysql_java/databases.rb +2 -0
- data/lib/baza/{drivers → driver}/mysql_java/index.rb +0 -0
- data/lib/baza/{drivers → driver}/mysql_java/indexes.rb +0 -0
- data/lib/baza/{drivers → driver}/mysql_java/table.rb +0 -0
- data/lib/baza/{drivers → driver}/mysql_java/tables.rb +0 -0
- data/lib/baza/driver/mysql_java/user.rb +2 -0
- data/lib/baza/driver/mysql_java/users.rb +2 -0
- data/lib/baza/driver/pg.rb +80 -0
- data/lib/baza/driver/pg/column.rb +125 -0
- data/lib/baza/driver/pg/columns.rb +37 -0
- data/lib/baza/driver/pg/commands.rb +35 -0
- data/lib/baza/driver/pg/create_index_sql_creator.rb +51 -0
- data/lib/baza/driver/pg/database.rb +89 -0
- data/lib/baza/driver/pg/databases.rb +79 -0
- data/lib/baza/driver/pg/index.rb +35 -0
- data/lib/baza/driver/pg/indexes.rb +5 -0
- data/lib/baza/driver/pg/result.rb +139 -0
- data/lib/baza/driver/pg/table.rb +184 -0
- data/lib/baza/driver/pg/tables.rb +45 -0
- data/lib/baza/{drivers → driver}/sqlite3.rb +6 -24
- data/lib/baza/{drivers → driver}/sqlite3/column.rb +22 -24
- data/lib/baza/{drivers → driver}/sqlite3/columns.rb +6 -6
- data/lib/baza/driver/sqlite3/commands.rb +28 -0
- data/lib/baza/{drivers → driver}/sqlite3/database.rb +0 -0
- data/lib/baza/{drivers → driver}/sqlite3/databases.rb +0 -1
- data/lib/baza/{drivers → driver}/sqlite3/index.rb +0 -0
- data/lib/baza/{drivers → driver}/sqlite3/indexes.rb +0 -0
- data/lib/baza/{drivers → driver}/sqlite3/result.rb +14 -6
- data/lib/baza/{drivers → driver}/sqlite3/sqlspecs.rb +0 -0
- data/lib/baza/{drivers → driver}/sqlite3/table.rb +25 -16
- data/lib/baza/{drivers → driver}/sqlite3/tables.rb +5 -6
- data/lib/baza/{drivers → driver}/sqlite3/unbuffered_result.rb +8 -2
- data/lib/baza/{drivers → driver}/sqlite3_java.rb +13 -23
- data/lib/baza/{drivers → driver}/sqlite3_java/column.rb +0 -0
- data/lib/baza/{drivers → driver}/sqlite3_java/columns.rb +0 -0
- data/lib/baza/driver/sqlite3_java/commands.rb +2 -0
- data/lib/baza/{drivers → driver}/sqlite3_java/database.rb +0 -0
- data/lib/baza/{drivers → driver}/sqlite3_java/index.rb +0 -0
- data/lib/baza/{drivers → driver}/sqlite3_java/indexes.rb +0 -0
- data/lib/baza/{drivers → driver}/sqlite3_java/table.rb +0 -0
- data/lib/baza/{drivers → driver}/sqlite3_java/tables.rb +0 -0
- data/lib/baza/{drivers → driver}/sqlite3_java/unbuffered_result.rb +14 -9
- data/lib/baza/{drivers → driver}/sqlite3_rhodes.rb +6 -24
- data/lib/baza/errors.rb +2 -0
- data/lib/baza/idquery.rb +15 -8
- data/lib/baza/index.rb +7 -0
- data/lib/baza/jdbc_driver.rb +4 -16
- data/lib/baza/jdbc_result.rb +20 -12
- data/lib/baza/mysql_base_driver.rb +7 -7
- data/lib/baza/query_buffer.rb +20 -19
- data/lib/baza/row.rb +16 -16
- data/lib/baza/sql_queries.rb +3 -0
- data/lib/baza/sql_queries/generic_insert.rb +81 -0
- data/lib/baza/sql_queries/generic_update.rb +31 -0
- data/lib/baza/sql_queries/mysql_upsert.rb +52 -0
- data/lib/baza/sql_queries/mysql_upsert_duplicate_key.rb +57 -0
- data/lib/baza/sql_queries/non_atomic_upsert.rb +25 -0
- data/lib/baza/sql_queries/postgres_upsert_duplicate_key.rb +118 -0
- data/lib/baza/sql_queries/select.rb +170 -0
- data/lib/baza/sql_queries/sqlite_upsert_duplicate_key.rb +99 -0
- data/lib/baza/table.rb +35 -8
- data/spec/active_record/models/user.rb +3 -0
- data/spec/{cloner_spec.rb → baza/cloner_spec.rb} +0 -0
- data/spec/drivers/active_record_mysql2_spec.rb +5 -3
- data/spec/drivers/active_record_mysql_spec.rb +2 -1
- data/spec/drivers/active_record_pg_spec.rb +20 -0
- data/spec/drivers/active_record_sqlite3_spec.rb +2 -1
- data/spec/drivers/mysql2_spec.rb +1 -1
- data/spec/drivers/mysql_spec.rb +10 -10
- data/spec/drivers/pg_spec.rb +18 -0
- data/spec/drivers/sqlite3_spec.rb +7 -8
- data/spec/info_active_record_example.rb +1 -1
- data/spec/{info_active_record_mysql2.rb → info_active_record_mysql2_example.rb} +3 -2
- data/spec/info_active_record_mysql2_travis.rb +35 -0
- data/spec/{info_active_record_mysql.rb → info_active_record_mysql_example.rb} +5 -4
- data/spec/info_active_record_mysql_travis.rb +36 -0
- data/spec/info_active_record_pg_example.rb +36 -0
- data/spec/info_active_record_pg_travis.rb +34 -0
- data/spec/info_active_record_sqlite3.rb +1 -1
- data/spec/info_mysql2_example.rb +1 -3
- data/spec/{info_mysql2_shippable.rb → info_mysql2_travis.rb} +2 -4
- data/spec/info_mysql_example.rb +1 -3
- data/spec/{info_mysql_shippable.rb → info_mysql_travis.rb} +2 -4
- data/spec/info_pg_example.rb +22 -0
- data/spec/info_pg_travis.rb +20 -0
- data/spec/info_sqlite3.rb +1 -3
- data/spec/spec_helper.rb +1 -1
- data/spec/support/driver_active_record_collection.rb +62 -0
- data/spec/support/driver_collection.rb +136 -121
- data/spec/support/driver_columns_collection.rb +19 -10
- data/spec/support/driver_databases_collection.rb +23 -1
- data/spec/support/driver_indexes_collection.rb +2 -2
- data/spec/support/driver_tables_collection.rb +24 -4
- data/spec/support/driver_users_collection.rb +53 -0
- metadata +185 -104
- data/lib/baza/drivers/mysql/database.rb +0 -28
- data/lib/baza/drivers/mysql/databases.rb +0 -35
- data/lib/baza/drivers/mysql_java/database.rb +0 -2
- data/lib/baza/drivers/mysql_java/databases.rb +0 -2
- data/lib/baza/model.rb +0 -875
- data/lib/baza/model_custom.rb +0 -155
- data/lib/baza/model_handler.rb +0 -910
- data/lib/baza/model_handler_sqlhelper.rb +0 -484
- data/lib/baza/revision.rb +0 -383
- data/shippable.yml +0 -17
- data/spec/info_active_record_mysql2_shippable.rb +0 -34
- data/spec/info_active_record_mysql_shippable.rb +0 -34
- data/spec/model_handler_spec.rb +0 -431
|
@@ -5,16 +5,17 @@ class Baza::Driver::Sqlite3::Column < Baza::Column
|
|
|
5
5
|
# Constructor. This should not be called manually.
|
|
6
6
|
def initialize(args)
|
|
7
7
|
@args = args
|
|
8
|
-
@
|
|
8
|
+
@data = args.fetch(:data)
|
|
9
|
+
@db = @args.fetch(:db)
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
# Returns the name of the column.
|
|
12
13
|
def name
|
|
13
|
-
@
|
|
14
|
+
@data.fetch(:name)
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
def table_name
|
|
17
|
-
@args
|
|
18
|
+
@args.fetch(:table_name)
|
|
18
19
|
end
|
|
19
20
|
|
|
20
21
|
# Returns the columns table-object.
|
|
@@ -38,21 +39,20 @@ class Baza::Driver::Sqlite3::Column < Baza::Column
|
|
|
38
39
|
# Returns the type of the column.
|
|
39
40
|
def type
|
|
40
41
|
unless @type
|
|
41
|
-
if match = @
|
|
42
|
+
if (match = @data.fetch(:type).match(/^([A-z]+)$/))
|
|
42
43
|
@maxlength = false
|
|
43
|
-
type = match[0].to_sym
|
|
44
|
-
elsif match = @
|
|
44
|
+
type = match[0].downcase.to_sym
|
|
45
|
+
elsif (match = @data.fetch(:type).match(/^decimal\((\d+),(\d+)\)$/))
|
|
45
46
|
@maxlength = "#{match[1]},#{match[2]}"
|
|
46
47
|
type = :decimal
|
|
47
|
-
elsif match = @
|
|
48
|
+
elsif (match = @data.fetch(:type).match(/^enum\((.+)\)$/))
|
|
48
49
|
@maxlength = match[1]
|
|
49
50
|
type = :enum
|
|
50
|
-
elsif match = @
|
|
51
|
+
elsif (match = @data.fetch(:type).match(/^(.+)\((\d+)\)$/))
|
|
51
52
|
@maxlength = match[2]
|
|
52
53
|
type = match[1].to_sym
|
|
53
|
-
elsif @
|
|
54
|
-
# A type can actually be empty in SQLite... Wtf?
|
|
55
|
-
return @args[:data][:type]
|
|
54
|
+
elsif @data.key?(:type) && @data.fetch(:type).to_s == ""
|
|
55
|
+
return @data[:type] # A type can actually be empty in SQLite... Wtf?
|
|
56
56
|
end
|
|
57
57
|
|
|
58
58
|
if type == :integer
|
|
@@ -61,7 +61,7 @@ class Baza::Driver::Sqlite3::Column < Baza::Column
|
|
|
61
61
|
@type = type
|
|
62
62
|
end
|
|
63
63
|
|
|
64
|
-
raise "Still not type? (#{@
|
|
64
|
+
raise "Still not type? (#{@data})" if @type.to_s.strip.empty?
|
|
65
65
|
end
|
|
66
66
|
|
|
67
67
|
@type
|
|
@@ -69,39 +69,37 @@ class Baza::Driver::Sqlite3::Column < Baza::Column
|
|
|
69
69
|
|
|
70
70
|
# Returns true if the column allows null. Otherwise false.
|
|
71
71
|
def null?
|
|
72
|
-
return false if @
|
|
72
|
+
return false if @data.fetch(:notnull).to_i == 1
|
|
73
73
|
true
|
|
74
74
|
end
|
|
75
75
|
|
|
76
76
|
# Returns the maxlength of the column.
|
|
77
77
|
def maxlength
|
|
78
|
-
type unless @maxlength
|
|
78
|
+
type unless @maxlength.nil?
|
|
79
79
|
return @maxlength if @maxlength
|
|
80
80
|
false
|
|
81
81
|
end
|
|
82
82
|
|
|
83
83
|
# Returns the default value of the column.
|
|
84
84
|
def default
|
|
85
|
-
def_val = @
|
|
85
|
+
def_val = @data.fetch(:dflt_value)
|
|
86
86
|
|
|
87
|
-
if def_val && match = def_val.match(/\A'(.*)'\Z/)
|
|
87
|
+
if def_val && (match = def_val.match(/\A'(.*)'\Z/))
|
|
88
88
|
return match[1]
|
|
89
89
|
end
|
|
90
90
|
|
|
91
|
-
return
|
|
91
|
+
return nil if @data.fetch(:dflt_value).to_s.empty?
|
|
92
92
|
def_val
|
|
93
93
|
end
|
|
94
94
|
|
|
95
95
|
# Returns true if the column is the primary key.
|
|
96
96
|
def primarykey?
|
|
97
|
-
|
|
98
|
-
true
|
|
97
|
+
@data.fetch(:pk).to_i == 1
|
|
99
98
|
end
|
|
100
99
|
|
|
101
100
|
# Returns true if the column is auto-increasing.
|
|
102
101
|
def autoincr?
|
|
103
|
-
|
|
104
|
-
false
|
|
102
|
+
primarykey? && @data.fetch(:type).casecmp("integer").zero?
|
|
105
103
|
end
|
|
106
104
|
|
|
107
105
|
# Drops the column from the table.
|
|
@@ -112,7 +110,7 @@ class Baza::Driver::Sqlite3::Column < Baza::Column
|
|
|
112
110
|
def reload
|
|
113
111
|
@db.q("PRAGMA table_info(`#{@db.escape_table(table_name)}`)") do |data|
|
|
114
112
|
next unless data.fetch(:name) == name
|
|
115
|
-
@
|
|
113
|
+
@data = data
|
|
116
114
|
@type = nil
|
|
117
115
|
return nil
|
|
118
116
|
end
|
|
@@ -134,13 +132,13 @@ class Baza::Driver::Sqlite3::Column < Baza::Column
|
|
|
134
132
|
@type = nil
|
|
135
133
|
@maxlength = nil
|
|
136
134
|
|
|
137
|
-
|
|
135
|
+
table.copy(
|
|
138
136
|
alter_columns: {
|
|
139
137
|
name => newdata
|
|
140
138
|
}
|
|
141
139
|
)
|
|
142
140
|
|
|
143
|
-
@
|
|
141
|
+
@data[:name] = newdata.fetch(:name).to_s
|
|
144
142
|
reload
|
|
145
143
|
end
|
|
146
144
|
end
|
|
@@ -4,10 +4,10 @@ class Baza::Driver::Sqlite3::Columns
|
|
|
4
4
|
|
|
5
5
|
# Constructor. This should not be called manually.
|
|
6
6
|
def initialize(args)
|
|
7
|
-
@
|
|
7
|
+
@db = args.fetch(:db)
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
-
DATA_SQL_ALLOWED_KEYS = [:name, :type, :maxlength, :autoincr, :primarykey, :null, :default, :default_func, :renames, :after, :renames]
|
|
10
|
+
DATA_SQL_ALLOWED_KEYS = [:name, :type, :maxlength, :autoincr, :primarykey, :null, :default, :default_func, :renames, :after, :renames].freeze
|
|
11
11
|
# Returns SQL for a knjdb-compatible hash.
|
|
12
12
|
def data_sql(data)
|
|
13
13
|
data.each_key do |key|
|
|
@@ -24,10 +24,10 @@ class Baza::Driver::Sqlite3::Columns
|
|
|
24
24
|
|
|
25
25
|
data[:maxlength] = 255 if type == :varchar && !data.key?(:maxlength)
|
|
26
26
|
data[:maxlength] = 11 if type == :int && !data.key?(:maxlength) && !data[:autoincr] && !data[:primarykey]
|
|
27
|
-
type = :integer if @
|
|
27
|
+
type = :integer if @db.int_types.index(type) && (data[:autoincr] || data[:primarykey])
|
|
28
28
|
|
|
29
|
-
sql = "`#{data
|
|
30
|
-
sql << "(#{data
|
|
29
|
+
sql = "`#{data.fetch(:name)}` #{type}"
|
|
30
|
+
sql << "(#{data.fetch(:maxlength)})" if data[:maxlength] && !data[:autoincr]
|
|
31
31
|
sql << " PRIMARY KEY" if data[:primarykey]
|
|
32
32
|
sql << " AUTOINCREMENT" if data[:autoincr]
|
|
33
33
|
|
|
@@ -39,7 +39,7 @@ class Baza::Driver::Sqlite3::Columns
|
|
|
39
39
|
if data.key?(:default_func)
|
|
40
40
|
sql << " DEFAULT #{data[:default_func]}"
|
|
41
41
|
elsif data.key?(:default) && data[:default] != false
|
|
42
|
-
sql << " DEFAULT
|
|
42
|
+
sql << " DEFAULT #{@db.sqlval(data.fetch(:default))}"
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
sql
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
class Baza::Driver::Sqlite3::Commands
|
|
2
|
+
def initialize(args)
|
|
3
|
+
@db = args.fetch(:db)
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def upsert_duplicate_key(table_name, updates, terms = {}, args = {})
|
|
7
|
+
Baza::SqlQueries::SqliteUpsertDuplicateKey.new({
|
|
8
|
+
db: @db,
|
|
9
|
+
table_name: table_name,
|
|
10
|
+
updates: updates,
|
|
11
|
+
terms: terms
|
|
12
|
+
}.merge(args)).execute
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def upsert(table_name, updates, terms, args = {})
|
|
16
|
+
Baza::SqlQueries::NonAtomicUpsert.new(
|
|
17
|
+
db: @db,
|
|
18
|
+
table_name: table_name,
|
|
19
|
+
buffer: args[:buffer],
|
|
20
|
+
terms: terms,
|
|
21
|
+
updates: updates
|
|
22
|
+
).execute
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def last_id
|
|
26
|
+
@db.query("SELECT last_insert_rowid() AS id").fetch.fetch(:id).to_i
|
|
27
|
+
end
|
|
28
|
+
end
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -6,7 +6,7 @@ class Baza::Driver::Sqlite3::Result < Baza::ResultBase
|
|
|
6
6
|
|
|
7
7
|
begin
|
|
8
8
|
@statement.execute
|
|
9
|
-
@type_translation = driver.
|
|
9
|
+
@type_translation = driver.db.opts[:type_translation]
|
|
10
10
|
@types = statement.types if @type_translation == true
|
|
11
11
|
@columns = statement.columns.map(&:to_sym)
|
|
12
12
|
read_results
|
|
@@ -32,8 +32,14 @@ class Baza::Driver::Sqlite3::Result < Baza::ResultBase
|
|
|
32
32
|
|
|
33
33
|
# Loops over every result yielding them.
|
|
34
34
|
def each
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
loop do
|
|
36
|
+
data = fetch
|
|
37
|
+
|
|
38
|
+
if data
|
|
39
|
+
yield data
|
|
40
|
+
else
|
|
41
|
+
break
|
|
42
|
+
end
|
|
37
43
|
end
|
|
38
44
|
end
|
|
39
45
|
|
|
@@ -50,12 +56,14 @@ private
|
|
|
50
56
|
end
|
|
51
57
|
|
|
52
58
|
def translate_type(value, type)
|
|
53
|
-
return
|
|
59
|
+
return if value.to_s.empty?
|
|
54
60
|
|
|
55
61
|
if type == "datetime"
|
|
56
|
-
|
|
62
|
+
return nil if value == "NULL"
|
|
63
|
+
return Time.parse(value)
|
|
57
64
|
elsif type == "date"
|
|
58
|
-
|
|
65
|
+
return nil if value == "NULL"
|
|
66
|
+
return Date.parse(value)
|
|
59
67
|
else
|
|
60
68
|
value
|
|
61
69
|
end
|
|
File without changes
|
|
@@ -87,7 +87,7 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
|
87
87
|
end
|
|
88
88
|
|
|
89
89
|
def columns
|
|
90
|
-
@db.
|
|
90
|
+
@db.columns
|
|
91
91
|
ret = []
|
|
92
92
|
|
|
93
93
|
@db.query("PRAGMA table_info(`#{@db.escape_table(name)}`)") do |d_cols|
|
|
@@ -122,14 +122,14 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
|
122
122
|
# if col_data.key?("after")
|
|
123
123
|
# self.create_column_programmatic(col_data)
|
|
124
124
|
# else
|
|
125
|
-
@db.query("ALTER TABLE `#{name}` ADD COLUMN #{@db.
|
|
125
|
+
@db.query("ALTER TABLE `#{name}` ADD COLUMN #{@db.columns.data_sql(col_data)};")
|
|
126
126
|
# end
|
|
127
127
|
end
|
|
128
128
|
end
|
|
129
129
|
|
|
130
130
|
def create_column_programmatic(col_data)
|
|
131
131
|
temp_name = "temptable_#{Time.now.to_f.to_s.hash}"
|
|
132
|
-
|
|
132
|
+
clone(temp_name)
|
|
133
133
|
cols_cur = columns
|
|
134
134
|
@db.query("DROP TABLE `#{name}`")
|
|
135
135
|
|
|
@@ -138,10 +138,10 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
|
138
138
|
cols_cur.each do |name, col|
|
|
139
139
|
sql << ", " unless first
|
|
140
140
|
first = false if first
|
|
141
|
-
sql << @db.
|
|
141
|
+
sql << @db.columns.data_sql(col.data)
|
|
142
142
|
|
|
143
143
|
if col_data[:after] && col_data[:after] == name
|
|
144
|
-
sql << ", #{@db.
|
|
144
|
+
sql << ", #{@db.columns.data_sql(col_data)}"
|
|
145
145
|
end
|
|
146
146
|
end
|
|
147
147
|
sql << ");"
|
|
@@ -170,7 +170,7 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
|
170
170
|
columns.each do |col|
|
|
171
171
|
sql << ", " unless first
|
|
172
172
|
first = false if first
|
|
173
|
-
sql << @db.
|
|
173
|
+
sql << @db.columns.data_sql(col.data)
|
|
174
174
|
end
|
|
175
175
|
sql << ");"
|
|
176
176
|
|
|
@@ -182,7 +182,7 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
|
182
182
|
indexes.each do |index|
|
|
183
183
|
index_name = index.name.gsub(/\A#{Regexp.escape(name)}_/, "")
|
|
184
184
|
|
|
185
|
-
if @db.opts[:index_append_table_name] && match = index_name.match(/\A(.+?)__(.+)\Z/)
|
|
185
|
+
if @db.opts[:index_append_table_name] && (match = index_name.match(/\A(.+?)__(.+)\Z/))
|
|
186
186
|
index_name = match[2]
|
|
187
187
|
else
|
|
188
188
|
# Two indexes with the same name can't exist, and we are cloning, so we need to change the name
|
|
@@ -206,7 +206,7 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
|
206
206
|
|
|
207
207
|
def copy(args = {})
|
|
208
208
|
temp_name = "temptable_#{Time.now.to_f.to_s.hash}"
|
|
209
|
-
|
|
209
|
+
clone(temp_name)
|
|
210
210
|
cols_cur = columns
|
|
211
211
|
@db.query("DROP TABLE `#{name}`")
|
|
212
212
|
|
|
@@ -219,15 +219,15 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
|
219
219
|
first = false if first
|
|
220
220
|
|
|
221
221
|
if args.key?(:alter_columns) && args[:alter_columns][col.name]
|
|
222
|
-
sql << @db.
|
|
222
|
+
sql << @db.columns.data_sql(args[:alter_columns][col.name])
|
|
223
223
|
else
|
|
224
|
-
sql << @db.
|
|
224
|
+
sql << @db.columns.data_sql(col.data)
|
|
225
225
|
end
|
|
226
226
|
|
|
227
227
|
next unless args[:new]
|
|
228
228
|
args[:new].each do |col_data|
|
|
229
229
|
if col_data[:after] && col_data[:after] == col.name
|
|
230
|
-
sql << ", #{@db.
|
|
230
|
+
sql << ", #{@db.columns.data_sql(col_data)}"
|
|
231
231
|
end
|
|
232
232
|
end
|
|
233
233
|
end
|
|
@@ -333,13 +333,13 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
|
333
333
|
|
|
334
334
|
sql = "CREATE"
|
|
335
335
|
sql << " UNIQUE" if index_data[:unique]
|
|
336
|
-
sql << " INDEX
|
|
336
|
+
sql << " INDEX #{@db.sep_index}#{@db.escape_column(index_name)}#{@db.sep_index} ON #{@db.sep_table}#{@db.escape_table(name)}#{@db.sep_table} ("
|
|
337
337
|
|
|
338
338
|
first = true
|
|
339
339
|
index_data.fetch(:columns).each do |col_name|
|
|
340
340
|
sql << ", " unless first
|
|
341
341
|
first = false if first
|
|
342
|
-
sql << "
|
|
342
|
+
sql << "#{@db.sep_col}#{@db.escape_column(col_name)}#{@db.sep_col}"
|
|
343
343
|
end
|
|
344
344
|
|
|
345
345
|
sql << ")"
|
|
@@ -376,8 +376,8 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
|
376
376
|
ret
|
|
377
377
|
end
|
|
378
378
|
|
|
379
|
-
def insert(data)
|
|
380
|
-
@db.insert(name, data)
|
|
379
|
+
def insert(data, args = {})
|
|
380
|
+
@db.insert(name, data, args)
|
|
381
381
|
end
|
|
382
382
|
|
|
383
383
|
def to_s
|
|
@@ -392,6 +392,15 @@ private
|
|
|
392
392
|
|
|
393
393
|
def parse_columns_from_sql(sql)
|
|
394
394
|
columns_sql = sql.match(/\((.+?)\)\Z/)[1]
|
|
395
|
-
|
|
395
|
+
|
|
396
|
+
columns_sql.split(",").map do |column|
|
|
397
|
+
if (match = column.match(/`(.+)`/))
|
|
398
|
+
match[1]
|
|
399
|
+
elsif (match = column.match(/"(.+)"/))
|
|
400
|
+
match[1]
|
|
401
|
+
else
|
|
402
|
+
raise "Couldn't parse column part: #{column}"
|
|
403
|
+
end
|
|
404
|
+
end
|
|
396
405
|
end
|
|
397
406
|
end
|
|
@@ -14,9 +14,8 @@ class Baza::Driver::Sqlite3::Tables
|
|
|
14
14
|
def [](table_name)
|
|
15
15
|
table_name = table_name.to_s
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
end
|
|
17
|
+
ret = @list.get(table_name)
|
|
18
|
+
return ret if ret
|
|
20
19
|
|
|
21
20
|
list(name: table_name) do |table|
|
|
22
21
|
return table if table.name == table_name
|
|
@@ -32,7 +31,7 @@ class Baza::Driver::Sqlite3::Tables
|
|
|
32
31
|
tables_args = {type: "table"}
|
|
33
32
|
tables_args[:name] = args.fetch(:name) if args[:name]
|
|
34
33
|
|
|
35
|
-
|
|
34
|
+
@db.select("sqlite_master", tables_args, orderby: "name") do |d_tables|
|
|
36
35
|
table_name = d_tables.fetch(:name)
|
|
37
36
|
next if table_name == "sqlite_sequence"
|
|
38
37
|
|
|
@@ -76,7 +75,7 @@ class Baza::Driver::Sqlite3::Tables
|
|
|
76
75
|
@list[table.name] = table
|
|
77
76
|
end
|
|
78
77
|
|
|
79
|
-
CREATE_ALLOWED_KEYS = [:indexes, :columns]
|
|
78
|
+
CREATE_ALLOWED_KEYS = [:indexes, :columns].freeze
|
|
80
79
|
def create(name, data, args = nil)
|
|
81
80
|
data.each_key do |key|
|
|
82
81
|
raise "Invalid key: '#{key}' (#{key.class.name})." unless CREATE_ALLOWED_KEYS.include?(key)
|
|
@@ -90,7 +89,7 @@ class Baza::Driver::Sqlite3::Tables
|
|
|
90
89
|
data.fetch(:columns).each do |col_data|
|
|
91
90
|
sql << ", " unless first
|
|
92
91
|
first = false if first
|
|
93
|
-
sql << @db.
|
|
92
|
+
sql << @db.columns.data_sql(col_data)
|
|
94
93
|
end
|
|
95
94
|
|
|
96
95
|
sql << ")"
|
|
@@ -1,18 +1,6 @@
|
|
|
1
1
|
# This class handels SQLite3-specific behaviour.
|
|
2
2
|
class Baza::Driver::Sqlite3Java < Baza::JdbcDriver
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
autoload :Database, "#{path}/database"
|
|
6
|
-
autoload :Databases, "#{path}/databases"
|
|
7
|
-
autoload :Table, "#{path}/table"
|
|
8
|
-
autoload :Tables, "#{path}/tables"
|
|
9
|
-
autoload :Column, "#{path}/column"
|
|
10
|
-
autoload :Columns, "#{path}/columns"
|
|
11
|
-
autoload :Index, "#{path}/index"
|
|
12
|
-
autoload :Indexes, "#{path}/indexes"
|
|
13
|
-
autoload :Result, "#{path}/result"
|
|
14
|
-
autoload :Sqlspecs, "#{path}/sqlspecs"
|
|
15
|
-
autoload :UnbufferedResult, "#{path}/unbuffered_result"
|
|
3
|
+
AutoAutoloader.autoload_sub_classes(self, __FILE__)
|
|
16
4
|
|
|
17
5
|
attr_reader :mutex_statement_reader
|
|
18
6
|
|
|
@@ -29,15 +17,22 @@ class Baza::Driver::Sqlite3Java < Baza::JdbcDriver
|
|
|
29
17
|
end
|
|
30
18
|
end
|
|
31
19
|
|
|
20
|
+
def self.args
|
|
21
|
+
[{
|
|
22
|
+
label: "Path",
|
|
23
|
+
name: "path"
|
|
24
|
+
}]
|
|
25
|
+
end
|
|
26
|
+
|
|
32
27
|
# Constructor. This should not be called manually.
|
|
33
|
-
def initialize(
|
|
28
|
+
def initialize(db)
|
|
34
29
|
super
|
|
35
30
|
|
|
36
|
-
@path = @
|
|
31
|
+
@path = @db.opts[:path] if @db.opts[:path]
|
|
37
32
|
@preload_results = true
|
|
38
33
|
|
|
39
|
-
if @
|
|
40
|
-
@conn = @
|
|
34
|
+
if @db.opts[:conn]
|
|
35
|
+
@conn = @db.opts[:conn]
|
|
41
36
|
else
|
|
42
37
|
org.sqlite.JDBC
|
|
43
38
|
reconnect
|
|
@@ -58,16 +53,11 @@ class Baza::Driver::Sqlite3Java < Baza::JdbcDriver
|
|
|
58
53
|
string.to_s.gsub(/'/, "''")
|
|
59
54
|
end
|
|
60
55
|
|
|
61
|
-
# Returns the last inserted ID.
|
|
62
|
-
def last_id
|
|
63
|
-
query("SELECT LAST_INSERT_ROWID() AS id").fetch[:id].to_i
|
|
64
|
-
end
|
|
65
|
-
|
|
66
56
|
def transaction
|
|
67
57
|
query_no_result_set("BEGIN TRANSACTION")
|
|
68
58
|
|
|
69
59
|
begin
|
|
70
|
-
yield @
|
|
60
|
+
yield @db
|
|
71
61
|
query_no_result_set("COMMIT")
|
|
72
62
|
rescue
|
|
73
63
|
query_no_result_set("ROLLBACK")
|