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,103 @@
1
+ module Imparcial
2
+ module Driver
3
+ module AbstractSQL
4
+ module Column
5
+
6
+ private
7
+
8
+ # Generate SQL statement for getting columns information.
9
+ # We need name, type and size.
10
+
11
+ def sql_for_getting_columns_information ( options )
12
+
13
+ %{SELECT
14
+ column_name,
15
+ data_type,
16
+ character_maximum_length
17
+ FROM INFORMATION_SCHEMA.columns
18
+ WHERE table_name = #{quote_value(options[:table_name])}
19
+ }
20
+
21
+ end
22
+
23
+ # Generate SQL statement for getting column information.
24
+ # We need name, type and size. Quite similar to above, except,
25
+ # it's a more narrow SQL.
26
+
27
+ def sql_for_getting_column_information ( options )
28
+
29
+ %{SELECT
30
+ column_name,
31
+ data_type,
32
+ character_maximum_length
33
+ FROM INFORMATION_SCHEMA.columns
34
+ WHERE table_name = #{quote_value(options[:table_name])} AND
35
+ column_name = #{quote_value(options[:field_name])}
36
+ }
37
+
38
+ end
39
+
40
+ # Generate SQL statement for adding some columns.
41
+ # Alter table will do the job for us.
42
+
43
+ def sql_for_adding_columns ( options )
44
+
45
+ syntax = ''
46
+
47
+ syntax += 'ALTER TABLE ' + quote(options[:table_name]) + ' '
48
+
49
+ parse_fields options[:fields] do |field|
50
+
51
+ syntax += "ADD COLUMN " + field_to_column_sql(field) + ","
52
+
53
+ end
54
+
55
+ syntax.chop!
56
+
57
+ syntax
58
+
59
+ end
60
+
61
+ # Generate SQL statement for dropping some columns.
62
+ # Alter table will do the job for us.
63
+
64
+ def sql_for_dropping_columns ( options )
65
+
66
+ syntax = ''
67
+
68
+ syntax += 'ALTER TABLE ' + quote(options[:table_name]) + ' '
69
+
70
+ options[:fields].each do |field_name|
71
+
72
+ syntax += 'DROP ' + field_name + ','
73
+
74
+ end
75
+
76
+ syntax.chop!
77
+
78
+ syntax
79
+
80
+ end
81
+
82
+ # Generate SQL statement for renaming a column.
83
+ # Must be overriden.
84
+
85
+ def sql_for_renaming_column ( options )
86
+
87
+ raise FeatureNotFound
88
+
89
+ end
90
+
91
+ # Generate SQL statement for modifying a column.
92
+ # Must be overriden.
93
+
94
+ def sql_for_modifying_columns ( options )
95
+
96
+ raise FeatureNotFound
97
+
98
+ end
99
+
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,42 @@
1
+ module Imparcial
2
+ module Driver
3
+ module AbstractSQL
4
+ module Constraint
5
+
6
+ private
7
+
8
+ def sql_for_adding_primary_key ( options )
9
+
10
+ syntax = 'ALTER TABLE ' + quote(options[:table_name]) + ' '
11
+ syntax += 'ADD PRIMARY KEY ('
12
+
13
+ for field_name in options[:fields]
14
+
15
+ syntax += quote(field_name) + ','
16
+
17
+ end
18
+
19
+ syntax.chop!
20
+ syntax += ')'
21
+
22
+ syntax
23
+
24
+ end
25
+
26
+ def sql_for_adding_column ( options )
27
+
28
+ raise FeatureNotFound
29
+
30
+ end
31
+
32
+ def sql_for_adding_default_value ( options )
33
+
34
+ raise FeatureNotFound
35
+
36
+ end
37
+
38
+
39
+ end
40
+ end
41
+ end
42
+ end
@@ -1,6 +1,6 @@
1
1
  module Imparcial
2
2
  module Driver
3
- module SQLBase
3
+ module AbstractSQL
4
4
  module Delete
5
5
 
6
6
  private
@@ -1,6 +1,6 @@
1
1
  module Imparcial
2
2
  module Driver
3
- module SQLBase
3
+ module AbstractSQL
4
4
  module Index
5
5
 
6
6
  private
@@ -32,20 +32,12 @@ module Imparcial
32
32
 
33
33
  # Subclasses need to override this method.
34
34
 
35
- def sql_for_retrieving_indexes
35
+ def sql_for_getting_indexes
36
36
 
37
37
  raise FeatureNotFound
38
38
 
39
39
  end
40
-
41
- # Subclasses need to override this method.
42
-
43
- def sql_for_retrieving_indexes_for_table ( options )
44
-
45
- raise FeatureNotFound
46
-
47
- end
48
-
40
+
49
41
  end
50
42
  end
51
43
  end
@@ -1,6 +1,6 @@
1
1
  module Imparcial
2
2
  module Driver
3
- module SQLBase
3
+ module AbstractSQL
4
4
  module Insert
5
5
 
6
6
  private
@@ -0,0 +1,19 @@
1
+ module Imparcial
2
+ module Driver
3
+ module AbstractSQL
4
+ module Record
5
+
6
+ private
7
+
8
+ # Execute SQL statement for couting records of a table.
9
+
10
+ def sql_for_couting_records ( options )
11
+
12
+ 'SELECT COUNT(*) FROM ' + quote(options[:table_name])
13
+
14
+ end
15
+
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,10 +1,10 @@
1
1
  module Imparcial
2
2
  module Driver
3
- module SQLBase
3
+ module AbstractSQL
4
4
  module Select
5
5
 
6
6
  private
7
-
7
+
8
8
  def get_key ( name, table_metadata )
9
9
 
10
10
  key_name = ('key_for_' + name.to_s).to_sym
@@ -1,6 +1,6 @@
1
1
  module Imparcial
2
2
  module Driver
3
- module SQLBase
3
+ module AbstractSQL
4
4
  module Sequence
5
5
 
6
6
  private
@@ -43,7 +43,7 @@ module Imparcial
43
43
  # Generate SQL statement for retrieving sequences.
44
44
  # Subclasses must override this method.
45
45
 
46
- def sql_for_retrieving_sequences
46
+ def sql_for_getting_sequences
47
47
 
48
48
  raise FeatureNotFound
49
49
 
@@ -1,12 +1,11 @@
1
1
  module Imparcial
2
2
  module Driver
3
- module SQLBase
4
- module TableOperation
3
+ module AbstractSQL
4
+ module Table
5
5
 
6
6
  private
7
7
 
8
8
  # Generate SQL statement for dropping table.
9
- # This will probably work for every database.
10
9
 
11
10
  def sql_for_dropping_table ( options )
12
11
 
@@ -14,36 +13,30 @@ module Imparcial
14
13
 
15
14
  end
16
15
 
17
- # Generate SQL statement for creating table.
18
- # This will probably work for every database.
16
+ # Generate SQL statement for creating table.
19
17
 
20
18
  def sql_for_creating_table ( options )
21
19
 
22
20
  columns = []
23
- keys = []
24
21
 
25
22
  # Let's parse some columns in order to provide default options.
26
23
 
27
24
  parse_fields options[:fields] do |field|
28
-
29
- # Convert a regular field into SQL's one.
30
-
31
- columns << build_column( field )
32
- keys << quote(field[:name]) if field[:pk]
25
+
26
+ columns << field_to_column_sql(field)
33
27
 
34
28
  end
35
29
 
36
30
  syntax = 'CREATE TABLE ' + quote( options[:table_name] )
37
31
  syntax += '('
38
32
  syntax += columns.join(',')
39
- syntax += ', PRIMARY KEY(' + keys.join(',') + ')' if keys.length > 0
40
33
  syntax += ')'
41
34
 
42
35
  syntax
43
36
 
44
- end
45
-
46
- end
37
+ end
38
+
39
+ end
47
40
  end
48
41
  end
49
42
  end
@@ -1,6 +1,6 @@
1
1
  module Imparcial
2
2
  module Driver
3
- module SQLBase
3
+ module AbstractSQL
4
4
  module Transaction
5
5
 
6
6
  private
@@ -23,17 +23,17 @@ module Imparcial
23
23
 
24
24
  # Generate SQL statement for rolling back a transaction.
25
25
 
26
- def sql_for_rolling_back ( name = nil )
26
+ def sql_for_rolling_back ( options )
27
27
 
28
- name == nil ? 'ROLLBACK' : 'ROLLBACK TO ' + name
28
+ options[:savepoint_name] == nil ? 'ROLLBACK' : 'ROLLBACK TO ' + options[:savepoint_name].to_s
29
29
 
30
30
  end
31
31
 
32
32
  # Generate SQL statement for placing a saving point.
33
33
 
34
- def sql_for_saving_point ( name )
34
+ def sql_for_saving_point ( options )
35
35
 
36
- 'SAVEPOINT ' + name
36
+ 'SAVEPOINT ' + options[:savepoint_name].to_s
37
37
 
38
38
  end
39
39
 
@@ -1,6 +1,6 @@
1
1
  module Imparcial
2
2
  module Driver
3
- module SQLBase
3
+ module AbstractSQL
4
4
  module Update
5
5
 
6
6
  private
@@ -0,0 +1,21 @@
1
+ FileList[File.dirname(__FILE__) + '/sql/*.rb'].each do |f|
2
+ require f
3
+ end
4
+
5
+ module Imparcial
6
+ module Driver
7
+ module AbstractSQL
8
+ include Table
9
+ include Sequence
10
+ include Transaction
11
+ include Index
12
+ include Insert
13
+ include Delete
14
+ include Select
15
+ include Update
16
+ include Column
17
+ include Constraint
18
+ include Record
19
+ end
20
+ end
21
+ end
@@ -1,9 +1,10 @@
1
1
  module Imparcial
2
2
  module Driver
3
- module TypemapBase
3
+ module AbstractTypemap
4
4
 
5
5
  public
6
-
6
+
7
+ # === Description
7
8
  # Those are types shared among all databases.
8
9
  # Of course they are not enough. Feel free to override them
9
10
  # if necessary.
@@ -24,7 +25,8 @@ module Imparcial
24
25
 
25
26
  end
26
27
 
27
- # The opposite of above.
28
+ # === Description
29
+ # The opposite of regular_types.
28
30
 
29
31
  def sql_types
30
32
 
@@ -32,6 +34,7 @@ module Imparcial
32
34
 
33
35
  end
34
36
 
37
+ # === Description
35
38
  # Default size can be very handy when users are lazy to supply them
36
39
  # or they expect a given type to be in a default size.
37
40
 
@@ -46,7 +49,8 @@ module Imparcial
46
49
 
47
50
  public
48
51
 
49
- # Transform regular user defined hash fields into a proper one.
52
+ # === Description
53
+ # Validate a field.
50
54
 
51
55
  def parse_field ( field )
52
56
 
@@ -70,31 +74,16 @@ module Imparcial
70
74
 
71
75
  field[:name] = field[:name].to_s
72
76
  field[:type] = field[:type].to_sym
73
-
74
- # Set default size if nothing has been supplied.
75
-
76
- field[:size] = default_size_for_types[field[:type]] unless field[:size]
77
-
78
- # Primary key is set as false.
79
-
80
- field[:pk] ||= false
81
-
82
- # Allow Null is set as true.
83
77
 
84
- field[:allow_null] = true if field[:allow_null] == nil
78
+ regular_types[field[:type]].length == 0 rescue raise OptionError.new("#{field[:type]} cannot be found")
85
79
 
86
- # let's verify if everything is okay.
87
-
88
- if field[:auto_increment] && !field[:pk]
89
-
90
- raise OptionError.new("To auto increment field must be primary key")
91
-
92
- end
80
+ # Set default size if nothing has been supplied.
93
81
 
94
- field[:indexed] ||= false
82
+ field[:size] = default_size_for_types[field[:type]] unless field[:size]
95
83
 
96
84
  end
97
85
 
86
+ # === Description
98
87
  # In order to work with fields in RDBAL, you have to provide
99
88
  # field datas in hashes.
100
89
  # This function is basically evaluate them and pass into a block.
@@ -115,9 +104,12 @@ module Imparcial
115
104
 
116
105
  end
117
106
 
118
- # Transform a regular SQL column into RDBAL's hash.
107
+ # === Description
108
+ # Transform a regular SQL column into Imparcial's hash.
109
+
110
+ def column_to_field ( column = {} )
119
111
 
120
- def parse_column ( column )
112
+ field = {}
121
113
 
122
114
  # Apply the appropriate type.
123
115
 
@@ -129,86 +121,48 @@ module Imparcial
129
121
 
130
122
  end
131
123
 
132
- column[:type] = type
124
+ field[:name] = column[:name]
125
+ field[:type] = type
133
126
 
134
127
  if column[:size]
135
128
 
136
- column[:size] = unquote_value(column[:size])
137
-
138
- end
139
-
140
- # Let's work on default value.
141
-
142
- if column[:default_value]
143
-
144
- column[:default_value].gsub!("'",'')
145
-
146
- end
147
-
148
- # Allow null?
149
-
150
- if column[:allow_null] == 't' || column[:allow_null] == 1
151
-
152
- column[:allow_null] = true
153
-
154
- else
155
-
156
- column[:allow_null] = false
129
+ field[:size] = unquote_value(column[:size])
157
130
 
158
131
  end
132
+
133
+ field
159
134
 
160
- # Is primary key?
161
-
162
- if column[:pk] == 't' || column[:pk] == 1
163
-
164
- column[:pk] = true
165
-
166
- else
135
+ end
136
+
137
+ # === Description
138
+ # Make an Imparcial's hash into SQl's
139
+
140
+ def field_to_column ( field = {} )
167
141
 
168
- column[:pk] = false
169
-
170
- end
171
-
172
- # Is automagically incremented?
173
-
174
- if column[:auto_increment] == 1
175
-
176
- column[:auto_increment] = true
142
+ column = {}
177
143
 
178
- else
144
+ column[:name] = quote(field[:name])
145
+ column[:type] = regular_types[field[:type]]
146
+ column[:size] = field[:size]
179
147
 
180
- column[:auto_increment] = false
181
-
182
- end
148
+ column
183
149
 
184
- if column[:indexed] == 't' || column[:indexed] == 1
185
-
186
- column[:indexed] = true
187
-
188
- else
189
-
190
- column[:indexed] = false
191
-
192
- end
193
-
194
150
  end
195
151
 
196
- # Iterate columns by parsing them.
197
-
198
- def parse_columns ( columns, &block )
152
+ # === Description
153
+ # Transform a regular field into SQL syntax.
199
154
 
200
- raise OptionError.new unless columns
201
- raise OptionError.new if columns.length < 1
155
+ def field_to_column_sql ( field = {} )
202
156
 
203
- for column in columns
157
+ column = field_to_column field
158
+
159
+ syntax = "#{column[:name]} #{column[:type]}"
160
+ syntax += "(#{column[:size]})" if column[:size]
161
+
162
+ syntax
204
163
 
205
- parse_column column
206
- yield column
207
-
208
- end
209
-
210
164
  end
211
-
165
+
212
166
  end
213
167
  end
214
168
  end
@@ -1,8 +1,9 @@
1
1
  module Imparcial
2
2
  module Driver
3
- module UtilBase
3
+ module AbstractUtil
4
4
 
5
- # This method possibly will work for many databases.
5
+ # === Description
6
+ # Apply default database value quoting system.
6
7
 
7
8
  def quote_value ( val )
8
9
 
@@ -18,17 +19,28 @@ module Imparcial
18
19
 
19
20
  end
20
21
 
21
- # This method possibly will work for many databases.
22
+ # === Description
23
+ # Apply default database value unquoting system.
22
24
 
23
25
  def unquote_value ( val )
24
26
 
27
+ return nil if val == nil
25
28
  return 0 if val == '0'
26
29
 
27
- val.to_i == 0 ? val : val.to_i
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
28
39
 
29
40
  end
30
41
 
31
- # Subclasses need to override it.
42
+ # === Description
43
+ # Apply default database quoting system.
32
44
 
33
45
  def quote ( val )
34
46