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
@@ -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