webink 2.0.2 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/lib/webink/database.rb +40 -15
  2. data/lib/webink/model.rb +22 -30
  3. metadata +2 -2
@@ -169,6 +169,44 @@ module Ink
169
169
  result
170
170
  end
171
171
 
172
+ # Class method
173
+ #
174
+ # Transform a value to sql representative values.
175
+ # This means quotes are escaped, nils are transformed
176
+ # and everything else is quoted.
177
+ # [param value:] Object
178
+ # [returns:] transformed String
179
+ def self.transform_to_sql(value)
180
+ if value.nil?
181
+ "NULL"
182
+ elsif value.is_a? String
183
+ "\'#{value.gsub(/'/, ''')}\'"
184
+ elsif value.is_a? Numeric
185
+ value
186
+ else
187
+ "\'#{value}\'"
188
+ end
189
+ end
190
+
191
+ # Class method
192
+ #
193
+ # Transform a value from sql to objects.
194
+ # This means nils, integer, floats and strings
195
+ # are imported correctly.
196
+ # [param value:] String
197
+ # [returns:] Object
198
+ def self.transform_from_sql(value)
199
+ if value =~ /^NULL$/
200
+ nil
201
+ elsif value =~ /^\d+$/
202
+ value.to_i
203
+ elsif value =~ /^\d+\.\d+$/
204
+ value.to_f
205
+ else
206
+ value
207
+ end
208
+ end
209
+
172
210
  # Instance method
173
211
  #
174
212
  # Send an SQL query string to the database
@@ -186,14 +224,7 @@ module Ink
186
224
  result.push type.new
187
225
  row.each_index do |i|
188
226
  k = keys[i]
189
- v = row[i]
190
- if v =~ /^[0-9]+$/
191
- v = $&.to_i
192
- elsif v =~ /^[0-9]+\.[0-9]+$/
193
- v = $&.to_f
194
- elsif v =~ /^NULL$/
195
- v = nil
196
- end
227
+ v = self.class.transform_from_sql(row[i])
197
228
  if block_given?
198
229
  yield(result[result.length-1], k, v)
199
230
  else
@@ -207,13 +238,7 @@ module Ink
207
238
  re.each do |row|
208
239
  result.push type.new
209
240
  re.columns.each_index do |i|
210
- if row[i] =~ /^[0-9]+$/
211
- row[i] = $&.to_i
212
- elsif row[i] =~ /^[0-9]+\.[0-9]+$/
213
- row[i] = $&.to_f
214
- elsif row[i] =~ /^NULL$/
215
- row[i] = nil
216
- end
241
+ row[i] = self.class.transform_from_sql(row[i])
217
242
  if block_given?
218
243
  yield(result[result.length-1], re.columns[i], row[i])
219
244
  else
@@ -163,24 +163,33 @@ module Ink
163
163
  end
164
164
  end
165
165
 
166
+ # Class method
167
+ #
168
+ # Similar to making an Object sql safe.
169
+ # Escapes quotes.
170
+ # [param value:] Object
171
+ # [returns:] safe Object
172
+ def self.make_safe(value)
173
+ if value.nil?
174
+ nil
175
+ elsif value.is_a? String
176
+ value.gsub(/'/, ''')
177
+ elsif value.is_a? Numeric
178
+ value
179
+ else
180
+ "\'#{value}\'"
181
+ end
182
+ end
183
+
166
184
  # Private instance method
167
185
  #
168
186
  # Provides an instance accessor and setter for the key. It is
169
187
  # initialized with data[key].
170
188
  # [key:] String
171
- # [data:] Hash of String => Object
189
+ # [value:] Object
172
190
  def init_field(key, value)
173
191
  raise NameError.new("Model cannot use #{key} as field, it is blocked by primary key") if key.to_s.downcase == "pk"
174
- entry = nil
175
- if value.nil?
176
- entry = nil
177
- elsif value.is_a? String
178
- entry = value.gsub(/'/, ''')
179
- elsif value.is_a? Numeric
180
- entry = value
181
- else
182
- entry = "\'#{value}\'"
183
- end
192
+ entry = self.class.make_safe(value)
184
193
  instance_variable_set("@#{key}", entry)
185
194
 
186
195
  if not self.respond_to? key
@@ -191,15 +200,7 @@ module Ink
191
200
  if self.class.primary_key != key
192
201
  if not self.respond_to? "#{key}="
193
202
  self.class.send(:define_method, "#{key}=") do |val|
194
- if val.nil?
195
- val = nil
196
- elsif val.is_a? String
197
- val = val.gsub(/'/, ''')
198
- elsif val.is_a? Numeric
199
- val = val
200
- else
201
- val = "\'#{val}\'"
202
- end
203
+ val = self.class.make_safe(val)
203
204
  instance_variable_set "@#{key}", val
204
205
  end
205
206
  end
@@ -218,16 +219,7 @@ module Ink
218
219
  # [key:] String
219
220
  # [value:] Object
220
221
  def init_no_fields(key, value)
221
- entry = nil
222
- if value.nil?
223
- entry = nil
224
- elsif value.is_a? String
225
- entry = value.gsub(/'/, ''')
226
- elsif value.is_a? Numeric
227
- entry = value
228
- else
229
- entry = "\'#{value}\'"
230
- end
222
+ entry = self.class.make_safe(value)
231
223
  instance_variable_set "@#{key}", entry
232
224
  end
233
225
  private :init_no_fields
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webink
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-30 00:00:00.000000000 Z
12
+ date: 2013-05-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fcgi