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
@@ -1,6 +1,10 @@
1
+ Baza.load_driver("mysql")
2
+
1
3
  class Baza::Driver::MysqlJava < Baza::JdbcDriver
2
4
  path = "#{File.dirname(__FILE__)}/mysql_java"
3
5
 
6
+ autoload :Database, "#{path}/database"
7
+ autoload :Databases, "#{path}/databases"
4
8
  autoload :Table, "#{path}/table"
5
9
  autoload :Tables, "#{path}/tables"
6
10
  autoload :Column, "#{path}/column"
@@ -13,7 +17,7 @@ class Baza::Driver::MysqlJava < Baza::JdbcDriver
13
17
 
14
18
  attr_reader :conn, :conns
15
19
 
16
- #Helper to enable automatic registering of database using Baza::Db.from_object
20
+ # Helper to enable automatic registering of database using Baza::Db.from_object
17
21
  def self.from_object(args)
18
22
  if args[:object].class.name == "Java::ComMysqlJdbc::JDBC4Connection"
19
23
  return {
@@ -25,7 +29,7 @@ class Baza::Driver::MysqlJava < Baza::JdbcDriver
25
29
  }
26
30
  end
27
31
 
28
- return nil
32
+ nil
29
33
  end
30
34
 
31
35
  def initialize(baza)
@@ -36,7 +40,7 @@ class Baza::Driver::MysqlJava < Baza::JdbcDriver
36
40
  if @opts[:encoding]
37
41
  @encoding = @opts[:encoding]
38
42
  else
39
- @encoding = 'utf8'
43
+ @encoding = "utf8"
40
44
  end
41
45
 
42
46
  if @baza.opts.key?(:port)
@@ -49,7 +53,7 @@ class Baza::Driver::MysqlJava < Baza::JdbcDriver
49
53
  reconnect
50
54
  end
51
55
 
52
- #Respawns the connection to the MySQL-database.
56
+ # Respawns the connection to the MySQL-database.
53
57
  def reconnect
54
58
  @mutex.synchronize do
55
59
  if @baza.opts[:conn]
@@ -61,23 +65,23 @@ class Baza::Driver::MysqlJava < Baza::JdbcDriver
61
65
  end
62
66
 
63
67
  query_no_result_set("SET SQL_MODE = ''")
64
- query_no_result_set("SET NAMES '#{self.esc(@encoding)}'") if @encoding
68
+ query_no_result_set("SET NAMES '#{esc(@encoding)}'") if @encoding
65
69
  end
66
70
  end
67
71
 
68
- #Returns the last inserted ID for the connection.
72
+ # Returns the last inserted ID for the connection.
69
73
  def last_id
70
74
  data = query("SELECT LAST_INSERT_ID() AS id").fetch
71
75
  return data[:id].to_i if data[:id]
72
76
  raise "Could not figure out last inserted ID."
73
77
  end
74
78
 
75
- #Closes the connection threadsafe.
79
+ # Closes the connection threadsafe.
76
80
  def close
77
81
  @mutex.synchronize { @conn.close }
78
82
  end
79
83
 
80
- #Destroyes the connection.
84
+ # Destroyes the connection.
81
85
  def destroy
82
86
  @conn = nil
83
87
  @baza = nil
@@ -87,7 +91,7 @@ class Baza::Driver::MysqlJava < Baza::JdbcDriver
87
91
  @port = nil
88
92
  end
89
93
 
90
- #Inserts multiple rows in a table. Can return the inserted IDs if asked to in arguments.
94
+ # Inserts multiple rows in a table. Can return the inserted IDs if asked to in arguments.
91
95
  def insert_multi(tablename, arr_hashes, args = nil)
92
96
  sql = "INSERT INTO `#{tablename}` ("
93
97
 
@@ -103,7 +107,7 @@ class Baza::Driver::MysqlJava < Baza::JdbcDriver
103
107
  keys.each do |col_name|
104
108
  sql << "," unless first
105
109
  first = false if first
106
- sql << "`#{self.esc_col(col_name)}`"
110
+ sql << "`#{escape_column(col_name)}`"
107
111
  end
108
112
 
109
113
  sql << ") VALUES ("
@@ -128,7 +132,7 @@ class Baza::Driver::MysqlJava < Baza::JdbcDriver
128
132
  sql << @baza.sqlval(val)
129
133
  end
130
134
  else
131
- hash.each do |key, val|
135
+ hash.each do |_key, val|
132
136
  if first_key
133
137
  first_key = false
134
138
  else
@@ -147,7 +151,7 @@ class Baza::Driver::MysqlJava < Baza::JdbcDriver
147
151
  query_no_result_set(sql)
148
152
 
149
153
  if args && args[:return_id]
150
- first_id = self.last_id
154
+ first_id = last_id
151
155
  raise "Invalid ID: #{first_id}" if first_id.to_i <= 0
152
156
  ids = [first_id]
153
157
  1.upto(arr_hashes.length - 1) do |count|
@@ -1,30 +1,30 @@
1
- #This class handels all the SQLite3-columns.
1
+ # This class handels all the SQLite3-columns.
2
2
  class Baza::Driver::Sqlite3::Column < Baza::Column
3
3
  attr_reader :args
4
4
 
5
- #Constructor. This should not be called manually.
5
+ # Constructor. This should not be called manually.
6
6
  def initialize(args)
7
7
  @args = args
8
8
  @db = @args[:db]
9
9
  end
10
10
 
11
- #Returns the name of the column.
11
+ # Returns the name of the column.
12
12
  def name
13
- return @args[:data][:name].to_sym
13
+ @args[:data][:name]
14
14
  end
15
15
 
16
16
  def table_name
17
17
  @args[:table_name]
18
18
  end
19
19
 
20
- #Returns the columns table-object.
20
+ # Returns the columns table-object.
21
21
  def table
22
- return @db.tables[table_name]
22
+ @db.tables[table_name]
23
23
  end
24
24
 
25
- #Returns the data of the column as a hash in knjdb-format.
25
+ # Returns the data of the column as a hash in knjdb-format.
26
26
  def data
27
- return {
27
+ {
28
28
  type: type,
29
29
  name: name,
30
30
  null: null?,
@@ -35,9 +35,9 @@ class Baza::Driver::Sqlite3::Column < Baza::Column
35
35
  }
36
36
  end
37
37
 
38
- #Returns the type of the column.
38
+ # Returns the type of the column.
39
39
  def type
40
- if !@type
40
+ unless @type
41
41
  if match = @args[:data][:type].match(/^([A-z]+)$/)
42
42
  @maxlength = false
43
43
  type = match[0].to_sym
@@ -50,8 +50,8 @@ class Baza::Driver::Sqlite3::Column < Baza::Column
50
50
  elsif match = @args[:data][:type].match(/^(.+)\((\d+)\)$/)
51
51
  @maxlength = match[2]
52
52
  type = match[1].to_sym
53
- elsif @args[:data].key?(:type) and @args[:data][:type].to_s == ""
54
- #A type can actually be empty in SQLite... Wtf?
53
+ elsif @args[:data].key?(:type) && @args[:data][:type].to_s == ""
54
+ # A type can actually be empty in SQLite... Wtf?
55
55
  return @args[:data][:type]
56
56
  end
57
57
 
@@ -64,23 +64,23 @@ class Baza::Driver::Sqlite3::Column < Baza::Column
64
64
  raise "Still not type? (#{@args[:data]})" if @type.to_s.strip.empty?
65
65
  end
66
66
 
67
- return @type
67
+ @type
68
68
  end
69
69
 
70
- #Returns true if the column allows null. Otherwise false.
70
+ # Returns true if the column allows null. Otherwise false.
71
71
  def null?
72
72
  return false if @args[:data][:notnull].to_i == 1
73
- return true
73
+ true
74
74
  end
75
75
 
76
- #Returns the maxlength of the column.
76
+ # Returns the maxlength of the column.
77
77
  def maxlength
78
- self.type if !@maxlength
78
+ type unless @maxlength
79
79
  return @maxlength if @maxlength
80
- return false
80
+ false
81
81
  end
82
82
 
83
- #Returns the default value of the column.
83
+ # Returns the default value of the column.
84
84
  def default
85
85
  def_val = @args[:data][:dflt_value]
86
86
 
@@ -89,38 +89,38 @@ class Baza::Driver::Sqlite3::Column < Baza::Column
89
89
  end
90
90
 
91
91
  return false if @args[:data][:dflt_value].to_s.empty?
92
- return def_val
92
+ def_val
93
93
  end
94
94
 
95
- #Returns true if the column is the primary key.
95
+ # Returns true if the column is the primary key.
96
96
  def primarykey?
97
97
  return false if @args[:data][:pk].to_i == 0
98
- return true
98
+ true
99
99
  end
100
100
 
101
- #Returns true if the column is auto-increasing.
101
+ # Returns true if the column is auto-increasing.
102
102
  def autoincr?
103
- return true if @args[:data][:pk].to_i == 1 && @args[:data][:type].to_sym == :integer
104
- return false
103
+ return true if @args[:data][:pk].to_i == 1 && @args[:data][:type].to_s == "integer"
104
+ false
105
105
  end
106
106
 
107
- #Drops the column from the table.
107
+ # Drops the column from the table.
108
108
  def drop
109
109
  table.copy(drops: name)
110
110
  end
111
111
 
112
112
  def reload
113
- @db.q("PRAGMA table_info(`#{@db.esc_table(table_name)}`)") do |data|
114
- next unless data[:name] == @args[:data][:name]
113
+ @db.q("PRAGMA table_info(`#{@db.escape_table(table_name)}`)") do |data|
114
+ next unless data.fetch(:name) == name
115
115
  @args[:data] = data
116
116
  @type = nil
117
- return
117
+ return nil
118
118
  end
119
119
 
120
- raise "Could not find data for column: #{table_name}.#{name}"
120
+ raise Baza::Errors::ColumnNotFound, "Could not find data for column: #{table_name}.#{name}"
121
121
  end
122
122
 
123
- #Changes data on the column. Like the name, type, maxlength or whatever.
123
+ # Changes data on the column. Like the name, type, maxlength or whatever.
124
124
  def change(data)
125
125
  newdata = data.clone
126
126
 
@@ -136,11 +136,11 @@ class Baza::Driver::Sqlite3::Column < Baza::Column
136
136
 
137
137
  new_table = table.copy(
138
138
  alter_columns: {
139
- name.to_sym => newdata
139
+ name => newdata
140
140
  }
141
141
  )
142
142
 
143
- @args[:data][:name] = newdata[:name].to_s
143
+ @args[:data][:name] = newdata.fetch(:name).to_s
144
144
  reload
145
145
  end
146
146
  end
@@ -1,16 +1,16 @@
1
- #This class handels the SQLite3-specific behaviour for columns.
1
+ # This class handels the SQLite3-specific behaviour for columns.
2
2
  class Baza::Driver::Sqlite3::Columns
3
3
  attr_reader :db
4
4
 
5
- #Constructor. This should not be called manually.
5
+ # Constructor. This should not be called manually.
6
6
  def initialize(args)
7
7
  @args = args
8
8
  end
9
9
 
10
10
  DATA_SQL_ALLOWED_KEYS = [:name, :type, :maxlength, :autoincr, :primarykey, :null, :default, :default_func, :renames, :after, :renames]
11
- #Returns SQL for a knjdb-compatible hash.
11
+ # Returns SQL for a knjdb-compatible hash.
12
12
  def data_sql(data)
13
- data.each do |key, val|
13
+ data.each_key do |key|
14
14
  raise "Invalid key: '#{key}' (#{key.class.name})." unless DATA_SQL_ALLOWED_KEYS.include?(key)
15
15
  end
16
16
 
@@ -33,7 +33,7 @@ class Baza::Driver::Sqlite3::Columns
33
33
 
34
34
  if !data[:null] && data.key?(:null)
35
35
  sql << " NOT NULL"
36
- data[:default] = 0 if type == :int if !data.key?(:default) || !data[:default]
36
+ data[:default] = 0 if !data.key?(:default) || !data[:default] && type == :int
37
37
  end
38
38
 
39
39
  if data.key?(:default_func)
@@ -42,6 +42,6 @@ class Baza::Driver::Sqlite3::Columns
42
42
  sql << " DEFAULT '#{@args[:db].escape(data[:default])}'"
43
43
  end
44
44
 
45
- return sql
45
+ sql
46
46
  end
47
47
  end
@@ -0,0 +1,2 @@
1
+ class Baza::Driver::Sqlite3::Database < Baza::Database
2
+ end
@@ -0,0 +1,25 @@
1
+ class Baza::Driver::Sqlite3::Databases
2
+ def initialize(args)
3
+ @db = args.fetch(:db)
4
+ raise "Db wasn't a baza object" unless @db.class.name.include?("Baza")
5
+ end
6
+
7
+ def [](name)
8
+ name = name.to_s
9
+ list.each do |database|
10
+ return database if database.name == name
11
+ end
12
+
13
+ raise Baza::Errors::DatabaseNotFound
14
+ end
15
+
16
+ def list
17
+ ArrayEnumerator.new do |yielder|
18
+ yielder << Baza::Driver::Sqlite3::Database.new(
19
+ name: "Main",
20
+ driver: self,
21
+ db: @db
22
+ )
23
+ end
24
+ end
25
+ end
@@ -3,20 +3,21 @@ class Baza::Driver::Sqlite3::Index < Baza::Index
3
3
 
4
4
  def initialize(args)
5
5
  @args = args
6
+ @data = args.delete(:data)
6
7
  @columns = []
7
8
  @db = args[:db]
8
9
  end
9
10
 
10
11
  def name
11
- return @args[:data][:name]
12
+ @data.fetch(:name)
12
13
  end
13
14
 
14
15
  def table_name
15
- return @args[:table_name]
16
+ @args.fetch(:table_name)
16
17
  end
17
18
 
18
19
  def table
19
- return @db.tables[table_name]
20
+ @db.tables[table_name]
20
21
  end
21
22
 
22
23
  def drop
@@ -31,11 +32,11 @@ class Baza::Driver::Sqlite3::Index < Baza::Index
31
32
 
32
33
  drop
33
34
  table.create_indexes([create_args])
34
- @args[:data][:name] = newname
35
+ @data[:name] = newname
35
36
  end
36
37
 
37
38
  def data
38
- return {
39
+ {
39
40
  name: name,
40
41
  unique: unique?,
41
42
  columns: @columns
@@ -47,6 +48,19 @@ class Baza::Driver::Sqlite3::Index < Baza::Index
47
48
  end
48
49
 
49
50
  def unique?
50
- @args[:data][:unique].to_i == 1
51
+ @data.fetch(:unique).to_i == 1
52
+ end
53
+
54
+ def reload
55
+ data = nil
56
+ @db.query("PRAGMA index_list(`#{@db.escape_table(name)}`)") do |d_indexes|
57
+ next unless d_indexes.fetch(:name) == name
58
+ data = d_indexes
59
+ break
60
+ end
61
+
62
+ raise Baza::Errors::IndexNotFound unless data
63
+ @data = data
64
+ self
51
65
  end
52
66
  end
@@ -8,7 +8,7 @@ class Baza::Driver::Sqlite3::Result < Baza::ResultBase
8
8
  @statement.execute
9
9
  @type_translation = driver.baza.opts[:type_translation]
10
10
  @types = statement.types if @type_translation == true
11
- @columns = statement.columns.map { |column| column.to_sym }
11
+ @columns = statement.columns.map(&:to_sym)
12
12
  read_results
13
13
  @index = -1
14
14
  ensure
@@ -19,16 +19,15 @@ class Baza::Driver::Sqlite3::Result < Baza::ResultBase
19
19
  # Returns a single result.
20
20
  def fetch
21
21
  row = @results[@index += 1]
22
+ return unless row
22
23
 
23
- if row
24
- if @types
25
- row.map!.with_index { |value, index| translate_type(value, @types[index]) } if @types
26
- elsif @type_translation == :string
27
- row.map! { |value| value.to_s }
28
- end
29
-
30
- return Hash[*@columns.zip(row).flatten]
24
+ if @types
25
+ row.map!.with_index { |value, index| translate_type(value, @types[index]) } if @types
26
+ elsif @type_translation == :string
27
+ row.map!(&:to_s)
31
28
  end
29
+
30
+ Hash[*@columns.zip(row).flatten]
32
31
  end
33
32
 
34
33
  # Loops over every result yielding them.
@@ -51,14 +50,14 @@ private
51
50
  end
52
51
 
53
52
  def translate_type(value, type)
54
- if value
55
- if type == 'datetime'
56
- return Time.parse(value)
57
- elsif type == 'date'
58
- return Date.parse(value)
59
- else
60
- return value
61
- end
53
+ return unless value
54
+
55
+ if type == "datetime"
56
+ Time.parse(value)
57
+ elsif type == "date"
58
+ Date.parse(value)
59
+ else
60
+ value
62
61
  end
63
62
  end
64
63
  end
@@ -1,5 +1,5 @@
1
1
  class Baza::Driver::Sqlite3::Sqlspecs < Baza::Sqlspecs
2
2
  def strftime(val, col_str)
3
- return "STRFTIME('#{val}', SUBSTR(#{col_str}, 0, 20))"
3
+ "STRFTIME('#{val}', SUBSTR(#{col_str}, 0, 20))"
4
4
  end
5
5
  end