imparcial 0.0.2 → 0.0.3

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 (63) hide show
  1. data/History.txt +5 -0
  2. data/Manifest.txt +5 -0
  3. data/README.txt +48 -0
  4. data/Rakefile +51 -0
  5. data/lib/imparcial.rb +7 -0
  6. metadata +37 -81
  7. data/lib/imparcial/driver/abstract/expression/base.rb +0 -111
  8. data/lib/imparcial/driver/abstract/expression/column.rb +0 -313
  9. data/lib/imparcial/driver/abstract/expression/constraint.rb +0 -149
  10. data/lib/imparcial/driver/abstract/expression/delete.rb +0 -88
  11. data/lib/imparcial/driver/abstract/expression/index.rb +0 -206
  12. data/lib/imparcial/driver/abstract/expression/insert.rb +0 -49
  13. data/lib/imparcial/driver/abstract/expression/lock.rb +0 -11
  14. data/lib/imparcial/driver/abstract/expression/record.rb +0 -41
  15. data/lib/imparcial/driver/abstract/expression/select.rb +0 -38
  16. data/lib/imparcial/driver/abstract/expression/sequence.rb +0 -260
  17. data/lib/imparcial/driver/abstract/expression/statement.rb +0 -128
  18. data/lib/imparcial/driver/abstract/expression/table.rb +0 -416
  19. data/lib/imparcial/driver/abstract/expression/transaction.rb +0 -143
  20. data/lib/imparcial/driver/abstract/expression/update.rb +0 -50
  21. data/lib/imparcial/driver/abstract/expression.rb +0 -24
  22. data/lib/imparcial/driver/abstract/result.rb +0 -95
  23. data/lib/imparcial/driver/abstract/sql/column.rb +0 -103
  24. data/lib/imparcial/driver/abstract/sql/constraint.rb +0 -42
  25. data/lib/imparcial/driver/abstract/sql/delete.rb +0 -22
  26. data/lib/imparcial/driver/abstract/sql/index.rb +0 -45
  27. data/lib/imparcial/driver/abstract/sql/insert.rb +0 -63
  28. data/lib/imparcial/driver/abstract/sql/record.rb +0 -19
  29. data/lib/imparcial/driver/abstract/sql/select.rb +0 -101
  30. data/lib/imparcial/driver/abstract/sql/sequence.rb +0 -55
  31. data/lib/imparcial/driver/abstract/sql/table.rb +0 -42
  32. data/lib/imparcial/driver/abstract/sql/transaction.rb +0 -43
  33. data/lib/imparcial/driver/abstract/sql/update.rb +0 -29
  34. data/lib/imparcial/driver/abstract/sql.rb +0 -21
  35. data/lib/imparcial/driver/abstract/typemap.rb +0 -168
  36. data/lib/imparcial/driver/abstract/util.rb +0 -53
  37. data/lib/imparcial/driver/abstract.rb +0 -255
  38. data/lib/imparcial/driver/mysql/expression/table.rb +0 -17
  39. data/lib/imparcial/driver/mysql/expression.rb +0 -11
  40. data/lib/imparcial/driver/mysql/result.rb +0 -33
  41. data/lib/imparcial/driver/mysql/sql/column.rb +0 -59
  42. data/lib/imparcial/driver/mysql/sql/constraint.rb +0 -39
  43. data/lib/imparcial/driver/mysql/sql/index.rb +0 -42
  44. data/lib/imparcial/driver/mysql/sql/sequence.rb +0 -39
  45. data/lib/imparcial/driver/mysql/sql/table.rb +0 -67
  46. data/lib/imparcial/driver/mysql/sql.rb +0 -15
  47. data/lib/imparcial/driver/mysql/typemap.rb +0 -13
  48. data/lib/imparcial/driver/mysql/util.rb +0 -13
  49. data/lib/imparcial/driver/mysql.rb +0 -49
  50. data/lib/imparcial/driver/postgre/expression.rb +0 -32
  51. data/lib/imparcial/driver/postgre/result.rb +0 -35
  52. data/lib/imparcial/driver/postgre/sql/column.rb +0 -53
  53. data/lib/imparcial/driver/postgre/sql/constraint.rb +0 -37
  54. data/lib/imparcial/driver/postgre/sql/index.rb +0 -53
  55. data/lib/imparcial/driver/postgre/sql/sequence.rb +0 -30
  56. data/lib/imparcial/driver/postgre/sql/table.rb +0 -46
  57. data/lib/imparcial/driver/postgre/sql.rb +0 -15
  58. data/lib/imparcial/driver/postgre/typemap.rb +0 -29
  59. data/lib/imparcial/driver/postgre/util.rb +0 -19
  60. data/lib/imparcial/driver/postgre.rb +0 -43
  61. data/lib/imparcial/driver.rb +0 -1
  62. data/lib/imparcial/exception.rb +0 -71
  63. data/lib/imparcial/initializer.rb +0 -62
@@ -1,168 +0,0 @@
1
- module Imparcial
2
- module Driver
3
- module AbstractTypemap
4
-
5
- public
6
-
7
- # === Description
8
- # Those are types shared among all databases.
9
- # Of course they are not enough. Feel free to override them
10
- # if necessary.
11
-
12
- def regular_types
13
-
14
- {
15
- :integer => 'INTEGER',
16
- :string => 'VARCHAR',
17
- :float => 'FLOAT',
18
- :datetime => 'DATETIME',
19
- :time => 'TIME',
20
- :date => 'DATE',
21
- :text => 'TEXT',
22
- :boolean => 'TINYINT',
23
- :serial => 'SERIAL'
24
- }
25
-
26
- end
27
-
28
- # === Description
29
- # The opposite of regular_types.
30
-
31
- def sql_types
32
-
33
- regular_types.invert
34
-
35
- end
36
-
37
- # === Description
38
- # Default size can be very handy when users are lazy to supply them
39
- # or they expect a given type to be in a default size.
40
-
41
- def default_size_for_types
42
-
43
- {
44
- :string => 255,
45
- :boolean => 1
46
- }
47
-
48
- end
49
-
50
- public
51
-
52
- # === Description
53
- # Validate a field.
54
-
55
- def parse_field ( field )
56
-
57
- # No name? error!
58
-
59
- if not field[:name]
60
-
61
- raise OptionError.new('A name must be supplied')
62
-
63
- end
64
-
65
- # No type? error!
66
-
67
- if not field[:type]
68
-
69
- raise OptionError.new('A type must be supplied')
70
-
71
- end
72
-
73
- # Simple conversions.
74
-
75
- field[:name] = field[:name].to_s
76
- field[:type] = field[:type].to_sym
77
-
78
- regular_types[field[:type]].length == 0 rescue raise OptionError.new("#{field[:type]} cannot be found")
79
-
80
- # Set default size if nothing has been supplied.
81
-
82
- field[:size] = default_size_for_types[field[:type]] unless field[:size]
83
-
84
- end
85
-
86
- # === Description
87
- # In order to work with fields in RDBAL, you have to provide
88
- # field datas in hashes.
89
- # This function is basically evaluate them and pass into a block.
90
-
91
- def parse_fields ( fields = [], &block )
92
-
93
- # At least a field must be supplied.
94
-
95
- raise OptionError.new unless fields
96
- raise OptionError.new if fields.length < 1
97
-
98
- for field in fields
99
-
100
- parse_field field
101
- yield field
102
-
103
- end
104
-
105
- end
106
-
107
- # === Description
108
- # Transform a regular SQL column into Imparcial's hash.
109
-
110
- def column_to_field ( column = {} )
111
-
112
- field = {}
113
-
114
- # Apply the appropriate type.
115
-
116
- type = sql_types[column[:type].upcase]
117
-
118
- if not type
119
-
120
- raise OptionError.new('Cannot map column type: ' + column[:type].to_s)
121
-
122
- end
123
-
124
- field[:name] = column[:name]
125
- field[:type] = type
126
-
127
- if column[:size]
128
-
129
- field[:size] = unquote_value(column[:size])
130
-
131
- end
132
-
133
- field
134
-
135
- end
136
-
137
- # === Description
138
- # Make an Imparcial's hash into SQl's
139
-
140
- def field_to_column ( field = {} )
141
-
142
- column = {}
143
-
144
- column[:name] = quote(field[:name])
145
- column[:type] = regular_types[field[:type]]
146
- column[:size] = field[:size]
147
-
148
- column
149
-
150
- end
151
-
152
- # === Description
153
- # Transform a regular field into SQL syntax.
154
-
155
- def field_to_column_sql ( field = {} )
156
-
157
- column = field_to_column field
158
-
159
- syntax = "#{column[:name]} #{column[:type]}"
160
- syntax += "(#{column[:size]})" if column[:size]
161
-
162
- syntax
163
-
164
- end
165
-
166
- end
167
- end
168
- end
@@ -1,53 +0,0 @@
1
- module Imparcial
2
- module Driver
3
- module AbstractUtil
4
-
5
- # === Description
6
- # Apply default database value quoting system.
7
-
8
- def quote_value ( val )
9
-
10
- if val.class == String || val.class == Symbol
11
-
12
- "\"#{val}\""
13
-
14
- else
15
-
16
- val.to_s
17
-
18
- end
19
-
20
- end
21
-
22
- # === Description
23
- # Apply default database value unquoting system.
24
-
25
- def unquote_value ( val )
26
-
27
- return nil if val == nil
28
- return 0 if val == '0'
29
-
30
- if val.match(/[0-9]\.[0-9]*/)
31
-
32
- val.to_f
33
-
34
- else
35
-
36
- val.to_i == 0 ? val : val.to_i
37
-
38
- end
39
-
40
- end
41
-
42
- # === Description
43
- # Apply default database quoting system.
44
-
45
- def quote ( val )
46
-
47
- raise FeatureNotFound
48
-
49
- end
50
-
51
- end
52
- end
53
- end
@@ -1,255 +0,0 @@
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,17 +0,0 @@
1
- module Imparcial
2
- module Driver
3
- module MysqlExpression
4
- module Table
5
-
6
- private
7
-
8
- def expected_options_for_creating_table
9
-
10
- super.merge :engine => :optional
11
-
12
- end
13
-
14
- end
15
- end
16
- end
17
- end
@@ -1,11 +0,0 @@
1
- FileList[File.dirname(__FILE__) + '/expression/*.rb'].each do |f|
2
- require f
3
- end
4
-
5
- module Imparcial
6
- module Driver
7
- module MysqlExpression
8
- include Table
9
- end
10
- end
11
- end
@@ -1,33 +0,0 @@
1
- module Imparcial
2
- module Driver
3
- class MysqlResult < AbstractResult
4
-
5
- def rows
6
-
7
- @specific.num_rows
8
-
9
- end
10
-
11
- def fetch
12
-
13
- fields = @specific.fetch_fields
14
-
15
- @specific.each do |row|
16
-
17
- v = []
18
-
19
- row.each_with_index do |r, index|
20
-
21
- v << Row.new(fields[index].name, r)
22
-
23
- end
24
-
25
- yield(*v)
26
-
27
- end
28
-
29
- end
30
-
31
- end
32
- end
33
- end
@@ -1,59 +0,0 @@
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
@@ -1,39 +0,0 @@
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,42 +0,0 @@
1
- module Imparcial
2
- module Driver
3
- module MysqlSQL
4
- module Index
5
-
6
- private
7
-
8
- def sql_for_dropping_index ( options )
9
-
10
- %{DROP INDEX #{options[:index_name]} ON
11
- #{quote(options[:table_name])}
12
- }
13
-
14
- end
15
-
16
- # Generate SQL statement for verifying if a given index exists.
17
-
18
- def sql_for_index_exists? ( options )
19
-
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
-
26
- end
27
-
28
- def sql_for_getting_indexes ( options )
29
-
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
- }
35
-
36
- end
37
-
38
-
39
- end
40
- end
41
- end
42
- end
@@ -1,39 +0,0 @@
1
- module Imparcial
2
- module Driver
3
- module MysqlSQL
4
-
5
- # Mysql doesn't support sequences.
6
- # We have to disable all them.
7
-
8
- module Sequence
9
-
10
- private
11
-
12
- def sql_for_creating_sequence ( options )
13
-
14
- raise FeatureNotFound
15
-
16
- end
17
-
18
- def sql_for_dropping_sequence ( options )
19
-
20
- raise FeatureNotFound
21
-
22
- end
23
-
24
- def sql_for_sequence_exists? ( options )
25
-
26
- raise FeatureNotFound
27
-
28
- end
29
-
30
- def sql_for_retrieving_sequences
31
-
32
- raise FeatureNotFound
33
-
34
- end
35
-
36
- end
37
- end
38
- end
39
- end