oedipus 0.0.11 → 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
data/ext/oedipus/lexing.h CHANGED
@@ -7,6 +7,9 @@
7
7
  * See LICENSE file for details.
8
8
  */
9
9
 
10
+ /*! Scans the entire string pointed to by src into the string pointed to by dest, advancing both pointers */
11
+ int odp_scan_move_pointers(char ** src, char ** dest, long len);
12
+
10
13
  /*! Consume input from the string pointed to by sql_ptr, into the string pointed to by dest_ptr, until stop is reached (inclusive) */
11
14
  int odp_scan_until_char(char stop, char ** sql_ptr, char ** dest_ptr, unsigned long len);
12
15
 
@@ -190,6 +190,16 @@ static void odp_free(OdpMysql * conn) {
190
190
  free(conn);
191
191
  }
192
192
 
193
+ int odp_scan_move_pointers(char ** src, char ** dest, long len) {
194
+ char * end = *src + len;
195
+
196
+ for (; *src < end; ++(*src)) {
197
+ *((*dest)++) = **src;
198
+ }
199
+
200
+ return 1;
201
+ }
202
+
193
203
  static VALUE odp_replace_bind_values(OdpMysql * conn, VALUE sql, VALUE * bind_values, int num_values) {
194
204
  // FIXME: Refactor this whole method, somehow... use a struct instead of a gazillion variables, so other functions can be called
195
205
  char * sql_str;
@@ -217,7 +227,7 @@ static VALUE odp_replace_bind_values(OdpMysql * conn, VALUE sql, VALUE * bind_va
217
227
  }
218
228
 
219
229
  {
220
- char escaped_sql_str[escaped_sql_len];
230
+ char escaped_sql_str[escaped_sql_len]; // FIXME: Possibly use the heap
221
231
  char * sql_end;
222
232
  char * dest;
223
233
 
@@ -226,33 +236,32 @@ static VALUE odp_replace_bind_values(OdpMysql * conn, VALUE sql, VALUE * bind_va
226
236
 
227
237
  for (i = 0; i < num_values; ++i) {
228
238
  char * str = str_values[i];
229
- char len = strlen(str);
230
- long pos = 0;
239
+ long len = strlen(str);
231
240
 
232
241
  if (!(odp_scan_until_marker(&sql_str, &dest, sql_end - sql_str))) {
233
242
  break;
234
243
  }
235
244
 
236
245
  if (!(ODP_KIND_OF_P(bind_values[i], rb_cNumeric))) {
237
- char escaped_str[escaped_value_lengths[i]];
238
- char quoted_str[escaped_value_lengths[i]];
246
+ // would prefer to use stack allocation, but it segfaults with larger (megabytes) values
247
+ char * escaped_str = (char *) malloc(escaped_value_lengths[i]);
248
+ char * quoted_str = (char *) malloc(escaped_value_lengths[i]);
239
249
 
240
250
  mysql_real_escape_string(conn->ptr, escaped_str, str, len);
241
251
  sprintf(quoted_str, "'%s'", escaped_str);
242
-
243
252
  str = quoted_str;
244
- len = strlen(quoted_str);
245
- }
246
253
 
247
- for (pos = 0; pos < len; ++pos) {
248
- *(dest++) = str[pos];
254
+ odp_scan_move_pointers(&str, &dest, strlen(str));
255
+
256
+ free(quoted_str);
257
+ free(escaped_str);
258
+ } else {
259
+ odp_scan_move_pointers(&str, &dest, len);
249
260
  }
250
261
  }
251
262
 
252
263
  // copy remainder
253
- for (; sql_str < sql_end; ++sql_str) {
254
- *(dest++) = *sql_str;
255
- }
264
+ odp_scan_move_pointers(&sql_str, &dest, sql_end - sql_str);
256
265
 
257
266
  return rb_str_new(escaped_sql_str, dest - escaped_sql_str);
258
267
  }
@@ -8,5 +8,5 @@
8
8
  ##
9
9
 
10
10
  module Oedipus
11
- VERSION = "0.0.11"
11
+ VERSION = "0.0.12"
12
12
  end
@@ -139,5 +139,9 @@ describe Oedipus::Connection do
139
139
  it "handles nil" do
140
140
  conn.execute("REPLACE INTO posts_rt (id, title, state, body) VALUES (?, 'question?', 'other?', ?)", 1, nil)
141
141
  end
142
+
143
+ it "handles really long strings" do
144
+ conn.execute("REPLACE INTO posts_rt (id, title, state, body) VALUES (?, 'question?', 'other?', ?)", 1, 'a' * 2_000_000)
145
+ end
142
146
  end
143
147
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oedipus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 0.0.12
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-05-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &10245200 !ruby/object:Gem::Requirement
16
+ requirement: &19781180 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *10245200
24
+ version_requirements: *19781180
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake-compiler
27
- requirement: &10244200 !ruby/object:Gem::Requirement
27
+ requirement: &19780720 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *10244200
35
+ version_requirements: *19780720
36
36
  description: ! "== Sphinx 2 Comes to Ruby\n\nOedipus brings full support for Sphinx
37
37
  2 to Ruby:\n\n - real-time indexes (insert, replace, update, delete)\n - faceted
38
38
  search (variations on a base query)\n - multi-queries (multiple queries executed
@@ -111,7 +111,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
111
111
  version: '0'
112
112
  segments:
113
113
  - 0
114
- hash: -3872912040138826603
114
+ hash: -3179225269925894902
115
115
  required_rubygems_version: !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
@@ -120,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
120
  version: '0'
121
121
  segments:
122
122
  - 0
123
- hash: -3872912040138826603
123
+ hash: -3179225269925894902
124
124
  requirements: []
125
125
  rubyforge_project: oedipus
126
126
  rubygems_version: 1.8.11