baza 0.0.19 → 0.0.20

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.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +157 -0
  3. data/Gemfile +11 -9
  4. data/Gemfile.lock +41 -9
  5. data/README.md +1 -1
  6. data/Rakefile +19 -16
  7. data/VERSION +1 -1
  8. data/baza.gemspec +31 -7
  9. data/config/best_project_practice_rubocop.yml +2 -0
  10. data/config/best_project_practice_rubocop_todo.yml +157 -0
  11. data/lib/baza/base_sql_driver.rb +79 -20
  12. data/lib/baza/cloner.rb +2 -2
  13. data/lib/baza/column.rb +6 -0
  14. data/lib/baza/database.rb +33 -0
  15. data/lib/baza/database_model.rb +26 -0
  16. data/lib/baza/database_model_functionality.rb +10 -0
  17. data/lib/baza/database_model_name.rb +16 -0
  18. data/lib/baza/db.rb +210 -413
  19. data/lib/baza/dbtime.rb +20 -20
  20. data/lib/baza/driver.rb +3 -3
  21. data/lib/baza/drivers/active_record/columns.rb +1 -1
  22. data/lib/baza/drivers/active_record/indexes.rb +1 -1
  23. data/lib/baza/drivers/active_record/result.rb +3 -5
  24. data/lib/baza/drivers/active_record/tables.rb +2 -2
  25. data/lib/baza/drivers/active_record.rb +30 -16
  26. data/lib/baza/drivers/mysql/column.rb +51 -48
  27. data/lib/baza/drivers/mysql/columns.rb +8 -8
  28. data/lib/baza/drivers/mysql/database.rb +28 -0
  29. data/lib/baza/drivers/mysql/databases.rb +35 -0
  30. data/lib/baza/drivers/mysql/index.rb +32 -22
  31. data/lib/baza/drivers/mysql/result.rb +24 -24
  32. data/lib/baza/drivers/mysql/sqlspecs.rb +1 -1
  33. data/lib/baza/drivers/mysql/table.rb +80 -91
  34. data/lib/baza/drivers/mysql/tables.rb +30 -32
  35. data/lib/baza/drivers/mysql/unbuffered_result.rb +5 -5
  36. data/lib/baza/drivers/mysql.rb +127 -220
  37. data/lib/baza/drivers/mysql2/database.rb +2 -0
  38. data/lib/baza/drivers/mysql2/databases.rb +2 -0
  39. data/lib/baza/drivers/mysql2/result.rb +3 -5
  40. data/lib/baza/drivers/mysql2.rb +21 -106
  41. data/lib/baza/drivers/mysql_java/database.rb +2 -0
  42. data/lib/baza/drivers/mysql_java/databases.rb +2 -0
  43. data/lib/baza/drivers/mysql_java.rb +16 -12
  44. data/lib/baza/drivers/sqlite3/column.rb +33 -33
  45. data/lib/baza/drivers/sqlite3/columns.rb +6 -6
  46. data/lib/baza/drivers/sqlite3/database.rb +2 -0
  47. data/lib/baza/drivers/sqlite3/databases.rb +25 -0
  48. data/lib/baza/drivers/sqlite3/index.rb +20 -6
  49. data/lib/baza/drivers/sqlite3/result.rb +16 -17
  50. data/lib/baza/drivers/sqlite3/sqlspecs.rb +1 -1
  51. data/lib/baza/drivers/sqlite3/table.rb +99 -100
  52. data/lib/baza/drivers/sqlite3/tables.rb +30 -23
  53. data/lib/baza/drivers/sqlite3/unbuffered_result.rb +2 -2
  54. data/lib/baza/drivers/sqlite3.rb +27 -14
  55. data/lib/baza/drivers/sqlite3_java/database.rb +2 -0
  56. data/lib/baza/drivers/sqlite3_java/unbuffered_result.rb +2 -2
  57. data/lib/baza/drivers/sqlite3_java.rb +12 -10
  58. data/lib/baza/drivers/sqlite3_rhodes.rb +9 -7
  59. data/lib/baza/dump.rb +55 -55
  60. data/lib/baza/errors.rb +5 -0
  61. data/lib/baza/idquery.rb +25 -25
  62. data/lib/baza/index.rb +6 -0
  63. data/lib/baza/jdbc_driver.rb +6 -8
  64. data/lib/baza/jdbc_result.rb +1 -1
  65. data/lib/baza/model.rb +299 -309
  66. data/lib/baza/model_custom.rb +74 -72
  67. data/lib/baza/model_handler.rb +244 -255
  68. data/lib/baza/model_handler_sqlhelper.rb +122 -132
  69. data/lib/baza/mysql_base_driver.rb +112 -0
  70. data/lib/baza/query_buffer.rb +23 -23
  71. data/lib/baza/result_base.rb +2 -2
  72. data/lib/baza/revision.rb +67 -67
  73. data/lib/baza/row.rb +82 -84
  74. data/lib/baza/sqlspecs.rb +1 -1
  75. data/lib/baza/table.rb +31 -0
  76. data/lib/baza.rb +43 -10
  77. data/shippable.yml +1 -0
  78. data/spec/cloner_spec.rb +4 -4
  79. data/spec/drivers/active_record_mysql2_spec.rb +3 -3
  80. data/spec/drivers/active_record_mysql_spec.rb +2 -2
  81. data/spec/drivers/active_record_sqlite3_spec.rb +2 -2
  82. data/spec/drivers/mysql2_spec.rb +1 -0
  83. data/spec/drivers/mysql_spec.rb +1 -0
  84. data/spec/drivers/sqlite3_spec.rb +4 -5
  85. data/spec/info_active_record_example.rb +4 -6
  86. data/spec/info_active_record_mysql.rb +6 -7
  87. data/spec/info_active_record_mysql2.rb +2 -4
  88. data/spec/info_active_record_mysql2_shippable.rb +2 -4
  89. data/spec/info_active_record_mysql_shippable.rb +2 -4
  90. data/spec/info_active_record_sqlite3.rb +5 -6
  91. data/spec/info_mysql2_example.rb +1 -1
  92. data/spec/info_mysql2_shippable.rb +1 -1
  93. data/spec/info_mysql_example.rb +1 -1
  94. data/spec/info_mysql_shippable.rb +1 -1
  95. data/spec/info_sqlite3.rb +4 -3
  96. data/spec/model_handler_spec.rb +102 -115
  97. data/spec/spec_helper.rb +5 -5
  98. data/spec/support/driver_collection.rb +98 -95
  99. data/spec/support/driver_columns_collection.rb +18 -22
  100. data/spec/support/driver_databases_collection.rb +29 -0
  101. data/spec/support/driver_indexes_collection.rb +7 -6
  102. data/spec/support/driver_tables_collection.rb +38 -26
  103. metadata +49 -3
data/lib/baza/dbtime.rb CHANGED
@@ -1,35 +1,35 @@
1
- #This class helps handeling time-columns in databases.
1
+ # This class helps handeling time-columns in databases.
2
2
  class Baza::Dbtime
3
- #These variables return information about the object.
3
+ # These variables return information about the object.
4
4
  attr_reader :hours, :mins, :secs, :total_secs
5
-
6
- #Initializes the object from arguments useually given by Baza::Datarow.
5
+
6
+ # Initializes the object from arguments useually given by Baza::Datarow.
7
7
  def initialize(args)
8
- args = {:time => args} if args.is_a?(String)
9
-
10
- raise "Invalid arguments given: #{args}" if !args.is_a?(Hash)
11
- raise "No time given." if !args[:time]
12
- raise "Invalid time given: #{args[:time].class.name}" if !args[:time].is_a?(String)
13
-
8
+ args = {time: args} if args.is_a?(String)
9
+
10
+ raise "Invalid arguments given: #{args}" unless args.is_a?(Hash)
11
+ raise "No time given." unless args[:time]
12
+ raise "Invalid time given: #{args[:time].class.name}" unless args[:time].is_a?(String)
13
+
14
14
  match = args[:time].match(/^(\d+):(\d+):(\d+)$/)
15
- raise "Could not understand time format." if !match
16
-
15
+ raise "Could not understand time format." unless match
16
+
17
17
  @hours = match[1].to_i
18
18
  @mins = match[2].to_i
19
19
  @secs = match[3].to_i
20
-
20
+
21
21
  @total_secs = @hours * 3600
22
22
  @total_secs += @mins * 60
23
23
  @total_secs += @secs
24
24
  end
25
-
26
- #Returns the total amount of hours.
25
+
26
+ # Returns the total amount of hours.
27
27
  def hours_total
28
- return (@total_secs.to_f / 3600)
28
+ (@total_secs.to_f / 3600)
29
29
  end
30
-
31
- #Return the total amount of minutes.
30
+
31
+ # Return the total amount of minutes.
32
32
  def mins_total
33
- return (@total_secs.to_f / 60)
33
+ (@total_secs.to_f / 60)
34
34
  end
35
- end
35
+ end
data/lib/baza/driver.rb CHANGED
@@ -1,9 +1,9 @@
1
- #Subclass that contains all the drivers as further subclasses.
1
+ # Subclass that contains all the drivers as further subclasses.
2
2
  class Baza::Driver
3
- #Autoloader for drivers.
3
+ # Autoloader for drivers.
4
4
  def self.const_missing(name)
5
5
  require_relative "drivers/#{StringCases.camel_to_snake(name)}.rb"
6
6
  raise LoadError, "Still not loaded: '#{name}'." unless Baza::Driver.const_defined?(name)
7
- return Baza::Driver.const_get(name)
7
+ Baza::Driver.const_get(name)
8
8
  end
9
9
  end
@@ -1,7 +1,7 @@
1
1
  class Baza::Driver::ActiveRecord::Columns
2
2
  def initialize(args)
3
3
  @args = args
4
- @proxy_to = ::Baza::Driver.const_get(StringCases.snake_to_camel(@args[:db].conn.conn_type)).const_get(:Columns).new(@args)
4
+ @proxy_to = ::Baza::Driver.const_get(StringCases.snake_to_camel(@args[:db].driver.driver_type)).const_get(:Columns).new(@args)
5
5
  end
6
6
 
7
7
  def method_missing(name, *args, &blk)
@@ -1,7 +1,7 @@
1
1
  class Baza::Driver::ActiveRecord::Indexes
2
2
  def initialize(args)
3
3
  @args = args
4
- @proxy_to = ::Baza::Driver.const_get(StringCases.snake_to_camel(@args[:db].conn.conn_type)).const_get(:Indexes).new(@args)
4
+ @proxy_to = ::Baza::Driver.const_get(StringCases.snake_to_camel(@args[:db].driver.driver_type)).const_get(:Indexes).new(@args)
5
5
  end
6
6
 
7
7
  def method_missing(name, *args, &blk)
@@ -5,11 +5,9 @@ class Baza::Driver::ActiveRecord::Result < Baza::ResultBase
5
5
  end
6
6
 
7
7
  def fetch
8
- begin
9
- return to_enum.next
10
- rescue StopIteration
11
- return false
12
- end
8
+ return to_enum.next
9
+ rescue StopIteration
10
+ return false
13
11
  end
14
12
 
15
13
  def each
@@ -2,8 +2,8 @@ class Baza::Driver::ActiveRecord::Tables
2
2
  def initialize(args)
3
3
  @args = args
4
4
 
5
- require "#{File.dirname(__FILE__)}/../#{@args[:db].conn.conn_type}"
6
- @proxy_to = ::Baza::Driver.const_get(StringCases.snake_to_camel(@args[:db].conn.conn_type)).const_get(:Tables).new(@args)
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(:Tables).new(@args)
7
7
  end
8
8
 
9
9
  def method_missing(name, *args, &blk)
@@ -1,4 +1,4 @@
1
- class Baza::Driver::ActiveRecord
1
+ class Baza::Driver::ActiveRecord < Baza::BaseSqlDriver
2
2
  path = "#{File.dirname(__FILE__)}/active_record"
3
3
 
4
4
  autoload :Tables, "#{path}/tables"
@@ -6,7 +6,7 @@ class Baza::Driver::ActiveRecord
6
6
  autoload :Indexes, "#{path}/indexes"
7
7
  autoload :Result, "#{path}/result"
8
8
 
9
- attr_reader :baza, :conn, :sep_table, :sep_col, :sep_val, :symbolize, :conn_type
9
+ attr_reader :baza, :conn, :sep_table, :sep_col, :sep_val, :symbolize, :driver_type
10
10
  attr_accessor :tables, :cols, :indexes
11
11
 
12
12
  def self.from_object(args)
@@ -26,38 +26,48 @@ class Baza::Driver::ActiveRecord
26
26
  }
27
27
  end
28
28
 
29
- return nil
29
+ nil
30
30
  end
31
31
 
32
32
  def initialize(baza)
33
33
  @baza = baza
34
- @conn = @baza.opts[:conn]
34
+ @conn = @baza.opts.fetch(:conn)
35
35
 
36
- raise 'No conn given' unless @conn
36
+ raise "No conn given" unless @conn
37
37
 
38
38
  conn_name = @conn.class.name.to_s.downcase
39
39
 
40
40
  if conn_name.include?("mysql2")
41
+ require_relative "mysql2"
42
+ require_relative "mysql2/result"
43
+
41
44
  @sep_table = "`"
42
45
  @sep_col = "`"
43
46
  @sep_val = "'"
44
- @conn_type = :mysql2
47
+ @driver_type = :mysql2
45
48
  @result_constant = Baza::Driver::Mysql2::Result
46
49
  elsif conn_name.include?("mysql")
50
+ require_relative "mysql"
51
+ require_relative "mysql/result"
52
+
47
53
  @sep_table = "`"
48
54
  @sep_col = "`"
49
55
  @sep_val = "'"
50
- @conn_type = :mysql
51
- @result_constant = Baza::Driver::Mysql::Result unless RUBY_PLATFORM == 'java'
56
+ @driver_type = :mysql
57
+ @result_constant = Baza::Driver::Mysql::Result unless RUBY_PLATFORM == "java"
52
58
  elsif conn_name.include?("sqlite")
53
59
  @sep_table = "`"
54
60
  @sep_col = "`"
55
61
  @sep_val = "'"
56
- @conn_type = :sqlite3
62
+ @driver_type = :sqlite3
57
63
  else
58
64
  raise "Unknown type: '#{conn_name}'."
59
65
  end
60
66
 
67
+ if conn_name.include?("mysql")
68
+ @baza.opts[:db] ||= query("SELECT DATABASE()").fetch.fetch(:"DATABASE()")
69
+ end
70
+
61
71
  @result_constant ||= Baza::Driver::ActiveRecord::Result
62
72
  end
63
73
 
@@ -65,22 +75,22 @@ class Baza::Driver::ActiveRecord
65
75
  @result_constant.new(self, @conn.execute(sql))
66
76
  end
67
77
 
68
- alias query_ubuf query
78
+ alias_method :query_ubuf, :query
69
79
 
70
80
  def escape(str)
71
81
  @conn.quote_string(str.to_s)
72
82
  end
73
83
 
74
- def esc_col(string)
84
+ def escape_column(string)
75
85
  string = string.to_s
76
86
  raise "Invalid column-string: #{string}" if string.include?(@sep_col)
77
- return string
87
+ string
78
88
  end
79
89
 
80
- def esc_table(string)
90
+ def escape_table(string)
81
91
  string = string.to_s
82
92
  raise "Invalid column-string: #{string}" if string.include?(@sep_col)
83
- return string
93
+ string
84
94
  end
85
95
 
86
96
  def close
@@ -88,9 +98,9 @@ class Baza::Driver::ActiveRecord
88
98
  end
89
99
 
90
100
  def transaction
91
- if @conn_type == :mysql || @conn_type == :mysql2
101
+ if @driver_type == :mysql || @driver_type == :mysql2
92
102
  query("START TRANSACTION")
93
- elsif @conn_type == :sqlite3
103
+ elsif @driver_type == :sqlite3
94
104
  query("BEGIN TRANSACTION")
95
105
  else
96
106
  raise "Don't know how to start transaction"
@@ -104,4 +114,8 @@ class Baza::Driver::ActiveRecord
104
114
  raise
105
115
  end
106
116
  end
117
+
118
+ def supports_multiple_databases?
119
+ conn_name.include?("mysql")
120
+ end
107
121
  end
@@ -1,31 +1,32 @@
1
- #This class handels every MySQL-column, that can be returned from a table-object.
1
+ # This class handels every MySQL-column, that can be returned from a table-object.
2
2
  class Baza::Driver::Mysql::Column < Baza::Column
3
3
  attr_reader :args, :name
4
4
 
5
- #Constructor. Should not be called manually.
5
+ # Constructor. Should not be called manually.
6
6
  def initialize(args)
7
7
  @args = args
8
- @name = @args[:data][:Field].to_sym
9
- @db = @args[:db]
8
+ @data = @args.delete(:data)
9
+ @name = @data.fetch(:Field)
10
+ @db = @args.fetch(:db)
10
11
  end
11
12
 
12
- #Used to validate in Wref::Map.
13
+ # Used to validate in Wref::Map.
13
14
  def __object_unique_id__
14
- return @name
15
+ @name
15
16
  end
16
17
 
17
18
  def table_name
18
- @args[:table_name]
19
+ @args.fetch(:table_name)
19
20
  end
20
21
 
21
- #Returns the table-object that this column belongs to.
22
+ # Returns the table-object that this column belongs to.
22
23
  def table
23
- return @db.tables[table_name]
24
+ @db.tables[table_name]
24
25
  end
25
26
 
26
- #Returns all data of the column in the knjdb-format.
27
+ # Returns all data of the column in the knjdb-format.
27
28
  def data
28
- return {
29
+ {
29
30
  type: type,
30
31
  name: name,
31
32
  null: null?,
@@ -37,96 +38,98 @@ class Baza::Driver::Mysql::Column < Baza::Column
37
38
  end
38
39
 
39
40
  def reload
40
- @args[:data] = @db.query("SHOW FULL COLUMNS FROM `#{@db.esc_table(table_name)}` WHERE `Field` = '#{@db.esc(name)}'").fetch
41
+ data = @db.query("SHOW FULL COLUMNS FROM `#{@db.escape_table(table_name)}` WHERE `Field` = '#{@db.esc(name)}'").fetch
42
+ raise Baza::Errors::ColumnNotFound unless data
43
+ @data = data
41
44
  @type = nil
42
45
  end
43
46
 
44
- #Returns the type of the column (integer, varchar etc.).
47
+ # Returns the type of the column (integer, varchar etc.).
45
48
  def type
46
- if !@type
47
- if match = @args[:data][:Type].match(/^([A-z]+)$/)
49
+ unless @type
50
+ if match = @data[:Type].match(/^([A-z]+)$/)
48
51
  @maxlength = false
49
52
  @type = match[0].to_sym
50
- elsif match = @args[:data][:Type].match(/^decimal\((\d+),(\d+)\)$/)
53
+ elsif match = @data[:Type].match(/^decimal\((\d+),(\d+)\)$/)
51
54
  @maxlength = "#{match[1]},#{match[2]}"
52
55
  @type = :decimal
53
- elsif match = @args[:data][:Type].match(/^enum\((.+)\)$/)
56
+ elsif match = @data[:Type].match(/^enum\((.+)\)$/)
54
57
  @maxlength = match[1]
55
58
  @type = :enum
56
- elsif match = @args[:data][:Type].match(/^(.+)\((\d+)\)/)
59
+ elsif match = @data[:Type].match(/^(.+)\((\d+)\)/)
57
60
  @maxlength = match[2].to_i
58
61
  @type = match[1].to_sym
59
62
  end
60
63
 
61
- raise "Still not type from: '#{@args[:data][:Type]}'." if @type.to_s.strip.empty?
64
+ raise "Still not type from: '#{@data[:Type]}'." if @type.to_s.strip.empty?
62
65
  end
63
66
 
64
- return @type
67
+ @type
65
68
  end
66
69
 
67
- #Return true if the columns allows null. Otherwise false.
70
+ # Return true if the columns allows null. Otherwise false.
68
71
  def null?
69
- return false if @args[:data][:Null] == "NO"
70
- return true
72
+ return false if @data[:Null] == "NO"
73
+ true
71
74
  end
72
75
 
73
- #Returns the maxlength.
76
+ # Returns the maxlength.
74
77
  def maxlength
75
- self.type unless @maxlength
78
+ type unless @maxlength
76
79
  return @maxlength if @maxlength
77
- return false
80
+ false
78
81
  end
79
82
 
80
- #Returns the default value for the column.
83
+ # Returns the default value for the column.
81
84
  def default
82
- return false if (self.type == :datetime || self.type == :date) && @args[:data][:Default].to_s.strip.empty?
83
- return false if (self.type == :int || self.type == :bigint) && @args[:data][:Default].to_s.strip.empty?
84
- return false if !@args[:data][:Default]
85
- return @args[:data][:Default]
85
+ return false if (type == :datetime || type == :date) && @data[:Default].to_s.strip.empty?
86
+ return false if (type == :int || type == :bigint) && @data[:Default].to_s.strip.empty?
87
+ return false unless @data[:Default]
88
+ @data.fetch(:Default)
86
89
  end
87
90
 
88
- #Returns true if the column is the primary key. Otherwise false.
91
+ # Returns true if the column is the primary key. Otherwise false.
89
92
  def primarykey?
90
- return true if @args[:data][:Key] == "PRI"
91
- return false
93
+ return true if @data.fetch(:Key) == "PRI"
94
+ false
92
95
  end
93
96
 
94
- #Returns true if the column is auto-increasing. Otherwise false.
97
+ # Returns true if the column is auto-increasing. Otherwise false.
95
98
  def autoincr?
96
- return true if @args[:data][:Extra].include?("auto_increment")
97
- return false
99
+ return true if @data.fetch(:Extra).include?("auto_increment")
100
+ false
98
101
  end
99
102
 
100
- #Returns the comment for the column.
103
+ # Returns the comment for the column.
101
104
  def comment
102
- return @args[:data][:Comment]
105
+ @data.fetch(:Comment)
103
106
  end
104
107
 
105
- #Drops the column from the table.
108
+ # Drops the column from the table.
106
109
  def drop
107
- @args[:db].query("ALTER TABLE `#{@db.esc_table(@args[:table_name])}` DROP COLUMN `#{@db.esc_col(self.name)}`")
110
+ @db.query("ALTER TABLE `#{@db.escape_table(table_name)}` DROP COLUMN `#{@db.escape_column(name)}`")
108
111
  table.__send__(:remove_column_from_list, self)
109
- return nil
112
+ nil
110
113
  end
111
114
 
112
- #Changes the column properties by the given hash.
115
+ # Changes the column properties by the given hash.
113
116
  def change(data)
114
- col_escaped = "`#{@db.esc_col(name)}`"
115
- table_escape = "`#{@db.esc_table(table_name)}`"
117
+ col_escaped = "`#{@db.escape_column(name)}`"
118
+ table_escape = "`#{@db.escape_table(table_name)}`"
116
119
  newdata = data.clone
117
120
 
118
121
  newdata[:name] = name unless newdata.key?(:name)
119
122
  newdata[:type] = type unless newdata.key?(:type)
120
123
  newdata[:maxlength] = maxlength if !newdata.key?(:maxlength) && maxlength
121
124
  newdata[:null] = null? unless newdata.key?(:null)
122
- newdata[:default] = self.default if !newdata.key?(:default) && default
125
+ newdata[:default] = default if !newdata.key?(:default) && default
123
126
  newdata.delete(:primarykey) if newdata.key?(:primarykey)
124
127
 
125
128
  drop_add = true if name.to_s != newdata[:name].to_s
126
129
 
127
130
  table.__send__(:remove_column_from_list, self) if drop_add
128
- @db.query("ALTER TABLE #{table_escape} CHANGE #{col_escaped} #{@args[:db].cols.data_sql(newdata)}")
129
- @name = newdata[:name].to_sym
131
+ @db.query("ALTER TABLE #{table_escape} CHANGE #{col_escaped} #{@db.cols.data_sql(newdata)}")
132
+ @name = newdata[:name].to_s
130
133
  reload
131
134
  table.__send__(:add_column_to_list, self) if drop_add
132
135
  end
@@ -1,15 +1,15 @@
1
- #This class handels various MySQL-column-specific operations.
1
+ # This class handels various MySQL-column-specific operations.
2
2
  class Baza::Driver::Mysql::Columns
3
- #Constructor. Should not be called manually.
3
+ # Constructor. Should not be called manually.
4
4
  def initialize(args)
5
5
  @args = args
6
6
  end
7
7
 
8
- #Returns the SQL for this column.
8
+ # Returns the SQL for this column.
9
9
  DATA_SQL_ALLOWED_KEYS = [:type, :maxlength, :name, :primarykey, :autoincr, :default, :comment, :after, :first, :storage, :null, :renames]
10
10
  def data_sql(data)
11
- data.each do |key, val|
12
- raise "Invalid key: '#{key}' (#{key.class.name})." if !DATA_SQL_ALLOWED_KEYS.include?(key)
11
+ data.each_key do |key|
12
+ raise "Invalid key: '#{key}' (#{key.class.name})." unless DATA_SQL_ALLOWED_KEYS.include?(key)
13
13
  end
14
14
 
15
15
  raise "No type given." unless data[:type]
@@ -21,7 +21,7 @@ class Baza::Driver::Mysql::Columns
21
21
  sql << "(#{data[:maxlength]})" if data[:maxlength]
22
22
  sql << " PRIMARY KEY" if data[:primarykey]
23
23
  sql << " AUTO_INCREMENT" if data[:autoincr]
24
- sql << " NOT NULL" if !data[:null]
24
+ sql << " NOT NULL" unless data[:null]
25
25
 
26
26
  if data.key?(:default_func)
27
27
  sql << " DEFAULT #{data[:default_func]}"
@@ -30,10 +30,10 @@ class Baza::Driver::Mysql::Columns
30
30
  end
31
31
 
32
32
  sql << " COMMENT '#{@args[:db].escape(data[:comment])}'" if data.key?(:comment)
33
- sql << " AFTER `#{@args[:db].esc_col(data[:after])}`" if data[:after] && !data[:first]
33
+ sql << " AFTER `#{@args[:db].escape_column(data[:after])}`" if data[:after] && !data[:first]
34
34
  sql << " FIRST" if data[:first]
35
35
  sql << " STORAGE #{data[:storage].to_s.upcase}" if data[:storage]
36
36
 
37
- return sql
37
+ sql
38
38
  end
39
39
  end
@@ -0,0 +1,28 @@
1
+ class Baza::Driver::Mysql::Database < Baza::Database
2
+ def save!
3
+ rename(name) unless name.to_s == name_was
4
+ self
5
+ end
6
+
7
+ def drop
8
+ sql = "DROP DATABASE `#{@db.escape_database(name)}`"
9
+ @db.query(sql)
10
+ self
11
+ end
12
+
13
+ private
14
+
15
+ def rename(new_name)
16
+ new_name = new_name.to_s
17
+ @db.databases.create(name: new_name)
18
+
19
+ tables.each do |table|
20
+ @db.query("ALTER TABLE `#{@db.escape_database(name_was)}`.`#{@db.escape_table(table.name)}` RENAME `#{@db.escape_database(name)}`.`#{@db.escape_table(table.name)}`")
21
+ end
22
+
23
+ @db.query("DROP DATABASE `#{@db.escape_database(name_was)}`")
24
+
25
+ @name = new_name
26
+ @name_was = new_name
27
+ end
28
+ end
@@ -0,0 +1,35 @@
1
+ class Baza::Driver::Mysql::Databases
2
+ def initialize(args)
3
+ @db = args.fetch(:db)
4
+ end
5
+
6
+ def create(args)
7
+ sql = "CREATE DATABASE"
8
+ sql << " IF NOT EXISTS" if args[:if_not_exists]
9
+ sql << " `#{@db.escape_table(args.fetch(:name))}`"
10
+
11
+ @db.query(sql)
12
+ true
13
+ end
14
+
15
+ def [](name)
16
+ name = name.to_s
17
+ list.each do |database|
18
+ return database if database.name == name
19
+ end
20
+
21
+ raise Baza::Errors::DatabaseNotFound
22
+ end
23
+
24
+ def list
25
+ ArrayEnumerator.new do |yielder|
26
+ @db.query("SHOW DATABASES") do |data|
27
+ yielder << Baza::Driver::Mysql::Database.new(
28
+ name: data.fetch(:Database),
29
+ driver: self,
30
+ db: @db
31
+ )
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,68 +1,78 @@
1
1
  class Baza::Driver::Mysql::Index < Baza::Index
2
2
  attr_reader :args, :columns
3
+ attr_accessor :table_name
3
4
 
4
5
  def initialize(args)
5
- @args = args
6
+ @db = args.fetch(:db)
7
+ @data = args.fetch(:data)
8
+ @table_name = args.fetch(:table_name)
6
9
  @columns = []
7
10
  end
8
11
 
9
- #Used to validate in Wref::Map.
12
+ # Used to validate in Wref::Map.
10
13
  def __object_unique_id__
11
- return @args[:data][:Key_name]
14
+ name
12
15
  end
13
16
 
14
17
  def name
15
- return @args[:data][:Key_name]
18
+ @data.fetch(:Key_name)
16
19
  end
17
20
 
18
21
  def table
19
- return @args[:db].tables[@args[:table_name]]
22
+ @db.tables[@table_name]
20
23
  end
21
24
 
22
25
  def drop
23
- sql = "DROP INDEX `#{self.name}` ON `#{self.table.name}`"
26
+ sql = "DROP INDEX `#{name}` ON `#{@table_name}`"
24
27
 
25
28
  begin
26
- @args[:db].query(sql)
29
+ @db.query(sql)
27
30
  rescue => e
28
- #The index has already been dropped - ignore.
29
- if e.message.index("check that column/key exists") != nil
30
- #ignore.
31
- else
32
- raise e
33
- end
31
+ # The index has already been dropped - ignore.
32
+ raise e if e.message.index("check that column/key exists") == nil
34
33
  end
34
+
35
+ self
35
36
  end
36
37
 
37
- def rename newname
38
- newname = newname.to_sym
38
+ def rename(newname)
39
+ newname = newname.to_s
39
40
  create_args = data
40
41
  create_args[:name] = newname
41
42
 
42
43
  drop
43
44
  table.create_indexes([create_args])
44
- @args[:data][:Key_name] = newname
45
+ @data[:Key_name] = newname
46
+
47
+ self
45
48
  end
46
49
 
47
50
  def data
48
- return {
51
+ {
49
52
  name: name,
50
53
  columns: @columns
51
54
  }
52
55
  end
53
56
 
54
- #Returns true if the index is a unique-index.
57
+ # Returns true if the index is a unique-index.
55
58
  def unique?
56
- if @args[:data][:Index_type] == "UNIQUE" || @args[:data][:Non_unique].to_i == 0
59
+ if @data.fetch(:Index_type) == "UNIQUE" || @data.fetch(:Non_unique).to_i == 0
57
60
  return true
58
61
  else
59
62
  return false
60
63
  end
61
64
  end
62
65
 
63
- #Returns true if the index is a primary-index.
66
+ # Returns true if the index is a primary-index.
64
67
  def primary?
65
- return true if @args[:data][:Key_name] == "PRIMARY"
66
- return false
68
+ return true if @data.fetch(:Key_name) == "PRIMARY"
69
+ false
70
+ end
71
+
72
+ def reload
73
+ data = @db.query("SHOW INDEX FROM `#{@db.escape_table(@table_name)}` WHERE `Key_name` = '#{@db.esc(name)}'").fetch
74
+ raise Baza::Errors::IndexNotFound unless data
75
+ @data = data
76
+ self
67
77
  end
68
78
  end