baza 0.0.19 → 0.0.20

Sign up to get free protection for your applications and to get access to all the features.
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