imparcial 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. data/lib/imparcial/driver/{base → abstract}/expression/base.rb +11 -4
  2. data/lib/imparcial/driver/abstract/expression/column.rb +313 -0
  3. data/lib/imparcial/driver/abstract/expression/constraint.rb +149 -0
  4. data/lib/imparcial/driver/abstract/expression/delete.rb +88 -0
  5. data/lib/imparcial/driver/{base → abstract}/expression/index.rb +103 -96
  6. data/lib/imparcial/driver/abstract/expression/insert.rb +49 -0
  7. data/lib/imparcial/driver/{base → abstract}/expression/lock.rb +1 -1
  8. data/lib/imparcial/driver/{base/expression/util.rb → abstract/expression/record.rb} +8 -12
  9. data/lib/imparcial/driver/{base → abstract}/expression/select.rb +6 -4
  10. data/lib/imparcial/driver/{base → abstract}/expression/sequence.rb +133 -62
  11. data/lib/imparcial/driver/{base → abstract}/expression/statement.rb +1 -1
  12. data/lib/imparcial/driver/abstract/expression/table.rb +416 -0
  13. data/lib/imparcial/driver/abstract/expression/transaction.rb +143 -0
  14. data/lib/imparcial/driver/{base → abstract}/expression/update.rb +20 -3
  15. data/lib/imparcial/driver/abstract/expression.rb +24 -0
  16. data/lib/imparcial/driver/{base → abstract}/result.rb +12 -11
  17. data/lib/imparcial/driver/abstract/sql/column.rb +103 -0
  18. data/lib/imparcial/driver/abstract/sql/constraint.rb +42 -0
  19. data/lib/imparcial/driver/{base → abstract}/sql/delete.rb +1 -1
  20. data/lib/imparcial/driver/{base → abstract}/sql/index.rb +3 -11
  21. data/lib/imparcial/driver/{base → abstract}/sql/insert.rb +1 -1
  22. data/lib/imparcial/driver/abstract/sql/record.rb +19 -0
  23. data/lib/imparcial/driver/{base → abstract}/sql/select.rb +2 -2
  24. data/lib/imparcial/driver/{base → abstract}/sql/sequence.rb +2 -2
  25. data/lib/imparcial/driver/{base/sql/table_operation.rb → abstract/sql/table.rb} +8 -15
  26. data/lib/imparcial/driver/{base → abstract}/sql/transaction.rb +5 -5
  27. data/lib/imparcial/driver/{base → abstract}/sql/update.rb +1 -1
  28. data/lib/imparcial/driver/abstract/sql.rb +21 -0
  29. data/lib/imparcial/driver/{base → abstract}/typemap.rb +43 -89
  30. data/lib/imparcial/driver/{base → abstract}/util.rb +17 -5
  31. data/lib/imparcial/driver/abstract.rb +255 -0
  32. data/lib/imparcial/driver/mysql/expression/table.rb +2 -11
  33. data/lib/imparcial/driver/mysql/expression.rb +4 -4
  34. data/lib/imparcial/driver/mysql/result.rb +1 -1
  35. data/lib/imparcial/driver/mysql/sql/column.rb +59 -0
  36. data/lib/imparcial/driver/mysql/sql/constraint.rb +39 -0
  37. data/lib/imparcial/driver/mysql/sql/index.rb +14 -23
  38. data/lib/imparcial/driver/mysql/sql/sequence.rb +1 -1
  39. data/lib/imparcial/driver/mysql/sql/{table_metadata.rb → table.rb} +29 -5
  40. data/lib/imparcial/driver/mysql/sql.rb +7 -7
  41. data/lib/imparcial/driver/mysql/typemap.rb +1 -1
  42. data/lib/imparcial/driver/mysql/util.rb +1 -1
  43. data/lib/imparcial/driver/mysql.rb +19 -18
  44. data/lib/imparcial/driver/postgre/expression.rb +26 -7
  45. data/lib/imparcial/driver/postgre/result.rb +1 -1
  46. data/lib/imparcial/driver/postgre/sql/column.rb +53 -0
  47. data/lib/imparcial/driver/postgre/sql/constraint.rb +37 -0
  48. data/lib/imparcial/driver/postgre/sql/index.rb +21 -21
  49. data/lib/imparcial/driver/postgre/sql/sequence.rb +6 -4
  50. data/lib/imparcial/driver/postgre/sql/{table_metadata.rb → table.rb} +8 -8
  51. data/lib/imparcial/driver/postgre/sql.rb +7 -7
  52. data/lib/imparcial/driver/postgre/typemap.rb +2 -2
  53. data/lib/imparcial/driver/postgre/util.rb +1 -1
  54. data/lib/imparcial/driver/postgre.rb +11 -11
  55. data/lib/imparcial/driver.rb +1 -1
  56. data/lib/imparcial/exception.rb +28 -18
  57. data/lib/imparcial/initializer.rb +62 -0
  58. data/lib/imparcial.rb +1 -74
  59. metadata +50 -50
  60. data/lib/imparcial/driver/base/expression/delete.rb +0 -72
  61. data/lib/imparcial/driver/base/expression/insert.rb +0 -33
  62. data/lib/imparcial/driver/base/expression/table_diff.rb +0 -154
  63. data/lib/imparcial/driver/base/expression/table_evolution.rb +0 -94
  64. data/lib/imparcial/driver/base/expression/table_metadata.rb +0 -122
  65. data/lib/imparcial/driver/base/expression/table_operation.rb +0 -137
  66. data/lib/imparcial/driver/base/expression/transaction.rb +0 -59
  67. data/lib/imparcial/driver/base/expression.rb +0 -37
  68. data/lib/imparcial/driver/base/sql/table_metadata.rb +0 -29
  69. data/lib/imparcial/driver/base/sql.rb +0 -25
  70. data/lib/imparcial/driver/base.rb +0 -156
  71. data/lib/imparcial/driver/mysql/expression/index.rb +0 -44
  72. data/lib/imparcial/driver/mysql/sql/table_operation.rb +0 -20
  73. data/lib/imparcial/driver/postgre/expression/index.rb +0 -10
  74. data/lib/imparcial/driver/postgre/expression/sequence.rb +0 -9
  75. data/lib/imparcial/driver/postgre/expression/table.rb +0 -20
  76. data/lib/imparcial/driver/postgre/sql/table_operation.rb +0 -9
@@ -0,0 +1,255 @@
1
+ require 'logger'
2
+
3
+ require 'imparcial/driver/abstract/util'
4
+ require 'imparcial/driver/abstract/result'
5
+ require 'imparcial/driver/abstract/typemap'
6
+ require 'imparcial/driver/abstract/sql'
7
+ require 'imparcial/driver/abstract/expression'
8
+
9
+ module Imparcial
10
+ module Driver
11
+
12
+ # You have seriously to pay attention on this class.
13
+ # Basically speaking, it servers as abstraction for all new drivers.
14
+ # The idea behind Imparcial is to keep an abstract interface without
15
+ # exposing any dataabstract-specific-features.
16
+ # Of course, it's an impossible mission anyhow. There are so many
17
+ # dataabases out there and there are so many cool features that
18
+ # make impossible not to expose them.
19
+ # We recommend you to obey the interface as much as possible.
20
+ # However you may develop some specific features.
21
+ # Please, keep an eye on specification(can be found in the website).
22
+
23
+ class AbstractAdapter
24
+
25
+ # Include SQL syntax generation.
26
+ # Here where all SQL syntax lies on.
27
+
28
+ include AbstractSQL
29
+
30
+ # Include the expression mechanism.
31
+ # Things like create table, drop table, select and so forth.
32
+ # They all come from this module.
33
+
34
+ include AbstractExpression
35
+
36
+ # Include some util methods.
37
+ # Things like quoting, unquoting.
38
+
39
+ include AbstractUtil
40
+
41
+ # Include Typemap mechanism.
42
+
43
+ include AbstractTypemap
44
+
45
+ # Let's also keep a track of the connection.
46
+
47
+ attr_accessor :conn
48
+ alias_method :connection, :conn
49
+
50
+ # A logger is also required.
51
+
52
+ attr_accessor :logger
53
+
54
+ attr_accessor :host, :adapter, :port, :username, :password, :socket, :database
55
+
56
+ #####################################################
57
+ # #
58
+ # Those are methods shared among all databases. #
59
+ # Hardly, one will need to override them. #
60
+ # #
61
+ #####################################################
62
+
63
+ # === Description
64
+ # Display connection handle.
65
+ #
66
+ # === Returning
67
+ # a handle.
68
+
69
+ def conn
70
+
71
+ raise AdapterConnectionError.new('Have you connected already?') unless @conn
72
+ @conn
73
+
74
+ end
75
+
76
+ # === Description
77
+ # Terminate a connection.
78
+ #
79
+ # === Returning
80
+ # nothing.
81
+
82
+ def close
83
+
84
+ conn.close
85
+
86
+ end
87
+
88
+ # === Description
89
+ # After executing a statement, the method query will bring a result.
90
+ #
91
+ # === Returning
92
+ # result to a query.
93
+
94
+ def result
95
+
96
+ raise ResultError.new('Have you made any query?') unless @result
97
+ @result
98
+
99
+ end
100
+
101
+ #####################################################
102
+ # #
103
+ # Subclasses must override those following methods. #
104
+ # They are driver-specific. #
105
+ # #
106
+ #####################################################
107
+
108
+ # === Description
109
+ # Stablish a connection.
110
+ #
111
+ # === Returning
112
+ # nothing.
113
+
114
+ def connect
115
+
116
+ raise FeatureNotFound
117
+
118
+ end
119
+
120
+ # === Description
121
+ # Execute a statement directly to the adapter.
122
+ #
123
+ # === Returning
124
+ # The method result will be avaliable.
125
+
126
+ def query ( sql )
127
+
128
+ raise FeatureNotFound
129
+
130
+ end
131
+
132
+ # === Description
133
+ # get the adapter specific's exception.
134
+ #
135
+ # === Returning
136
+ # an exception class.
137
+
138
+ def adapter_specific_exception
139
+
140
+ raise FeatureNotFound
141
+
142
+ end
143
+
144
+ def last_insert_id
145
+
146
+ raise FeatureNotFound
147
+
148
+ end
149
+
150
+ public
151
+
152
+ #####################################################
153
+ # #
154
+ # Logging mechanism #
155
+ # #
156
+ #####################################################
157
+
158
+ def enable_table_logging
159
+
160
+ @table_logging = true
161
+
162
+ end
163
+
164
+ def disable_table_logging
165
+
166
+ @table_logging = false
167
+
168
+ end
169
+
170
+ def enable_column_logging
171
+
172
+ @column_logging = true
173
+
174
+ end
175
+
176
+ def disable_column_logging
177
+
178
+ @column_logging = false
179
+
180
+ end
181
+
182
+ def enable_index_logging
183
+
184
+ @index_logging = true
185
+
186
+ end
187
+
188
+ def disable_index_logging
189
+
190
+ @index_logging = false
191
+
192
+ end
193
+
194
+ def enable_select_logging
195
+
196
+ @select_logging = true
197
+
198
+ end
199
+
200
+ def disable_select_logging
201
+
202
+ @select_logging = false
203
+
204
+ end
205
+
206
+ def enable_update_logging
207
+
208
+ @update_logging = true
209
+
210
+ end
211
+
212
+ def disable_update_logging
213
+
214
+ @update_logging = false
215
+
216
+ end
217
+
218
+ def enable_insert_logging
219
+
220
+ @insert_logging = true
221
+
222
+ end
223
+
224
+ def disable_insert_logging
225
+
226
+ @insert_logging = false
227
+
228
+ end
229
+
230
+ def enable_sequence_logging
231
+
232
+ @sequence_logging = true
233
+
234
+ end
235
+
236
+ def disable_sequence_logging
237
+
238
+ @sequence_logging = false
239
+
240
+ end
241
+
242
+ def enable_record_logging
243
+
244
+ @record_logging = true
245
+
246
+ end
247
+
248
+ def disable_record_logging
249
+
250
+ @record_logging = false
251
+
252
+ end
253
+ end
254
+ end
255
+ end
@@ -1,6 +1,6 @@
1
1
  module Imparcial
2
2
  module Driver
3
- module ExpressionMysql
3
+ module MysqlExpression
4
4
  module Table
5
5
 
6
6
  private
@@ -9,16 +9,7 @@ module Imparcial
9
9
 
10
10
  super.merge :engine => :optional
11
11
 
12
- end
13
-
14
- def field_to_column ( field )
15
-
16
- column = super
17
- column[:auto_increment] = field[:auto_increment] ? ' AUTO_INCREMENT' : ''
18
-
19
- column
20
-
21
- end
12
+ end
22
13
 
23
14
  end
24
15
  end
@@ -1,11 +1,11 @@
1
- require 'imparcial/driver/mysql/expression/table'
2
- require 'imparcial/driver/mysql/expression/index'
1
+ FileList[File.dirname(__FILE__) + '/expression/*.rb'].each do |f|
2
+ require f
3
+ end
3
4
 
4
5
  module Imparcial
5
6
  module Driver
6
- module ExpressionMysql
7
+ module MysqlExpression
7
8
  include Table
8
- include Index
9
9
  end
10
10
  end
11
11
  end
@@ -1,6 +1,6 @@
1
1
  module Imparcial
2
2
  module Driver
3
- class ResultMysql < ResultBase
3
+ class MysqlResult < AbstractResult
4
4
 
5
5
  def rows
6
6
 
@@ -0,0 +1,59 @@
1
+ module Imparcial
2
+ module Driver
3
+ module MysqlSQL
4
+ module Column
5
+
6
+ private
7
+
8
+ def sql_for_modifying_columns ( options )
9
+
10
+ syntax = ''
11
+
12
+ syntax += 'ALTER TABLE ' + quote(options[:table_name]) + ' '
13
+
14
+ options[:fields].each do |field|
15
+
16
+ column = field_to_column field
17
+
18
+ syntax += "MODIFY COLUMN #{column[:name]} #{column[:type]}"
19
+ syntax += "(#{column[:size]})" if column[:size]
20
+
21
+ syntax += ','
22
+
23
+ end
24
+
25
+ syntax.chop!
26
+
27
+ syntax
28
+
29
+ end
30
+
31
+ def sql_for_renaming_column ( options )
32
+
33
+ old_name = options[:field].keys.first
34
+ new_name = options[:field].values.first
35
+
36
+ field = get_column_information :table_name => options[:table_name], :field_name => old_name
37
+
38
+ column = field_to_column field
39
+
40
+ syntax = ''
41
+
42
+ syntax += 'ALTER TABLE ' + quote(options[:table_name]) + ' '
43
+
44
+ syntax += "CHANGE COLUMN #{column[:name]}"
45
+ syntax += " #{quote(new_name)}"
46
+ syntax += " #{column[:type]}"
47
+ syntax += "(#{column[:size]})" if column[:size]
48
+ syntax += ','
49
+
50
+ syntax.chop!
51
+
52
+ syntax
53
+
54
+ end
55
+
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,39 @@
1
+ module Imparcial
2
+ module Driver
3
+ module MysqlSQL
4
+ module Constraint
5
+
6
+ private
7
+
8
+ def sql_for_adding_auto_increment ( options )
9
+
10
+ syntax = 'ALTER TABLE ' + quote(options[:table_name]) + ' '
11
+
12
+ syntax += "MODIFY COLUMN #{quote(options[:field])} INTEGER NOT NULL AUTO_INCREMENT"
13
+
14
+ syntax
15
+
16
+ end
17
+
18
+ def sql_for_adding_default_value ( options )
19
+
20
+ syntax = 'ALTER TABLE ' + quote(options[:table_name]) + ' '
21
+
22
+ for field, value in options[:fields]
23
+
24
+ syntax += "ALTER COLUMN #{quote(field)} SET DEFAULT #{quote_value(value)},"
25
+
26
+ end
27
+
28
+ syntax.chop!
29
+
30
+ syntax
31
+
32
+ end
33
+
34
+
35
+
36
+ end
37
+ end
38
+ end
39
+ end
@@ -1,16 +1,15 @@
1
1
  module Imparcial
2
2
  module Driver
3
- module SQLMysql
3
+ module MysqlSQL
4
4
  module Index
5
5
 
6
6
  private
7
7
 
8
8
  def sql_for_dropping_index ( options )
9
9
 
10
- %{
11
- DROP INDEX #{options[:index_name]} ON
10
+ %{DROP INDEX #{options[:index_name]} ON
12
11
  #{quote(options[:table_name])}
13
- }
12
+ }
14
13
 
15
14
  end
16
15
 
@@ -18,32 +17,24 @@ module Imparcial
18
17
 
19
18
  def sql_for_index_exists? ( options )
20
19
 
21
- %{
22
- SELECT 1 FROM INFORMATION_SCHEMA.statistics
23
- WHERE INDEX_NAME = #{quote_value(options[:index_name])}
24
- }
20
+ %{SELECT 1 FROM INFORMATION_SCHEMA.statistics
21
+ WHERE table_schema != "mysql" AND
22
+ table_name = #{quote_value(options[:table_name])} AND
23
+ INDEX_NAME = #{quote_value(options[:index_name])}
24
+ }
25
25
 
26
26
  end
27
27
 
28
- def sql_for_retrieving_indexes
28
+ def sql_for_getting_indexes ( options )
29
29
 
30
- %{
31
- SELECT
32
- TABLE_NAME AS 'table',
33
- COLUMN_NAME AS 'column',
34
- INDEX_NAME AS 'index'
35
- FROM INFORMATION_SCHEMA.statistics
36
- }
30
+ %{SELECT table_name AS 'table', column_name AS 'column',\
31
+ index_name AS 'index' FROM INFORMATION_SCHEMA.statistics\
32
+ WHERE table_schema != 'mysql'
33
+ AND table_name = #{quote_value(options[:table_name])}
34
+ }
37
35
 
38
36
  end
39
37
 
40
- def sql_for_retrieving_indexes_for_table ( options )
41
-
42
- sql_for_retrieving_indexes + %{
43
- WHERE TABLE_NAME = #{quote_value(options[:table_name])}
44
- }
45
-
46
- end
47
38
 
48
39
  end
49
40
  end
@@ -1,6 +1,6 @@
1
1
  module Imparcial
2
2
  module Driver
3
- module SQLMysql
3
+ module MysqlSQL
4
4
 
5
5
  # Mysql doesn't support sequences.
6
6
  # We have to disable all them.
@@ -1,20 +1,44 @@
1
1
  module Imparcial
2
2
  module Driver
3
- module SQLMysql
4
- module TableMetadata
3
+ module MysqlSQL
4
+ module Table
5
+
6
+ private
7
+
8
+ def sql_for_creating_table ( options = {} )
9
+
10
+ syntax = super
11
+
12
+ syntax += 'ENGINE = '
13
+
14
+ # If any engine has not been specified, we make INNODB as default.
15
+
16
+ if options[:engine]
17
+
18
+ syntax += options[:engine].to_s
19
+
20
+ else
21
+
22
+ syntax += 'INNODB'
23
+
24
+ end
25
+
26
+ syntax
27
+
28
+ end
5
29
 
6
30
  private
7
31
 
8
32
  # Generate SQL statement for retrieving tables.
9
33
 
10
- def sql_for_retrieving_tables
34
+ def sql_for_getting_tables
11
35
 
12
36
  'SHOW TABLES'
13
37
 
14
38
  end
15
39
 
16
40
  # Generate SQL statement for retrieving columns.
17
-
41
+ =begin
18
42
  def sql_for_retrieving_columns ( options = {} )
19
43
 
20
44
  %{
@@ -36,7 +60,7 @@ module Imparcial
36
60
  }
37
61
 
38
62
  end
39
-
63
+ =end
40
64
  end
41
65
  end
42
66
  end
@@ -1,15 +1,15 @@
1
- require 'imparcial/driver/mysql/sql/table_operation'
2
- require 'imparcial/driver/mysql/sql/table_metadata'
3
- require 'imparcial/driver/mysql/sql/sequence'
4
- require 'imparcial/driver/mysql/sql/index'
1
+ FileList[File.dirname(__FILE__) + '/sql/*.rb'].each do |f|
2
+ require f
3
+ end
5
4
 
6
5
  module Imparcial
7
6
  module Driver
8
- module SQLMysql
9
- include TableOperation
10
- include TableMetadata
7
+ module MysqlSQL
8
+ include Table
11
9
  include Sequence
12
10
  include Index
11
+ include Constraint
12
+ include Column
13
13
  end
14
14
  end
15
15
  end
@@ -1,6 +1,6 @@
1
1
  module Imparcial
2
2
  module Driver
3
- module TypemapMysql
3
+ module MysqlTypemap
4
4
 
5
5
  def sql_types
6
6
 
@@ -1,6 +1,6 @@
1
1
  module Imparcial
2
2
  module Driver
3
- module UtilMysql
3
+ module MysqlUtil
4
4
 
5
5
  def quote ( val )
6
6
 
@@ -1,48 +1,49 @@
1
1
  require 'mysql'
2
+
2
3
  require 'imparcial/driver/mysql/util'
3
- require 'imparcial/driver/mysql/typemap'
4
4
  require 'imparcial/driver/mysql/result'
5
+ require 'imparcial/driver/mysql/typemap'
5
6
  require 'imparcial/driver/mysql/sql'
6
7
  require 'imparcial/driver/mysql/expression'
7
8
 
8
9
  module Imparcial
9
10
  module Driver
10
- class AdapterMysql < AdapterBase
11
-
11
+ class MysqlAdapter < AbstractAdapter
12
+
13
+ include MysqlUtil
14
+ include MysqlTypemap
15
+ include MysqlSQL
16
+ include MysqlExpression
17
+
12
18
  def adapter_specific_exception
13
19
 
14
20
  Mysql::Error
15
21
 
16
22
  end
17
-
18
- include UtilMysql
19
- include TypemapMysql
20
- include SQLMysql
21
- include ExpressionMysql
22
-
23
+
23
24
  def connect
24
25
 
25
- @conn = Mysql.real_connect @host, @user, @pass, @database
26
+ @conn = Mysql.real_connect @host, @username, @password, @database, @port, @socket
26
27
 
27
28
  rescue adapter_specific_exception => ex
28
29
 
29
30
  raise AdapterConnectionError.new(ex.message)
30
31
 
31
32
  end
32
-
33
- def version
34
-
35
- conn.get_server_info
36
-
37
- end
38
-
33
+
39
34
  def query ( sql )
40
35
 
41
36
  result = conn.query sql
42
- @result = ResultMysql.new result
37
+ @result = MysqlResult.new result
43
38
 
44
39
  end
45
40
 
41
+ def last_insert_id
42
+
43
+ conn.last_insert_id
44
+
45
+ end
46
+
46
47
  end
47
48
  end
48
49
  end
@@ -1,13 +1,32 @@
1
- require 'imparcial/driver/postgre/expression/sequence'
2
- require 'imparcial/driver/postgre/expression/table'
3
- require 'imparcial/driver/postgre/expression/index'
1
+ FileList[File.dirname(__FILE__) + '/expression/*.rb'].each do |f|
2
+ require f
3
+ end
4
4
 
5
5
  module Imparcial
6
6
  module Driver
7
- module ExpressionPostgre
8
- include Sequence
9
- include Table
10
- include Index
7
+ module PostgreExpression
8
+
9
+ def insert ( options = {} )
10
+
11
+ super options
12
+
13
+ begin
14
+
15
+ seq_name = 'seq_' + options[:table_name].to_s + '_id'
16
+ id = conn.query "SELECT currval('#{seq_name}')"
17
+
18
+ @last_insert_id = id[0][0].to_i
19
+
20
+ rescue adapter_specific_exception; end
21
+
22
+ end
23
+
24
+ def last_insert_id
25
+
26
+ @last_insert_id
27
+
28
+ end
29
+
11
30
  end
12
31
  end
13
32
  end
@@ -1,6 +1,6 @@
1
1
  module Imparcial
2
2
  module Driver
3
- class ResultPostgre < ResultBase
3
+ class PostgreResult < AbstractResult
4
4
 
5
5
  def rows
6
6