baza 0.0.20 → 0.0.21
Sign up to get free protection for your applications and to get access to all the features.
- 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
data/lib/baza/driver.rb
CHANGED
@@ -1,9 +1,4 @@
|
|
1
1
|
# Subclass that contains all the drivers as further subclasses.
|
2
2
|
class Baza::Driver
|
3
|
-
|
4
|
-
def self.const_missing(name)
|
5
|
-
require_relative "drivers/#{StringCases.camel_to_snake(name)}.rb"
|
6
|
-
raise LoadError, "Still not loaded: '#{name}'." unless Baza::Driver.const_defined?(name)
|
7
|
-
Baza::Driver.const_get(name)
|
8
|
-
end
|
3
|
+
AutoAutoloader.autoload_sub_classes(self, __FILE__)
|
9
4
|
end
|
@@ -1,12 +1,7 @@
|
|
1
1
|
class Baza::Driver::ActiveRecord < Baza::BaseSqlDriver
|
2
|
-
|
2
|
+
AutoAutoloader.autoload_sub_classes(self, __FILE__)
|
3
3
|
|
4
|
-
|
5
|
-
autoload :Columns, "#{path}/columns"
|
6
|
-
autoload :Indexes, "#{path}/indexes"
|
7
|
-
autoload :Result, "#{path}/result"
|
8
|
-
|
9
|
-
attr_reader :baza, :conn, :sep_table, :sep_col, :sep_val, :symbolize, :driver_type
|
4
|
+
attr_reader :db, :conn, :sep_table, :sep_col, :sep_val, :symbolize, :driver_type
|
10
5
|
attr_accessor :tables, :cols, :indexes
|
11
6
|
|
12
7
|
def self.from_object(args)
|
@@ -29,9 +24,9 @@ class Baza::Driver::ActiveRecord < Baza::BaseSqlDriver
|
|
29
24
|
nil
|
30
25
|
end
|
31
26
|
|
32
|
-
def initialize(
|
33
|
-
@
|
34
|
-
@conn = @
|
27
|
+
def initialize(db)
|
28
|
+
@db = db
|
29
|
+
@conn = @db.opts.fetch(:conn)
|
35
30
|
|
36
31
|
raise "No conn given" unless @conn
|
37
32
|
|
@@ -41,41 +36,59 @@ class Baza::Driver::ActiveRecord < Baza::BaseSqlDriver
|
|
41
36
|
require_relative "mysql2"
|
42
37
|
require_relative "mysql2/result"
|
43
38
|
|
39
|
+
@sep_database = "`"
|
44
40
|
@sep_table = "`"
|
45
41
|
@sep_col = "`"
|
46
42
|
@sep_val = "'"
|
43
|
+
@sep_index = "`"
|
47
44
|
@driver_type = :mysql2
|
48
45
|
@result_constant = Baza::Driver::Mysql2::Result
|
49
46
|
elsif conn_name.include?("mysql")
|
50
|
-
|
51
|
-
|
47
|
+
unless RUBY_PLATFORM == "java"
|
48
|
+
require_relative "mysql"
|
49
|
+
require_relative "mysql/result"
|
50
|
+
@result_constant = Baza::Driver::Mysql::Result
|
51
|
+
end
|
52
52
|
|
53
|
+
@sep_database = "`"
|
53
54
|
@sep_table = "`"
|
54
55
|
@sep_col = "`"
|
55
56
|
@sep_val = "'"
|
57
|
+
@sep_index = "`"
|
56
58
|
@driver_type = :mysql
|
57
|
-
@result_constant = Baza::Driver::Mysql::Result unless RUBY_PLATFORM == "java"
|
58
59
|
elsif conn_name.include?("sqlite")
|
60
|
+
@sep_database = "`"
|
59
61
|
@sep_table = "`"
|
60
62
|
@sep_col = "`"
|
61
63
|
@sep_val = "'"
|
64
|
+
@sep_index = "`"
|
62
65
|
@driver_type = :sqlite3
|
66
|
+
elsif conn_name.include?("postgresqladapter")
|
67
|
+
@sep_database = '"'
|
68
|
+
@sep_table = '"'
|
69
|
+
@sep_col = '"'
|
70
|
+
@sep_index = '"'
|
71
|
+
@sep_val = "'"
|
72
|
+
@driver_type = :pg
|
73
|
+
@result_constant = Baza::Driver::Pg::Result
|
63
74
|
else
|
64
|
-
raise "Unknown type: '#{conn_name}'
|
75
|
+
raise "Unknown type: '#{conn_name}'"
|
65
76
|
end
|
66
77
|
|
78
|
+
@result_constant ||= Baza::Driver::ActiveRecord::Result
|
79
|
+
|
67
80
|
if conn_name.include?("mysql")
|
68
|
-
@
|
81
|
+
@db.opts[:db] ||= query("SELECT DATABASE()").fetch.fetch(:"DATABASE()")
|
82
|
+
elsif @driver_type == :pg
|
83
|
+
@db.opts[:db] ||= query("SELECT current_database()").fetch.values.first
|
69
84
|
end
|
70
|
-
|
71
|
-
@result_constant ||= Baza::Driver::ActiveRecord::Result
|
72
85
|
end
|
73
86
|
|
74
87
|
def query(sql)
|
75
88
|
@result_constant.new(self, @conn.execute(sql))
|
76
89
|
end
|
77
90
|
|
78
|
-
|
91
|
+
alias query_ubuf query
|
79
92
|
|
80
93
|
def escape(str)
|
81
94
|
@conn.quote_string(str.to_s)
|
@@ -98,7 +111,7 @@ class Baza::Driver::ActiveRecord < Baza::BaseSqlDriver
|
|
98
111
|
end
|
99
112
|
|
100
113
|
def transaction
|
101
|
-
if @driver_type == :mysql || @driver_type == :mysql2
|
114
|
+
if @driver_type == :mysql || @driver_type == :mysql2 || @driver_type == :pg
|
102
115
|
query("START TRANSACTION")
|
103
116
|
elsif @driver_type == :sqlite3
|
104
117
|
query("BEGIN TRANSACTION")
|
@@ -107,7 +120,7 @@ class Baza::Driver::ActiveRecord < Baza::BaseSqlDriver
|
|
107
120
|
end
|
108
121
|
|
109
122
|
begin
|
110
|
-
yield @
|
123
|
+
yield @db
|
111
124
|
query("COMMIT")
|
112
125
|
rescue
|
113
126
|
query("ROLLBACK")
|
@@ -116,6 +129,37 @@ class Baza::Driver::ActiveRecord < Baza::BaseSqlDriver
|
|
116
129
|
end
|
117
130
|
|
118
131
|
def supports_multiple_databases?
|
119
|
-
conn_name.include?("mysql")
|
132
|
+
conn_name.include?("mysql") || @driver_type == :pg
|
133
|
+
end
|
134
|
+
|
135
|
+
def save_model!(model, args = {})
|
136
|
+
raise ActiveRecord::InvalidRecord, model if (!args.key?(:validate) || args[:validate]) && !model.valid?
|
137
|
+
|
138
|
+
attributes = {}
|
139
|
+
model.changes.each do |column_name, value_array|
|
140
|
+
attributes[column_name.to_s] = value_array.last
|
141
|
+
end
|
142
|
+
|
143
|
+
attributes = attributes.delete_if { |_key, value| value.nil? } if model.new_record?
|
144
|
+
|
145
|
+
table_name = model.class.table_name
|
146
|
+
|
147
|
+
if model.new_record?
|
148
|
+
if args[:update_on_duplicate_key]
|
149
|
+
id = @db.upsert_duplicate_key(table_name, attributes, {}, return_id: true)
|
150
|
+
else
|
151
|
+
id = @db.insert(table_name, attributes, return_id: true)
|
152
|
+
end
|
153
|
+
|
154
|
+
if id && id.to_i > 0
|
155
|
+
model.id = id
|
156
|
+
else
|
157
|
+
raise "Invalid ID: #{id}" unless id.to_i > 0
|
158
|
+
end
|
159
|
+
else
|
160
|
+
@db.update(table_name, attributes, id: model.id)
|
161
|
+
end
|
162
|
+
|
163
|
+
model.reload
|
120
164
|
end
|
121
165
|
end
|
File without changes
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class Baza::Driver::ActiveRecord::Commands
|
2
|
+
def initialize(args)
|
3
|
+
@db = args.fetch(:db)
|
4
|
+
@proxy_to = ::Baza::Driver.const_get(StringCases.snake_to_camel(@db.driver.driver_type)).const_get(:Commands).new(args)
|
5
|
+
end
|
6
|
+
|
7
|
+
def method_missing(name, *args, &blk)
|
8
|
+
@proxy_to.__send__(name, *args, &blk)
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class Baza::Driver::ActiveRecord::Databases
|
2
|
+
def initialize(args)
|
3
|
+
@args = args
|
4
|
+
@proxy_to = ::Baza::Driver.const_get(StringCases.snake_to_camel(@args[:db].driver.driver_type)).const_get(:Databases).new(@args)
|
5
|
+
end
|
6
|
+
|
7
|
+
def method_missing(name, *args, &blk)
|
8
|
+
@proxy_to.__send__(name, *args, &blk)
|
9
|
+
end
|
10
|
+
end
|
File without changes
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class Baza::Driver::ActiveRecord::Result < Baza::ResultBase
|
2
2
|
def initialize(driver, result)
|
3
3
|
@result = result
|
4
|
-
@type_translation = driver.
|
4
|
+
@type_translation = driver.db.opts[:type_translation]
|
5
5
|
end
|
6
6
|
|
7
7
|
def fetch
|
@@ -14,7 +14,9 @@ class Baza::Driver::ActiveRecord::Result < Baza::ResultBase
|
|
14
14
|
return unless @result
|
15
15
|
|
16
16
|
@result.each do |result|
|
17
|
+
result = result.delete_if { |k, _v| k.is_a?(Fixnum) } # Seems like this happens depending on the version installed? - kaspernj
|
17
18
|
result = Hash[result.map { |k, v| [k, v.to_s] }] if @type_translation == :string
|
19
|
+
|
18
20
|
yield result.symbolize_keys
|
19
21
|
end
|
20
22
|
end
|
File without changes
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class Baza::Driver::ActiveRecord::Users
|
2
|
+
def initialize(args)
|
3
|
+
@args = args
|
4
|
+
|
5
|
+
require "#{File.dirname(__FILE__)}/../#{@args.fetch(:db).driver.driver_type}"
|
6
|
+
@proxy_to = ::Baza::Driver.const_get(StringCases.snake_to_camel(@args.fetch(:db).driver.driver_type)).const_get(:Users).new(@args)
|
7
|
+
end
|
8
|
+
|
9
|
+
def method_missing(name, *args, &blk)
|
10
|
+
@proxy_to.__send__(name, *args, &blk)
|
11
|
+
end
|
12
|
+
end
|
@@ -1,17 +1,5 @@
|
|
1
1
|
class Baza::Driver::Mysql < Baza::MysqlBaseDriver
|
2
|
-
|
3
|
-
|
4
|
-
autoload :Database, "#{path}/database"
|
5
|
-
autoload :Databases, "#{path}/databases"
|
6
|
-
autoload :Table, "#{path}/table"
|
7
|
-
autoload :Tables, "#{path}/tables"
|
8
|
-
autoload :Column, "#{path}/column"
|
9
|
-
autoload :Columns, "#{path}/columns"
|
10
|
-
autoload :Index, "#{path}/index"
|
11
|
-
autoload :Indexes, "#{path}/indexes"
|
12
|
-
autoload :Result, "#{path}/result"
|
13
|
-
autoload :UnbufferedResult, "#{path}/unbuffered_result"
|
14
|
-
autoload :Sqlspecs, "#{path}/sqlspecs"
|
2
|
+
AutoAutoloader.autoload_sub_classes(self, __FILE__)
|
15
3
|
|
16
4
|
attr_reader :conn
|
17
5
|
|
@@ -19,16 +7,16 @@ class Baza::Driver::Mysql < Baza::MysqlBaseDriver
|
|
19
7
|
raise "Mysql does not support auth extraction" if args[:object].class.name == "Mysql"
|
20
8
|
end
|
21
9
|
|
22
|
-
def initialize(
|
10
|
+
def initialize(db)
|
23
11
|
super
|
24
12
|
|
25
|
-
@opts = @
|
13
|
+
@opts = @db.opts
|
26
14
|
|
27
15
|
require "monitor"
|
28
16
|
@mutex = Monitor.new
|
29
17
|
|
30
|
-
if
|
31
|
-
@conn =
|
18
|
+
if db.opts[:conn]
|
19
|
+
@conn = db.opts[:conn]
|
32
20
|
else
|
33
21
|
if @opts[:encoding]
|
34
22
|
@encoding = @opts[:encoding]
|
@@ -36,8 +24,8 @@ class Baza::Driver::Mysql < Baza::MysqlBaseDriver
|
|
36
24
|
@encoding = "utf8"
|
37
25
|
end
|
38
26
|
|
39
|
-
if @
|
40
|
-
@port = @
|
27
|
+
if @db.opts.key?(:port)
|
28
|
+
@port = @db.opts[:port].to_i
|
41
29
|
else
|
42
30
|
@port = 3306
|
43
31
|
end
|
@@ -55,7 +43,7 @@ class Baza::Driver::Mysql < Baza::MysqlBaseDriver
|
|
55
43
|
def reconnect
|
56
44
|
@mutex.synchronize do
|
57
45
|
require "mysql" unless ::Object.const_defined?(:Mysql)
|
58
|
-
@conn = ::Mysql.real_connect(@
|
46
|
+
@conn = ::Mysql.real_connect(@db.opts[:host], @db.opts[:user], @db.opts[:pass], @db.opts[:db], @port)
|
59
47
|
query("SET NAMES '#{esc(@encoding)}'") if @encoding
|
60
48
|
end
|
61
49
|
end
|
@@ -100,11 +88,6 @@ class Baza::Driver::Mysql < Baza::MysqlBaseDriver
|
|
100
88
|
@conn.escape_string(string.to_s)
|
101
89
|
end
|
102
90
|
|
103
|
-
# Returns the last inserted ID for the connection.
|
104
|
-
def last_id
|
105
|
-
@mutex.synchronize { return @conn.insert_id.to_i }
|
106
|
-
end
|
107
|
-
|
108
91
|
# Closes the connection threadsafe.
|
109
92
|
def close
|
110
93
|
@mutex.synchronize { @conn.close }
|
@@ -113,7 +96,7 @@ class Baza::Driver::Mysql < Baza::MysqlBaseDriver
|
|
113
96
|
# Destroyes the connection.
|
114
97
|
def destroy
|
115
98
|
@conn = nil
|
116
|
-
@
|
99
|
+
@db = nil
|
117
100
|
@mutex = nil
|
118
101
|
@subtype = nil
|
119
102
|
@encoding = nil
|
@@ -19,24 +19,6 @@ class Baza::Driver::Mysql::Column < Baza::Column
|
|
19
19
|
@args.fetch(:table_name)
|
20
20
|
end
|
21
21
|
|
22
|
-
# Returns the table-object that this column belongs to.
|
23
|
-
def table
|
24
|
-
@db.tables[table_name]
|
25
|
-
end
|
26
|
-
|
27
|
-
# Returns all data of the column in the knjdb-format.
|
28
|
-
def data
|
29
|
-
{
|
30
|
-
type: type,
|
31
|
-
name: name,
|
32
|
-
null: null?,
|
33
|
-
maxlength: maxlength,
|
34
|
-
default: default,
|
35
|
-
primarykey: primarykey?,
|
36
|
-
autoincr: autoincr?
|
37
|
-
}
|
38
|
-
end
|
39
|
-
|
40
22
|
def reload
|
41
23
|
data = @db.query("SHOW FULL COLUMNS FROM `#{@db.escape_table(table_name)}` WHERE `Field` = '#{@db.esc(name)}'").fetch
|
42
24
|
raise Baza::Errors::ColumnNotFound unless data
|
@@ -47,21 +29,21 @@ class Baza::Driver::Mysql::Column < Baza::Column
|
|
47
29
|
# Returns the type of the column (integer, varchar etc.).
|
48
30
|
def type
|
49
31
|
unless @type
|
50
|
-
if match = @data
|
32
|
+
if (match = @data.fetch(:Type).match(/^([A-z]+)$/))
|
51
33
|
@maxlength = false
|
52
34
|
@type = match[0].to_sym
|
53
|
-
elsif match = @data
|
35
|
+
elsif (match = @data.fetch(:Type).match(/^decimal\((\d+),(\d+)\)$/))
|
54
36
|
@maxlength = "#{match[1]},#{match[2]}"
|
55
37
|
@type = :decimal
|
56
|
-
elsif match = @data
|
38
|
+
elsif (match = @data.fetch(:Type).match(/^enum\((.+)\)$/))
|
57
39
|
@maxlength = match[1]
|
58
40
|
@type = :enum
|
59
|
-
elsif match = @data
|
41
|
+
elsif (match = @data.fetch(:Type).match(/^(.+)\((\d+)\)/))
|
60
42
|
@maxlength = match[2].to_i
|
61
43
|
@type = match[1].to_sym
|
62
44
|
end
|
63
45
|
|
64
|
-
raise "Still
|
46
|
+
raise "Still no type from: '#{@data.fetch(:Type)}'" if @type.to_s.strip.empty?
|
65
47
|
end
|
66
48
|
|
67
49
|
@type
|
@@ -69,8 +51,7 @@ class Baza::Driver::Mysql::Column < Baza::Column
|
|
69
51
|
|
70
52
|
# Return true if the columns allows null. Otherwise false.
|
71
53
|
def null?
|
72
|
-
|
73
|
-
true
|
54
|
+
@data[:Null] != "NO"
|
74
55
|
end
|
75
56
|
|
76
57
|
# Returns the maxlength.
|
@@ -82,22 +63,20 @@ class Baza::Driver::Mysql::Column < Baza::Column
|
|
82
63
|
|
83
64
|
# Returns the default value for the column.
|
84
65
|
def default
|
85
|
-
return
|
86
|
-
return
|
87
|
-
return
|
66
|
+
return nil if (type == :datetime || type == :date) && @data[:Default].to_s.strip.empty?
|
67
|
+
return nil if (type == :int || type == :bigint) && @data[:Default].to_s.strip.empty?
|
68
|
+
return nil unless @data[:Default]
|
88
69
|
@data.fetch(:Default)
|
89
70
|
end
|
90
71
|
|
91
72
|
# Returns true if the column is the primary key. Otherwise false.
|
92
73
|
def primarykey?
|
93
|
-
|
94
|
-
false
|
74
|
+
@data.fetch(:Key) == "PRI"
|
95
75
|
end
|
96
76
|
|
97
77
|
# Returns true if the column is auto-increasing. Otherwise false.
|
98
78
|
def autoincr?
|
99
|
-
|
100
|
-
false
|
79
|
+
@data.fetch(:Extra).include?("auto_increment")
|
101
80
|
end
|
102
81
|
|
103
82
|
# Returns the comment for the column.
|
@@ -114,8 +93,8 @@ class Baza::Driver::Mysql::Column < Baza::Column
|
|
114
93
|
|
115
94
|
# Changes the column properties by the given hash.
|
116
95
|
def change(data)
|
117
|
-
col_escaped = "
|
118
|
-
table_escape = "
|
96
|
+
col_escaped = "#{@db.sep_col}#{@db.escape_column(name)}#{@db.sep_col}"
|
97
|
+
table_escape = "#{@db.sep_table}#{@db.escape_table(table_name)}#{@db.sep_table}"
|
119
98
|
newdata = data.clone
|
120
99
|
|
121
100
|
newdata[:name] = name unless newdata.key?(:name)
|
@@ -128,7 +107,7 @@ class Baza::Driver::Mysql::Column < Baza::Column
|
|
128
107
|
drop_add = true if name.to_s != newdata[:name].to_s
|
129
108
|
|
130
109
|
table.__send__(:remove_column_from_list, self) if drop_add
|
131
|
-
@db.query("ALTER TABLE #{table_escape} CHANGE #{col_escaped} #{@db.
|
110
|
+
@db.query("ALTER TABLE #{table_escape} CHANGE #{col_escaped} #{@db.columns.data_sql(newdata)}")
|
132
111
|
@name = newdata[:name].to_s
|
133
112
|
reload
|
134
113
|
table.__send__(:add_column_to_list, self) if drop_add
|
@@ -1,12 +1,9 @@
|
|
1
|
-
# This class handels various MySQL-column-specific operations.
|
2
1
|
class Baza::Driver::Mysql::Columns
|
3
|
-
# Constructor. Should not be called manually.
|
4
2
|
def initialize(args)
|
5
|
-
@
|
3
|
+
@db = args.fetch(:db)
|
6
4
|
end
|
7
5
|
|
8
|
-
|
9
|
-
DATA_SQL_ALLOWED_KEYS = [:type, :maxlength, :name, :primarykey, :autoincr, :default, :comment, :after, :first, :storage, :null, :renames]
|
6
|
+
DATA_SQL_ALLOWED_KEYS = [:type, :maxlength, :name, :primarykey, :autoincr, :default, :comment, :after, :first, :storage, :null, :renames].freeze
|
10
7
|
def data_sql(data)
|
11
8
|
data.each_key do |key|
|
12
9
|
raise "Invalid key: '#{key}' (#{key.class.name})." unless DATA_SQL_ALLOWED_KEYS.include?(key)
|
@@ -15,22 +12,22 @@ class Baza::Driver::Mysql::Columns
|
|
15
12
|
raise "No type given." unless data[:type]
|
16
13
|
type = data[:type].to_sym
|
17
14
|
|
18
|
-
data[:maxlength] = 255 if type == :varchar &&
|
15
|
+
data[:maxlength] = 255 if type == :varchar && data[:maxlength].to_s.strip.empty?
|
19
16
|
|
20
|
-
sql = "
|
17
|
+
sql = "#{@db.sep_col}#{@db.escape_column(data.fetch(:name))}#{@db.sep_col} #{type}"
|
21
18
|
sql << "(#{data[:maxlength]})" if data[:maxlength]
|
22
19
|
sql << " PRIMARY KEY" if data[:primarykey]
|
23
20
|
sql << " AUTO_INCREMENT" if data[:autoincr]
|
24
|
-
sql << " NOT NULL"
|
21
|
+
sql << " NOT NULL" if data.key?(:null) && !data[:null]
|
25
22
|
|
26
23
|
if data.key?(:default_func)
|
27
24
|
sql << " DEFAULT #{data[:default_func]}"
|
28
|
-
elsif data.key?(:default) && data[:default]
|
29
|
-
sql << " DEFAULT
|
25
|
+
elsif data.key?(:default) && !data[:default].nil?
|
26
|
+
sql << " DEFAULT #{@db.sqlval(data.fetch(:default))}"
|
30
27
|
end
|
31
28
|
|
32
|
-
sql << " COMMENT '#{@
|
33
|
-
sql << " AFTER
|
29
|
+
sql << " COMMENT '#{@db.escape(data.fetch(:comment))}'" if data.key?(:comment)
|
30
|
+
sql << " AFTER #{@db.sep_col}#{@db.escape_column(data.fetch(:after))}#{@db.sep_col}" if data[:after] && !data[:first]
|
34
31
|
sql << " FIRST" if data[:first]
|
35
32
|
sql << " STORAGE #{data[:storage].to_s.upcase}" if data[:storage]
|
36
33
|
|