imparcial 0.0.4 → 0.0.5

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 (80) hide show
  1. data/History.txt +2 -5
  2. data/Manifest.txt +79 -5
  3. data/README.txt +71 -7
  4. data/Rakefile +1 -1
  5. data/lib/imparcial/driver/abstract/expression/column.rb +313 -0
  6. data/lib/imparcial/driver/abstract/expression/constraint.rb +149 -0
  7. data/lib/imparcial/driver/abstract/expression/delete.rb +88 -0
  8. data/lib/imparcial/driver/abstract/expression/index.rb +206 -0
  9. data/lib/imparcial/driver/abstract/expression/insert.rb +49 -0
  10. data/lib/imparcial/driver/abstract/expression/lock.rb +11 -0
  11. data/lib/imparcial/driver/abstract/expression/record.rb +41 -0
  12. data/lib/imparcial/driver/abstract/expression/select.rb +38 -0
  13. data/lib/imparcial/driver/abstract/expression/sequence.rb +260 -0
  14. data/lib/imparcial/driver/abstract/expression/statement.rb +128 -0
  15. data/lib/imparcial/driver/abstract/expression/table.rb +416 -0
  16. data/lib/imparcial/driver/abstract/expression/transaction.rb +143 -0
  17. data/lib/imparcial/driver/abstract/expression/update.rb +50 -0
  18. data/lib/imparcial/driver/abstract/expression.rb +23 -0
  19. data/lib/imparcial/driver/abstract/result.rb +95 -0
  20. data/lib/imparcial/driver/abstract/sql/column.rb +103 -0
  21. data/lib/imparcial/driver/abstract/sql/constraint.rb +42 -0
  22. data/lib/imparcial/driver/abstract/sql/delete.rb +22 -0
  23. data/lib/imparcial/driver/abstract/sql/index.rb +45 -0
  24. data/lib/imparcial/driver/abstract/sql/insert.rb +63 -0
  25. data/lib/imparcial/driver/abstract/sql/record.rb +19 -0
  26. data/lib/imparcial/driver/abstract/sql/select.rb +101 -0
  27. data/lib/imparcial/driver/abstract/sql/sequence.rb +55 -0
  28. data/lib/imparcial/driver/abstract/sql/table.rb +42 -0
  29. data/lib/imparcial/driver/abstract/sql/transaction.rb +43 -0
  30. data/lib/imparcial/driver/abstract/sql/update.rb +29 -0
  31. data/lib/imparcial/driver/abstract/sql.rb +21 -0
  32. data/lib/imparcial/driver/abstract/typemap.rb +168 -0
  33. data/lib/imparcial/driver/abstract/util.rb +53 -0
  34. data/lib/imparcial/driver/abstract.rb +255 -0
  35. data/lib/imparcial/driver/mysql/expression/table.rb +17 -0
  36. data/lib/imparcial/driver/mysql/expression.rb +11 -0
  37. data/lib/imparcial/driver/mysql/result.rb +33 -0
  38. data/lib/imparcial/driver/mysql/sql/column.rb +59 -0
  39. data/lib/imparcial/driver/mysql/sql/constraint.rb +39 -0
  40. data/lib/imparcial/driver/mysql/sql/index.rb +42 -0
  41. data/lib/imparcial/driver/mysql/sql/sequence.rb +39 -0
  42. data/lib/imparcial/driver/mysql/sql/table.rb +67 -0
  43. data/lib/imparcial/driver/mysql/sql.rb +15 -0
  44. data/lib/imparcial/driver/mysql/typemap.rb +13 -0
  45. data/lib/imparcial/driver/mysql/util.rb +13 -0
  46. data/lib/imparcial/driver/mysql.rb +49 -0
  47. data/lib/imparcial/driver/postgre/expression.rb +32 -0
  48. data/lib/imparcial/driver/postgre/result.rb +35 -0
  49. data/lib/imparcial/driver/postgre/sql/column.rb +53 -0
  50. data/lib/imparcial/driver/postgre/sql/constraint.rb +37 -0
  51. data/lib/imparcial/driver/postgre/sql/index.rb +53 -0
  52. data/lib/imparcial/driver/postgre/sql/sequence.rb +30 -0
  53. data/lib/imparcial/driver/postgre/sql/table.rb +46 -0
  54. data/lib/imparcial/driver/postgre/sql.rb +15 -0
  55. data/lib/imparcial/driver/postgre/typemap.rb +36 -0
  56. data/lib/imparcial/driver/postgre/util.rb +19 -0
  57. data/lib/imparcial/driver/postgre.rb +43 -0
  58. data/lib/imparcial/driver.rb +1 -0
  59. data/lib/imparcial/exception.rb +71 -0
  60. data/lib/imparcial/extension.rb +90 -0
  61. data/lib/imparcial/initializer.rb +30 -0
  62. data/lib/imparcial.rb +1 -1
  63. data/test/unit/base/common/tc_quote.rb +30 -0
  64. data/test/unit/base/expression/tc_column.rb +84 -0
  65. data/test/unit/base/expression/tc_constraint.rb +39 -0
  66. data/test/unit/base/expression/tc_delete.rb +51 -0
  67. data/test/unit/base/expression/tc_index.rb +43 -0
  68. data/test/unit/base/expression/tc_insert.rb +44 -0
  69. data/test/unit/base/expression/tc_select.rb +142 -0
  70. data/test/unit/base/expression/tc_sequence.rb +48 -0
  71. data/test/unit/base/expression/tc_table.rb +68 -0
  72. data/test/unit/base/expression/tc_table_diff.rb +41 -0
  73. data/test/unit/base/expression/tc_transaction.rb +46 -0
  74. data/test/unit/base/expression/tc_update.rb +29 -0
  75. data/test/unit/base/statement/tc_conditions.rb +84 -0
  76. data/test/unit/base/statement/tc_limit.rb +25 -0
  77. data/test/unit/base/statement/tc_order.rb +25 -0
  78. data/test/unit/helper.rb +64 -0
  79. data/test/unit/mysql/tc_sequence.rb +41 -0
  80. metadata +102 -10
@@ -0,0 +1,88 @@
1
+ module Imparcial
2
+ module Driver
3
+ module AbstractExpression
4
+ module Delete
5
+
6
+ private
7
+
8
+ def expected_options_for_deleting
9
+
10
+ {:table_name => :required, :conditions => :required}
11
+
12
+ end
13
+
14
+ public
15
+
16
+ # === Description
17
+ # Delete some records. Besides, this function demands deleting
18
+ # with some conditions.
19
+ #
20
+ # === Usage
21
+ # abstract_adapter.delete :table_name => 'person', :conditions =>
22
+ # ['id = ?',1]
23
+ #
24
+ # === Options
25
+ # * :table_name
26
+ # * :conditions
27
+ #
28
+ # === Returning
29
+ # nothing
30
+
31
+ def delete ( options = {} )
32
+
33
+ check_options expected_options_for_deleting, options
34
+
35
+ sql = sql_for_deleting( options )
36
+
37
+ logger.warn sql if @delete_logging
38
+
39
+ query sql
40
+
41
+ rescue adapter_specific_exception => ex
42
+
43
+ raise DeleteError.new(ex.message)
44
+
45
+ end
46
+
47
+ private
48
+
49
+ def expected_options_for_deleting_all
50
+
51
+ {:table_name => :required}
52
+
53
+ end
54
+
55
+ public
56
+
57
+ # === Description
58
+ # Delete some records. Besides, this function demands no conditions.
59
+ #
60
+ # === Usage
61
+ # abstract_adapter.delete_all :table_name => 'person'
62
+ #
63
+ # === Options
64
+ # * :table_name
65
+ #
66
+ # === Returning
67
+ # nothing
68
+
69
+ def delete_all ( options = {} )
70
+
71
+ check_options expected_options_for_deleting_all, options
72
+
73
+ sql = sql_for_deleting( options )
74
+
75
+ logger.warn sql if @delete_logging
76
+
77
+ query sql
78
+
79
+ rescue adapter_specific_exception => ex
80
+
81
+ raise DeleteError.new(ex.message)
82
+
83
+ end
84
+
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,206 @@
1
+ module Imparcial
2
+ module Driver
3
+ module AbstractExpression
4
+ module Index
5
+
6
+ ###########################################
7
+ # #
8
+ # Index Creation #
9
+ # #
10
+ ###########################################
11
+
12
+ private
13
+
14
+ def expected_options_for_creating_index
15
+
16
+ {
17
+ :index_name => :required, :index_type => :optional, :table_name => :required,
18
+ :column_name => :required
19
+ }
20
+
21
+ end
22
+
23
+ public
24
+
25
+ # === Description
26
+ # Create an index.
27
+ #
28
+ # === Usage
29
+ # abstract_adapter.create_index :index_name => 'idx', :table_name = 'person'
30
+ # ,:column_name => :id
31
+ #
32
+ # === Options
33
+ # * :index_name
34
+ # * :table_name
35
+ # * :column_name
36
+ # * :index_type
37
+ #
38
+ # === Returning
39
+ # nothing
40
+
41
+ def create_index ( options = {} )
42
+
43
+ check_options expected_options_for_creating_index, options
44
+
45
+ sql = sql_for_creating_index( options )
46
+
47
+ logger.warn sql if @index_logging
48
+
49
+ query sql
50
+
51
+ rescue adapter_specific_exception => ex
52
+
53
+ raise IndexCreateError.new(ex.message)
54
+
55
+ end
56
+
57
+ ###########################################
58
+ # #
59
+ # Index Dropping #
60
+ # #
61
+ ###########################################
62
+
63
+ private
64
+
65
+ def expected_options_for_dropping_index
66
+
67
+ {:table_name => :required, :index_name => :required}
68
+
69
+ end
70
+
71
+ public
72
+
73
+ def drop_index ( options = {} )
74
+
75
+ check_options expected_options_for_dropping_index, options
76
+
77
+ sql = sql_for_dropping_index( options )
78
+
79
+ logger.warn sql if @index_logging
80
+
81
+ query sql
82
+
83
+ rescue adapter_specific_exception => ex
84
+
85
+ raise IndexDropError.new(ex.message)
86
+
87
+ end
88
+
89
+ def expected_options_for_dropping_all_indexes
90
+
91
+ {:table_name => :required}
92
+
93
+ end
94
+
95
+ public
96
+
97
+ def drop_all_indexes ( options = {} )
98
+
99
+ check_options expected_options_for_dropping_all_indexes, options
100
+
101
+ for index in get_indexes(:table_name => options[:table_name])
102
+
103
+ drop_index :table_name => index[:table], :index_name => index[:name]
104
+
105
+ end
106
+
107
+ end
108
+
109
+ ###########################################
110
+ # #
111
+ # Index Listing #
112
+ # #
113
+ ###########################################
114
+
115
+ private
116
+
117
+ def expected_options_for_getting_indexes
118
+
119
+ {:table_name => :required}
120
+
121
+ end
122
+
123
+ public
124
+
125
+ # === Description
126
+ # Get metadata about all indexes.
127
+ #
128
+ # === Usage
129
+ # abstract_adapter.retrieve_indexes
130
+ #
131
+ # === Options
132
+ # No options
133
+ #
134
+ # === Returning
135
+ # an array with hashes.
136
+
137
+ def get_indexes ( options = {} )
138
+
139
+ check_options expected_options_for_getting_indexes, options
140
+
141
+ sql = sql_for_getting_indexes options
142
+
143
+ logger.warn sql if @index_logging
144
+
145
+ query sql
146
+
147
+ indexes = []
148
+
149
+ result.fetch do |table, column, index|
150
+
151
+ indexes << {:table => table.value,:column => column.value,:name => index.value}
152
+
153
+ end
154
+
155
+ indexes
156
+
157
+ rescue adapter_specific_exception => ex
158
+
159
+ raise IndexListError.new(ex.message)
160
+
161
+ end
162
+
163
+ private
164
+
165
+ def expected_options_for_verifying_index_existance
166
+
167
+ {:index_name => :required, :table_name => :required}
168
+
169
+ end
170
+
171
+ public
172
+
173
+ # === Description
174
+ # Verify if a given index exists.
175
+ #
176
+ # === Usage
177
+ # abstract_adapter.retrieve_indexes
178
+ #
179
+ # === Options
180
+ # No options
181
+ #
182
+ # === Returning
183
+ # true or false.
184
+
185
+ def index_exists? ( options = {} )
186
+
187
+ check_options expected_options_for_verifying_index_existance, options
188
+
189
+ sql = sql_for_index_exists?( options )
190
+
191
+ logger.warn sql if @index_logging
192
+
193
+ query sql
194
+
195
+ result.rows > 0
196
+
197
+ rescue adapter_specific_exception => ex
198
+
199
+ raise IndexDropError.new(ex.message)
200
+
201
+ end
202
+
203
+ end
204
+ end
205
+ end
206
+ end
@@ -0,0 +1,49 @@
1
+ module Imparcial
2
+ module Driver
3
+ module AbstractExpression
4
+ module Insert
5
+
6
+ private
7
+
8
+ def expected_options_for_inserting
9
+
10
+ {:table_name => :required, :values => :required}
11
+
12
+ end
13
+
14
+ public
15
+
16
+ # === Description
17
+ # Insert some records.
18
+ #
19
+ # === Usage
20
+ # abstract_adapter.insert :table_name => 'person', :values =>
21
+ # {:id => 1, :name => 'ronaldinho'}
22
+ #
23
+ # === Options
24
+ # * :table_name
25
+ # * :values
26
+ #
27
+ # === Returning
28
+ # nothing
29
+
30
+ def insert ( options = {} )
31
+
32
+ check_options expected_options_for_inserting, options
33
+
34
+ sql = sql_for_inserting( options )
35
+
36
+ logger.warn sql if @insert_logging
37
+
38
+ query sql
39
+
40
+ rescue adapter_specific_exception => ex
41
+
42
+ raise InsertError.new(ex.message)
43
+
44
+ end
45
+
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,11 @@
1
+ module Imparcial
2
+ module Driver
3
+ module AbstractExpression
4
+ module Lock
5
+
6
+ # Need implementation.
7
+
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,41 @@
1
+ module Imparcial
2
+ module Driver
3
+ module AbstractExpression
4
+ module Record
5
+
6
+ private
7
+
8
+ def expected_options_for_total_of_records
9
+
10
+ {:table_name => :required}
11
+
12
+ end
13
+
14
+ public
15
+
16
+ # Retrieve the total of records in a table.
17
+
18
+ def total_of_records ( options = {} )
19
+
20
+ check_options expected_options_for_total_of_records, options
21
+
22
+ sql = sql_for_couting_records( options )
23
+
24
+ logger.warn sql if @record_logging
25
+
26
+ query sql
27
+
28
+ result.fetch_first_row.value
29
+
30
+ rescue adapter_specific_exception => ex
31
+
32
+ raise ExpressionError.new(ex.message)
33
+
34
+ end
35
+ alias_method :num_of_records, :total_of_records
36
+
37
+
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,38 @@
1
+ module Imparcial
2
+ module Driver
3
+ module AbstractExpression
4
+ module Select
5
+
6
+ private
7
+
8
+ def expected_options_for_selecting
9
+
10
+ {
11
+ :table_name => :optional, :joins => :optional, :fields => :optional,
12
+ :conditions => :optional, :limit => :optional, :order_asc => :optional,
13
+ :order_desc => :optional
14
+ }
15
+
16
+ end
17
+
18
+
19
+ public
20
+
21
+ def select ( options = {} )
22
+
23
+ sql = sql_for_selecting( options )
24
+
25
+ logger.warn sql if @select_logging
26
+
27
+ query sql
28
+
29
+ rescue adapter_specific_exception => ex
30
+
31
+ raise SelectError.new(ex.message)
32
+
33
+ end
34
+
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,260 @@
1
+ module Imparcial
2
+ module Driver
3
+ module AbstractExpression
4
+
5
+ # It's important to be aware that some databases don't support sequences.
6
+ # Databases like Mysql, need to override those methods.
7
+
8
+ module Sequence
9
+
10
+ private
11
+
12
+ # Set default values.
13
+
14
+ def parse_sequence ( options )
15
+
16
+ options[:start_with] ||= 1
17
+ options[:min_value] ||= 1
18
+ options[:increment_by] ||= 1
19
+ options[:cycle] ||= false
20
+
21
+ end
22
+
23
+ ###############################################
24
+ # #
25
+ # Creating Sequences #
26
+ # #
27
+ ###############################################
28
+
29
+ private
30
+
31
+ def expected_options_for_creating_sequence
32
+
33
+ {
34
+ :sequence_name => :required, :start_with => :optional, :min_value => :optional,
35
+ :max_value => :optional, :increment_by => :optional, :cycle => :optional,
36
+ :cache => :optional
37
+ }
38
+
39
+ end
40
+
41
+ public
42
+
43
+ # === Description
44
+ # Create a sequence.
45
+ #
46
+ # === Usage
47
+ # abstract_adapter.create_sequence :sequence_name => 'seq_id', :increment_by => 2
48
+ #
49
+ # === Options
50
+ # * :sequence_name
51
+ # * :start_with
52
+ # * :min_value
53
+ # * :max_value
54
+ # * :increment_by
55
+ # * :cache
56
+ # * :cycle
57
+ #
58
+ # === Returning
59
+ # nothing
60
+
61
+ def create_sequence ( options = {} )
62
+
63
+ check_options expected_options_for_creating_sequence, options
64
+
65
+ parse_sequence options
66
+
67
+ sql = sql_for_creating_sequence( options )
68
+
69
+ logger.warn sql if @sequence_logging
70
+
71
+ query sql
72
+
73
+ rescue adapter_specific_exception => ex
74
+
75
+ raise SequenceCreateError.new(ex.message)
76
+
77
+ end
78
+
79
+ # === Description
80
+ # Create a sequence without raising any exception.
81
+ #
82
+ # === Usage
83
+ # abstract_adapter.create_sequence_if_necessary :sequence_name => 'seq_id'
84
+ #
85
+ # === Options
86
+ # * :sequence_name
87
+ # * :start_with
88
+ # * :min_value
89
+ # * :max_value
90
+ # * :increment_by
91
+ # * :cache
92
+ # * :cycle
93
+ #
94
+ # === Returning
95
+ # nothing
96
+
97
+ def create_sequence_if_necessary ( options = {} )
98
+
99
+ create_sequence options
100
+
101
+ rescue SequenceCreateError => ex; end
102
+
103
+ ###############################################
104
+ # #
105
+ # Dropping Sequences #
106
+ # #
107
+ ###############################################
108
+
109
+ private
110
+
111
+ def expected_options_for_dropping_sequence
112
+
113
+ {:sequence_name => :required}
114
+
115
+ end
116
+
117
+ public
118
+
119
+ # === Description
120
+ # Drop a sequence.
121
+ #
122
+ # === Usage
123
+ # abstract_adapter.drop_sequence :sequence_name => 'seq_id'
124
+ #
125
+ # === Options
126
+ # * :sequence_name
127
+ #
128
+ # === Returning
129
+ # nothing
130
+
131
+ def drop_sequence ( options = {} )
132
+
133
+ check_options expected_options_for_dropping_sequence, options
134
+
135
+ sql = sql_for_dropping_sequence( options )
136
+
137
+ logger.warn sql if @sequence_logging
138
+
139
+ query sql
140
+
141
+ rescue adapter_specific_exception => ex
142
+
143
+ raise SequenceDropError.new(ex.message)
144
+
145
+ end
146
+
147
+ # === Description
148
+ # Drop a sequence without raising any exception.
149
+ #
150
+ # === Usage
151
+ # abstract_adapter.drop_sequence :sequence_name => 'seq_id'
152
+ #
153
+ # === Options
154
+ # * :sequence_name
155
+ #
156
+ # === Returning
157
+ # nothing
158
+
159
+ def drop_sequence_if_necessary ( options = {} )
160
+
161
+ drop_sequence options
162
+
163
+ rescue SequenceDropError; end
164
+
165
+ # === Description
166
+ # Drop all sequences.
167
+ #
168
+ # === Usage
169
+ # abstract_adapter.drop_all_sequences
170
+ #
171
+ # === Options
172
+ # no options
173
+ #
174
+ # === Returning
175
+ # nothing
176
+
177
+ def drop_all_sequences
178
+
179
+ for sequence in get_sequences
180
+
181
+ sql = sql_for_dropping_sequence( :sequence_name => sequence )
182
+
183
+ logger.warn sql if @sequence_logging
184
+
185
+ query sql
186
+
187
+ end
188
+
189
+ rescue adapter_specific_exception => ex
190
+
191
+ raise SequenceError.new(ex.message)
192
+
193
+ end
194
+
195
+ ###############################################
196
+ # #
197
+ # Sequence Listing #
198
+ # #
199
+ ###############################################
200
+
201
+ private
202
+
203
+ def expected_options_for_verifying_sequence_existance
204
+
205
+ {:sequence_name => :required}
206
+
207
+ end
208
+
209
+ public
210
+
211
+ # Ask for a sequence returning true or false
212
+
213
+ def sequence_exists? ( options = {} )
214
+
215
+ check_options expected_options_for_verifying_sequence_existance, options
216
+
217
+ sql = sql_for_sequence_exists?( options )
218
+
219
+ logger.warn sql if @sequence_logging
220
+
221
+ query sql
222
+
223
+ result.rows > 0
224
+
225
+ rescue adapter_specific_exception => ex
226
+
227
+ raise SequenceListError.new(ex.message)
228
+
229
+ end
230
+
231
+ # Retrieve all sequences. Similar to retrive_tables.
232
+
233
+ def get_sequences
234
+
235
+ sql = sql_for_getting_sequences
236
+
237
+ logger.warn sql if @sequence_logging
238
+
239
+ query sql
240
+
241
+ sequences = []
242
+
243
+ result.fetch do |name|
244
+
245
+ sequences << name.value
246
+
247
+ end
248
+
249
+ sequences
250
+
251
+ rescue adapter_specific_exception => ex
252
+
253
+ raise SequenceListError.new(ex.message)
254
+
255
+ end
256
+
257
+ end
258
+ end
259
+ end
260
+ end