sqlyzer 0.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/sqlyzer/db.rb ADDED
@@ -0,0 +1,141 @@
1
+ # SQLYZER Ruby Object serializer to SQL.
2
+ # For more information visit http://sqlyzer.rubyforge.org
3
+ #
4
+ # This program is free software; you can redistribute it and/or
5
+ # modify it under the terms of the GNU General Public License
6
+ # as published by the Free Software Foundation; either version 2
7
+ # of the License, or (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program; if not, write to the Free Software
16
+ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17
+ #
18
+
19
+ require 'dbi'
20
+
21
+ require 'sqlyzer/errors'
22
+
23
+ module Sqlyzer
24
+
25
+ #
26
+ #Static class assuming connectivity and traffic to remote database server.
27
+ #It's a pure ruby interface to Ruby DBI Api, offering some usage improvements.
28
+ #
29
+ class Db
30
+
31
+ private
32
+
33
+ #
34
+ #Class variable storing current DBI connexion to the database.
35
+ #
36
+ @@handle = nil
37
+
38
+ #
39
+ #This method is called by do, query_hash and query_array to manage
40
+ #error handling.
41
+ #
42
+ #Throws Sqlyzer::NotConnectedError and Sqlyzer::RequestError.
43
+ #
44
+ def Db._safe_request(request)
45
+ raise Sqlyzer::NotConnectedError unless @@handle
46
+ begin
47
+ yield request
48
+ rescue DBI::Error
49
+ raise Sqlyzer::RequestError, request
50
+ end
51
+ end
52
+
53
+ public
54
+
55
+ #
56
+ #This method will try to establish the connexion to remote database server from
57
+ #given _api_, _hostname_, _database_, _username_ and _password_.
58
+ #Method call will assign _handle_ class attribute.
59
+ #
60
+ #Throws Sqlyzer::ConnexionError.
61
+ #
62
+ def Db.connect(api, hostname, database, username, password)
63
+ begin
64
+ @@handle = DBI.connect("DBI:#{api}:#{database}:#{hostname}", username, password)
65
+ rescue DBI::Error
66
+ raise Sqlyzer::ConnexionError, "#{username}@DBI:#{api}:#{database}:#{hostname}"
67
+ else
68
+ true
69
+ end
70
+ end
71
+
72
+ public
73
+
74
+ #
75
+ #Retreive the Array containing the table list in current database.
76
+ #
77
+ #Throws Sqlyzer::NotConnectedError.
78
+ #
79
+ def Db.tables
80
+ raise Sqlyzer::NotConnectedError unless @@handle
81
+ @@handle.tables
82
+ end
83
+
84
+ #
85
+ #Send given _request_ to the database, doesn't expect any return value.
86
+ #Mostly used with CREATE, ALTER, INSERT, UPDATE or DELETE Sql commands.
87
+ #
88
+ def Db.do(request)
89
+ Db::_safe_request(request) { |r|
90
+ @@handle.do r
91
+ }
92
+ end
93
+
94
+ #
95
+ #Send given _request_ to the database and expect a return value as an array
96
+ #from the remote server. Each tupple will be passed through a yield call, enabling
97
+ #user to process a request result just like Array#each.
98
+ #Mostly used with SELECT Sql command.
99
+ #
100
+ #If no block is given, return do call value.
101
+ #
102
+ def Db.query_array(request)
103
+ return Db::do(request) unless block_given?
104
+ Db::_safe_request(request) { |r|
105
+ sth = @@handle.execute r
106
+ while row = sth.fetch
107
+ yield row
108
+ end
109
+ sth.finish
110
+ }
111
+ end
112
+
113
+ #
114
+ #Send given _request_ to the database and expect a return value as a Hash
115
+ #from the remote server. Each tupple will be passed through a yield call, enabling
116
+ #user to process a request result just like Hash#each.
117
+ #Mostly used with SELECT Sql command.
118
+ #
119
+ #If no block is given, return do call value.
120
+ #
121
+ def Db.query_hash(request)
122
+ return Db::do(request) unless block_given?
123
+ Db::_safe_request(request) { |r|
124
+ sth = @@handle.execute r
125
+ while row = sth.fetch_hash
126
+ yield row
127
+ end
128
+ sth.finish
129
+ }
130
+ end
131
+
132
+ #
133
+ #Alias to query_hash.
134
+ #
135
+ def Db.query(request, &block)
136
+ query_hash(request, &block)
137
+ end
138
+
139
+ end #~ Db
140
+
141
+ end #~ Sqlyzer
@@ -0,0 +1,75 @@
1
+ # SQLYZER Ruby Object serializer to SQL.
2
+ # For more information visit http://sqlyzer.rubyforge.org
3
+ #
4
+ # This program is free software; you can redistribute it and/or
5
+ # modify it under the terms of the GNU General Public License
6
+ # as published by the Free Software Foundation; either version 2
7
+ # of the License, or (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program; if not, write to the Free Software
16
+ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17
+ #
18
+
19
+ module Sqlyzer
20
+
21
+ #
22
+ #Sqlyzer main Error class.
23
+ #
24
+ #All other errors from this module are inherited from Sqlyzer::Error :
25
+ #* Sqlyzer::DatabaseError
26
+ #* Sqlyzer::NotConnectedError
27
+ #* Sqlyzer::ConnexionError
28
+ #* Sqlyzer::RequestError
29
+ #
30
+ class Error < ::RuntimeError
31
+ end #~ Error
32
+
33
+ #
34
+ #Database main Error class.
35
+ #
36
+ #All other errors relating Database are inherited from Sqlyzer::DatabaseError :
37
+ #* Sqlyzer::NotConnectedError
38
+ #* Sqlyzer::ConnexionError
39
+ #* Sqlyzer::RequestError
40
+ #
41
+ class DatabaseError < Error
42
+ end #~ DatabaseError
43
+
44
+ #
45
+ #Raised when calling an instruction which need a database connectivity before
46
+ #calling Sqlyzer::Db::connect to establish connexion.
47
+ #
48
+ class NotConnectedError < DatabaseError
49
+ def initialize
50
+ super "You have to call Sqlyzer::Db::connect at the top of your code before running this command.\nSee RDoc for more instructions."
51
+ end
52
+ end #~ NotConnectedError
53
+
54
+ #
55
+ #Raised when an error is caught during connexion to the database.
56
+ #
57
+ class ConnexionError < DatabaseError
58
+ def initialize(connexion_string)
59
+ super "Received error : #{$!.to_s.chomp}\nfor DBI connexion string : '#{connexion_string}'"
60
+ end
61
+ end #~ ConnexionError
62
+
63
+ #
64
+ #Raised when an invalid Sql request is sent to the database.
65
+ #
66
+ #Development will aim at never raise such error (as the user doesn't have to
67
+ #deal with Sql).
68
+ #
69
+ class RequestError < DatabaseError
70
+ def initialize(request)
71
+ super "Received error : #{$!.to_s.chomp}\nfor DBI sql request : '#{request}'"
72
+ end
73
+ end #~ RequestError
74
+
75
+ end #~ Sqlyzer
@@ -0,0 +1,88 @@
1
+ # SQLYZER Ruby Object serializer to SQL.
2
+ # For more information visit http://sqlyzer.rubyforge.org
3
+ #
4
+ # This program is free software; you can redistribute it and/or
5
+ # modify it under the terms of the GNU General Public License
6
+ # as published by the Free Software Foundation; either version 2
7
+ # of the License, or (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program; if not, write to the Free Software
16
+ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17
+ #
18
+
19
+ require 'singleton'
20
+
21
+ require 'sqlyzer/errors'
22
+ require 'sqlyzer/db'
23
+ require 'sqlyzer/request'
24
+
25
+ module Sqlyzer
26
+
27
+ #
28
+ #Singleton class handling generation and execution of all Sql commands.
29
+ #This is the only place where Sql requests are executed.
30
+ #
31
+ class Handler
32
+ include Singleton
33
+
34
+ public
35
+
36
+ #
37
+ #Register an instance of class extended with Sqlyzer::Serializer.
38
+ #This method will create the Sql table associated with _sender_ class if there
39
+ #is no table named like _sender_#sql_container_table().
40
+ #
41
+ def register_sender(sender)
42
+ Db::do sender.sql_serialize(:sql_table) unless
43
+ Db::tables.include?(sender.sql_container_table)
44
+ end
45
+
46
+ public
47
+
48
+ #
49
+ #Static method called by Sqlyzer::Serializer to request execution and generation of
50
+ #every Sql command.
51
+ #The command to generate and execute is determined by _action_ Symbol value :
52
+ #* :sql_select,
53
+ #* :sql_insert,
54
+ #* :sql_update,
55
+ #* :sql_delete.
56
+ #
57
+ #When _action_ value is :sql_select, this method restore all _sender_ attributes from data
58
+ #returned by generated Sql SELECT command execution.
59
+ #
60
+ #When _sender_ call this method for the first time, it is automatically registered
61
+ #through register_sender.
62
+ #
63
+ #TODO: This method is very trivial for now, but further optimizations of Sql
64
+ #commands execution timelime have to go there.
65
+ #
66
+ def Handler.request(sender, action)
67
+ Handler.instance.register_sender sender
68
+ case action
69
+ when :sql_select then
70
+ Db::query(sender.sql_serialize(:sql_select)) { |data|
71
+ data.each { |key, value|
72
+ attrib = sender.sql_container_values[key]
73
+ if attrib.nil?
74
+ sender.sql_container_keys[key].to_owner(sender, value)
75
+ else
76
+ attrib.to_owner(sender, value)
77
+ end
78
+ }
79
+ }
80
+ else
81
+ Db::do(sender.sql_serialize(action))
82
+ end
83
+ nil
84
+ end
85
+
86
+ end #~ Handler
87
+
88
+ end #~ Sqlyzer
@@ -0,0 +1,448 @@
1
+ # SQLYZER Ruby Object serializer to SQL.
2
+ # For more information visit http://sqlyzer.rubyforge.org
3
+ #
4
+ # This program is free software; you can redistribute it and/or
5
+ # modify it under the terms of the GNU General Public License
6
+ # as published by the Free Software Foundation; either version 2
7
+ # of the License, or (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program; if not, write to the Free Software
16
+ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17
+ #
18
+
19
+ require 'sqlyzer/errors'
20
+
21
+ module Sqlyzer
22
+
23
+ #
24
+ #Handling of class attributes to serialize
25
+ #
26
+ module Parameter
27
+
28
+ #
29
+ #Every Sql type Mixin with serialize/unserialize procedures
30
+ #
31
+ module Types
32
+
33
+ public
34
+
35
+ #Sql Integer type Mixin
36
+ module Int
37
+ def to_sql_type; 'INT'; end
38
+ end #~ Int
39
+
40
+ #Sql Integer2 type Mixin
41
+ module Int2
42
+ def to_sql_type; 'INT2'; end
43
+ end #~ Int2
44
+
45
+ #Sql Integer4 type Mixin
46
+ module Int4
47
+ def to_sql_type; 'INT4'; end
48
+ end #~ Int4
49
+
50
+ #Sql Integer8 type Mixin
51
+ module Int8
52
+ def to_sql_type; 'INT8'; end
53
+ end #~ Int8
54
+
55
+ #Sql Float type Mixin
56
+ module Float
57
+ def to_sql_type; 'FLOAT'; end
58
+ end #~ Float
59
+
60
+ #Sql Float4 type Mixin
61
+ module Float4
62
+ def to_sql_type; 'FLOAT4'; end
63
+ end #~ Float4
64
+
65
+ #Sql Float8 type Mixin
66
+ module Float8
67
+ def to_sql_type; 'FLOAT8'; end
68
+ end #~ Float8
69
+
70
+ #Sql Boolean type Mixin
71
+ module Bool
72
+ def to_sql_type; 'BOOL'; end
73
+ end #~ Bool
74
+
75
+ #Sql Text type Mixin
76
+ module Text
77
+ def to_sql_type; 'TEXT'; end
78
+ #Ruby String to Sql Text serialization with Sql escaping notation.
79
+ def to_sql(owner)
80
+ "E'#{super(owner).to_s.gsub "'", "\\'"}'"
81
+ end
82
+ end #~ Text
83
+
84
+ #Sql Varchar type Mixin
85
+ module VarChar
86
+ #Return _VARCHAR_ if no capacity was specified by the user.
87
+ def to_sql_type
88
+ return 'VARCHAR' if @capacity.nil?
89
+ "VARCHAR(#{@capacity})"
90
+ end #
91
+ #Overload default parameter assigment for setting VarChar capacity with a Ruby Range object.
92
+ def /(default)
93
+ @capacity = default.max
94
+ super ''
95
+ end
96
+ #Ruby String to Sql Varchar serialization like Text, but truncate the String if too long.
97
+ def to_sql(owner)
98
+ if @capacity.nil?
99
+ "E'#{super(owner).to_s.gsub "'", "\\'"}'"
100
+ else
101
+ "E'#{super(owner).to_s[0..@capacity - 1].gsub "'", "\\'"}'"
102
+ end
103
+ end
104
+ end #~ VarChar
105
+
106
+ #Sql Date type Mixin
107
+ module Date
108
+ def to_sql_type; 'DATE'; end
109
+ #Ruby Time object to Sql Date String representation
110
+ def to_sql(owner)
111
+ sql_parameter_eval(owner).strftime "'%Y-%m-%d'"
112
+ end
113
+ #DBI::Date object to Ruby Time
114
+ def to_owner(owner, data)
115
+ sql_parameter_set owner, data.to_time
116
+ end
117
+ end #~ Date
118
+
119
+ #Sql Time type Mixin
120
+ module Time
121
+ def to_sql_type; 'TIME'; end
122
+ #Ruby Time object to Sql Time String representation
123
+ def to_sql(owner)
124
+ sql_parameter_eval(owner).strftime "'%H:%M:%S'"
125
+ end
126
+ #Sql Time type to Ruby Time object
127
+ def to_owner(owner, data)
128
+ sql_parameter_set owner, ::Time.parse(data)
129
+ end
130
+ end #~ Time
131
+
132
+ #Sql DateTime type Mixin
133
+ module DateTime
134
+ def to_sql_type; 'DATETIME'; end
135
+ #Ruby Time object to Sql DateTime String representation
136
+ def to_sql(owner)
137
+ sql_parameter_eval(owner).strftime "'%Y-%m-%d %H:%M:%S'"
138
+ end
139
+ #DBI::DateTime object to Ruby Time object
140
+ def to_owner(owner, data)
141
+ sql_parameter_set owner, data.to_time
142
+ end
143
+ end #~ DateTime
144
+
145
+ public
146
+
147
+ module Alias
148
+
149
+ #Constant alias for Sqlyzer::Parameter::Types::Int
150
+ SQL_INT = Sqlyzer::Parameter::Types::Int
151
+ #Constant alias for Sqlyzer::Parameter::Types::Int2
152
+ SQL_INT2 = Sqlyzer::Parameter::Types::Int2
153
+ #Constant alias for Sqlyzer::Parameter::Types::Int4
154
+ SQL_INT4 = Sqlyzer::Parameter::Types::Int4
155
+ #Constant alias for Sqlyzer::Parameter::Types::Int8
156
+ SQL_INT8 = Sqlyzer::Parameter::Types::Int8
157
+ #Constant alias for Sqlyzer::Parameter::Types::Float
158
+ SQL_FLOAT = Sqlyzer::Parameter::Types::Float
159
+ #Constant alias for Sqlyzer::Parameter::Types::Float4
160
+ SQL_FLOAT4 = Sqlyzer::Parameter::Types::Float4
161
+ #Constant alias for Sqlyzer::Parameter::Types::Float8
162
+ SQL_FLOAT8 = Sqlyzer::Parameter::Types::Float8
163
+ #Constant alias for Sqlyzer::Parameter::Types::Bool
164
+ SQL_BOOL = Sqlyzer::Parameter::Types::Bool
165
+ #Constant alias for Sqlyzer::Parameter::Types::Text
166
+ SQL_TEXT = Sqlyzer::Parameter::Types::Text
167
+ #Constant alias for Sqlyzer::Parameter::Types::VarChar
168
+ SQL_VARCHAR = Sqlyzer::Parameter::Types::VarChar
169
+ #Constant alias for Sqlyzer::Parameter::Types::Date
170
+ SQL_DATE = Sqlyzer::Parameter::Types::Date
171
+ #Constant alias for Sqlyzer::Parameter::Types::Time
172
+ SQL_TIME = Sqlyzer::Parameter::Types::Time
173
+ #Constant alias for Sqlyzer::Parameter::Types::DateTime
174
+ SQL_DATETIME = Sqlyzer::Parameter::Types::DateTime
175
+
176
+ end #~ Alias
177
+
178
+ end #~ Types
179
+
180
+ #
181
+ #Proxy class for Symbol. Permit to extend a Symbol class with coresponding
182
+ #Sql type handling Mixin.
183
+ #
184
+ #This class mainly exists to enable extending a Symbol, which is not possible
185
+ #with Ruby regular Symbol class. This is nearly an abstract class (as Ruby doesn't
186
+ #really implement this concept) and must be extended with coresponding Sql type Mixin.
187
+ #If no type specification is given, the class will be considered as a
188
+ #Sqlyzer::Parameter::Types::Text attribute.
189
+ #
190
+ class Default
191
+ include Comparable
192
+
193
+ attr_reader :symbol
194
+
195
+ public
196
+
197
+ #
198
+ #Constructor method. The fresh Default object will possess _symbol_ as @symbol attribute.
199
+ #
200
+ def initialize(symbol)
201
+ @symbol = symbol
202
+ end
203
+
204
+ private
205
+
206
+ #
207
+ #Evaluate the Symbol value in the given _owner_ object.
208
+ #If Symbol does not exists in _owner_, try to reach default value else raise
209
+ #an error.
210
+ #
211
+ def sql_parameter_eval(owner)
212
+ begin
213
+ res = owner.send(@symbol)
214
+ return res unless res.nil?
215
+ @default
216
+ rescue => err
217
+ raise err unless @default
218
+ @default
219
+ end
220
+ end
221
+
222
+ #
223
+ #Assign the Symbol _value_ in to _owner_ object.
224
+ #
225
+ def sql_parameter_set(owner, value)
226
+ owner.method("#{@symbol}=").call value
227
+ end
228
+
229
+ #
230
+ #Set parameter default in case of non existent Symbol.
231
+ #
232
+ #See sql_parameter_eval.
233
+ #
234
+ def sql_parameter_default(val)
235
+ @default = val
236
+ end
237
+
238
+ public
239
+
240
+ #
241
+ #Implement the Ruby Comparable Mixin, enabling to compare Default
242
+ #with Default, Symbol or String (in this order).
243
+ #
244
+ def <=>(other)
245
+ if other.kind_of?(Default)
246
+ @symbol.to_i <=> other.symbol.to_i
247
+ elsif other.kind_of?(Symbol)
248
+ @symbol.to_i <=> other.to_i
249
+ else
250
+ @symbol.to_s <=> other.to_s
251
+ end
252
+ end
253
+
254
+ #
255
+ #Call sql_parameter_default and return _self_.
256
+ #
257
+ def /(default)
258
+ sql_parameter_default default
259
+ self
260
+ end
261
+
262
+ #
263
+ #Call contained Symbol to_s method.
264
+ #
265
+ def to_s
266
+ @symbol.to_s
267
+ end
268
+
269
+ #
270
+ #Return the Sql type name of the current instance.
271
+ #
272
+ #This method will raise an error unless current instance was extend with
273
+ #coresponding Sql type Mixin.
274
+ #
275
+ def to_sql_type
276
+ raise 'unreached'
277
+ end
278
+
279
+ #
280
+ #Serialize the Symbol value contained in _owner_ to Sql representation.
281
+ #
282
+ def to_sql(owner)
283
+ sql_parameter_eval(owner).to_s
284
+ end
285
+
286
+ #
287
+ #Unserialize Sql representation of _data_ to assign it to _owner_.
288
+ #
289
+ def to_owner(owner, data)
290
+ sql_parameter_set(owner, data)
291
+ end
292
+
293
+ public
294
+
295
+ #
296
+ #Create an instance of Default by giving a Symbol and a default value.
297
+ #Coresponding Sql type Mixin will be determined from default value type.
298
+ #
299
+ #Here is the list of coresponding Sql type for each Ruby class handled :
300
+ #* Integer, Fixnum <=> Sqlyzer::Parameter::Types::Int (SQL_INT),
301
+ #* Float <=> Sqlyzer::Parameter::Types::Float (SQL_FLOAT),
302
+ #* Time <=> Sqlyzer::Parameter::Types::Date (SQL_DATE),
303
+ #* TrueClass, FalseClass <=> Sqlyzer::Parameter::Types::Bool (SQL_BOOL),
304
+ #* Range <=> Sqlyzer::Parameter::Types::VarChar (SQL_VARCHAR).
305
+ #
306
+ #Any other Ruby class will be considered as a Sqlyzer::Parameter::Types::Text (SQL_TEXT).
307
+ #
308
+ def Default.get_from_default(symbol, val)
309
+ res = Default.new(symbol)
310
+ case val
311
+ when Object::Integer, Object::Fixnum then
312
+ res.extend Types::Alias::SQL_INT
313
+ when Object::Float then
314
+ res.extend Types::Alias::SQL_FLOAT
315
+ when Object::Time then
316
+ res.extend Types::Alias::SQL_DATE
317
+ when Object::TrueClass, Object::FalseClass then
318
+ res.extend Types::Alias::SQL_BOOL
319
+ when Object::Range then
320
+ res.extend Types::Alias::SQL_VARCHAR
321
+ else
322
+ res.extend Types::Alias::SQL_TEXT
323
+ end
324
+ res/val
325
+ end
326
+
327
+ #
328
+ #Create a new instance of Default by giving a Symbol and the coresponding
329
+ #Sql type Mixin.
330
+ #
331
+ def Default.get_from_type(symbol, type)
332
+ res = Default.new(symbol)
333
+ res.extend type
334
+ res
335
+ end
336
+
337
+ end #~ Default
338
+
339
+ #
340
+ #Overloaded Array class to store Default class list.
341
+ #
342
+ class List < Array
343
+
344
+ public
345
+
346
+ #
347
+ #Create a new instance of List with given _elements_ considered as an Array
348
+ #of Symbol or a List.
349
+ #If no parameter is given, create an empty List.
350
+ #
351
+ def initialize(elements = nil)
352
+ push_parameters elements if elements
353
+ end
354
+
355
+ public
356
+
357
+ #
358
+ #Return a new Array class containing each contained Default class Sql representation
359
+ #from values retreived in _owner_.
360
+ #
361
+ def to_sql(owner)
362
+ collect { |symbol|
363
+ symbol.to_sql owner
364
+ }
365
+ end
366
+
367
+ public
368
+
369
+ #
370
+ #Search trough contained Default classes for _key_.
371
+ #_key_ should be a Default class, a Symbol or a String.
372
+ #
373
+ #See Default#<=> for more informations.
374
+ #
375
+ def fetch_parameter(key)
376
+ each { |parameter|
377
+ if parameter == key
378
+ yield parameter if block_given?
379
+ return parameter
380
+ end
381
+ }
382
+ nil
383
+ end
384
+ alias [] fetch_parameter
385
+
386
+ public
387
+
388
+ #
389
+ #Push a _symbol_ on the top of the Array.
390
+ #_symbol_ should be Default class or a Symbol. If _symbol_ is a Symbol, it
391
+ #will be automatically converted to a Default class extended with Text Sql
392
+ #type handling.
393
+ #
394
+ def push(symbol)
395
+ return if include?(symbol)
396
+ if symbol.kind_of?(Default)
397
+ super symbol
398
+ else
399
+ super(symbol/Sqlyzer::Parameter::Types::Text)
400
+ end
401
+ end
402
+ alias push_parameter push
403
+ alias << push
404
+
405
+ #
406
+ #Push each item of _data_ Array by calling previous push_paramether method.
407
+ #
408
+ def push_parameters(data)
409
+ data.each { |symbol|
410
+ push symbol
411
+ }
412
+ self
413
+ end
414
+ alias + push_parameters
415
+
416
+ #
417
+ #Overloaded version on Array#join to handle suffix on each element.
418
+ #
419
+ def join(separator = ', ', suffix = '')
420
+ "#{super("#{suffix}#{separator}")}#{suffix}"
421
+ end
422
+ alias join_parameters join
423
+
424
+ end #~ List
425
+
426
+ end #~ Parameter
427
+ end #~ Sqlyzer
428
+
429
+ #
430
+ #Extend regular Symbol class of Ruby to enable sexy explicit Sql type cast
431
+ #through divide (/) operator.
432
+ #
433
+ class Symbol
434
+ #
435
+ #Create a new instance of Sqlyzer::Parameter::Default containing current Symbol
436
+ #instance.
437
+ #If _param_ is a Ruby Module, the new Sqlyzer::Parameter::Default class will be
438
+ #generated by calling Sqlyzer::Parameter::Default::get_from_type(), else from
439
+ #Sqlyzer::Parameter::Default::get_from_default().
440
+ #
441
+ def /(param)
442
+ if param.kind_of?(Module)
443
+ Sqlyzer::Parameter::Default.get_from_type self, param
444
+ else
445
+ Sqlyzer::Parameter::Default.get_from_default self, param
446
+ end
447
+ end
448
+ end #~ Symbol