twowaysql 0.2.1 → 0.3.0

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.
data/History.txt CHANGED
@@ -1,7 +1,10 @@
1
- == 0.2.0 / 2008-09-05
2
- * Initial release
3
- * RubyForge settings
4
- * rdoc for published classes and methods
1
+ == release_0_3 / 2008-09-10
2
+ * better whitespace handling
3
+ * Whitespace compaction mode
4
+ * remove preserve_eol flag
5
+ * preserve actual comment content
6
+ * write docs for space compaction mode
7
+ * change line-based scanning to whole string based scanning
5
8
 
6
9
  == 0.2.1 / 2008-09-07
7
10
  * bugfix: case insensitive match for SQL reserved words
@@ -9,3 +12,8 @@
9
12
  * integrate ditz html into site
10
13
  * change idiom 'substitution' to 'interpolation'
11
14
  * Handle Embedded variable comment at Scanner/Grammar level
15
+
16
+ == 0.2.0 / 2008-09-05
17
+ * Initial release
18
+ * RubyForge settings
19
+ * rdoc for published classes and methods
data/Manifest.txt CHANGED
@@ -5,16 +5,21 @@ README.txt
5
5
  Rakefile
6
6
  config/hoe.rb
7
7
  config/requirements.rb
8
+ issues/issue-001c53236380a42cd8c5a9099bbcc6ec613919c2.yaml
8
9
  issues/issue-1cee7e821865a216674832b0186bd92792680571.yaml
9
10
  issues/issue-25efcfc383f3b0f6c0e2730ae7c2975bb2b3de26.yaml
11
+ issues/issue-279105dd0d9f03514d318f5eab5e99c4c2d47fda.yaml
12
+ issues/issue-28cde89ed3eb306957edc90595b1d16bf43daf42.yaml
10
13
  issues/issue-39023ea09e17e2d64bcef03aa59cdfe38b78ad5b.yaml
11
14
  issues/issue-4bc308d55ae91f266e656162a4147d356de1166c.yaml
12
15
  issues/issue-5c973ef5bb074eacca0c6c84f7d27c4267773ea8.yaml
13
16
  issues/issue-664986b219202ff1948cab717b56e7540f493561.yaml
17
+ issues/issue-6daccddf089d11d42bf016897da98f70cf5ab46c.yaml
14
18
  issues/issue-897995fa10377eabdf597e8e7692f17087c76923.yaml
15
19
  issues/issue-901f65630639507c8b05b466790e9f22256c6450.yaml
16
20
  issues/issue-bd38c1cdc965d73dd629a81db2de1bcdcf4b10b8.yaml
17
21
  issues/issue-dca4b19aa13de59838b33e03252bf824670a2d12.yaml
22
+ issues/issue-f1bd40de5458397d9b142ea3e197e5264e0dcdbf.yaml
18
23
  issues/issue-f2b773020b54f839c03d899b38b5113c8fd991df.yaml
19
24
  issues/issue-f39b907d01d7fa93df8c7a9de2e1b5e27727ee0a.yaml
20
25
  issues/issue-f64d73ed4f9854f1ded77e6496dbf59cfb3770a7.yaml
data/README.txt CHANGED
@@ -121,10 +121,9 @@ TwoWaySQL is not
121
121
 
122
122
  * actual SQL comment
123
123
 
124
-
125
- === Known limitations
126
-
127
- * currently, ruby version of TwoWaySQL cannot parse multi-line comments.
124
+ * parse options
125
+ * preserve_space
126
+ * preserve_comment
128
127
 
129
128
 
130
129
 
@@ -143,7 +142,7 @@ TwoWaySQL::Template is the class you may only use. TwoWaySQL::Template acts as a
143
142
  ==== Input
144
143
  * TwoWaySQL-style SQL(string,file or anything like IO) to TwoWaySQL::Template.parse to create template object (note: template object is stateless and reentrant, so you can cache it)
145
144
  * (Optionally) TwoWaySQL::Template.parse accepts Hash of parse options as second argument
146
- * data object(Hash-like object) to the TwoWaySQL::Template#merge then TwoWaySQL will evaluate the data as 'ctx'.
145
+ * data object to the TwoWaySQL::Template#merge then TwoWaySQL will evaluate the data as name 'ctx'.
147
146
 
148
147
  ==== Output
149
148
  * SQL String with placeholders (generally, '?' is used for placeholders)
@@ -174,7 +173,7 @@ TwoWaySQL may use bind variable as follows. In this case, value of ctx[:empno] i
174
173
  ===== usage
175
174
 
176
175
  sql = "SELECT * FROM emp WHERE job = /*ctx[:job]*/'CLERK' AND deptno = /*ctx[:deptno]*/20"
177
- template = TwoWaySQL::Template.parse(sql, :preserve_eol => false)
176
+ template = TwoWaySQL::Template.parse(sql)
178
177
 
179
178
  merged = template.merge(:job => "HOGE", :deptno => 30)
180
179
  merged.sql #=> "SELECT * FROM emp WHERE job = ? AND deptno = ?"
@@ -197,7 +196,7 @@ acceptable argument for IN clause is an array-like object. Say, Object that resp
197
196
  ===== usage
198
197
 
199
198
  sql = "SELECT * FROM emp WHERE deptno IN /*ctx[:deptnoList]*/(10, 20) ORDER BY ename"
200
- template = TwoWaySQL::Template.parse(sql, :preserve_eol => false)
199
+ template = TwoWaySQL::Template.parse(sql)
201
200
 
202
201
  merged = template.merge(:deptnoList => [30,40,50])
203
202
  merged.sql #=> "SELECT * FROM emp WHERE deptno IN (?, ?, ?) ORDER BY ename"
@@ -232,7 +231,7 @@ As you noticed. Embedded variable comment has risk for SQL Injection. Please not
232
231
  ===== usage
233
232
 
234
233
  sql = "SELECT * FROM emp ORDER BY /*$ctx[:order_by]*/ename /*$ctx[:order]*/ASC"
235
- template = TwoWaySQL::Template.parse(sql, :preserve_eol => false)
234
+ template = TwoWaySQL::Template.parse(sql)
236
235
 
237
236
  merged = template.merge(:order_by => 'id, :order => 'DESC')
238
237
  merged.sql #=> "SELECT * FROM emp ORDER BY id DESC"
@@ -256,7 +255,7 @@ When the condition returns a truthy value, TwoWaySQL treats statements in "/*IF*
256
255
  ==== usage
257
256
 
258
257
  sql = "SELECT * FROM emp/*IF ctx[:job] */ WHERE job = /*ctx[:job]*/'CLERK'/*END*/"
259
- template = TwoWaySQL::Template.parse(sql, :preserve_eol => false)
258
+ template = TwoWaySQL::Template.parse(sql)
260
259
 
261
260
 
262
261
  # active case
@@ -286,7 +285,7 @@ In this case, when the eval(ctx[:foo]) returns an falsy value, string "hoge IS N
286
285
  ==== ELSE comment sample
287
286
 
288
287
  sql = "SELECT * FROM emp WHERE /*IF ctx[:job]*/job = /*ctx[:job]*/'CLERK'-- ELSE job IS NULL/*END*/"
289
- template = TwoWaySQL::Template.parse(sql, :preserve_eol => false)
288
+ template = TwoWaySQL::Template.parse(sql)
290
289
 
291
290
  # active case
292
291
  merged = template.merge(:job => 'MANAGER')
@@ -327,7 +326,7 @@ In the above example,
327
326
  ==== usage
328
327
 
329
328
  sql = "SELECT * FROM emp/*BEGIN*/ WHERE /*IF ctx[:job]*/job = /*ctx[:job]*/'CLERK'/*END*//*IF ctx[:deptno]*/ AND deptno = /*ctx[:deptno]*/20/*END*//*END*/"
330
- template = TwoWaySQL::Template.parse(sql, :preserve_eol => false)
329
+ template = TwoWaySQL::Template.parse(sql)
331
330
 
332
331
  # when data is empty (no param exists)
333
332
  ctx = {}
@@ -350,6 +349,79 @@ In the above example,
350
349
 
351
350
 
352
351
 
352
+ === Parse Options
353
+
354
+ TwoWaySQL::Template.parse takes parse options as optional second argument. Acceptable parse options are kind_of Hash with available keys. Unknown options are just ignored.
355
+
356
+ * available parse option keys
357
+ * :preserve_space (default is true)
358
+ * :preserve_comment (default is false)
359
+ * :debug (internal use only)
360
+
361
+
362
+ ==== :preserve_space (default is true)
363
+
364
+ Default is true. When true, parser preserves original whitespaces. When false, parser translates consecutive whitespaces to single whitespace. This flag is useful for log space saving.
365
+
366
+
367
+ sql = <<-EOS
368
+ SELECT
369
+ *
370
+ FROM
371
+ emp
372
+ WHERE
373
+ job = /*ctx[:job]*/'CLERK'
374
+ AND deptno = /*ctx[:deptno]*/10
375
+ EOS
376
+ template = TwoWaySQL::Template.parse(sql, :preserve_space => false)
377
+
378
+ result = template.merge(:job => 'MANAGER', :deptno => 30)
379
+
380
+ result.sql #=> "SELECT * FROM emp WHERE job = ? AND deptno = ? "
381
+ result.bound_variables #=> ["MANAGER", 30]
382
+
383
+
384
+ ==== :preserve_comment (default is false)
385
+
386
+ Default is false. When true, parser preserves original actual comments. When false, parser skips actual comment, therefore parsed SQL does not contain actual comments.
387
+
388
+ sql = <<-EOS
389
+ SELECT
390
+ *
391
+ FROM
392
+ emp
393
+ /*
394
+ This is a
395
+ multiline comment
396
+ */
397
+ WHERE
398
+ job = /*ctx[:job]*/'CLERK'
399
+ AND deptno = /*ctx[:deptno]*/10
400
+ EOS
401
+ template = TwoWaySQL::Template.parse(sql, :preserve_comment => true)
402
+
403
+ result = template.merge(:job => 'MANAGER', :deptno => 30)
404
+
405
+ expected = <<-EOS
406
+ SELECT
407
+ *
408
+ FROM
409
+ emp
410
+ /*
411
+ This is a
412
+ multiline comment
413
+ */
414
+ WHERE
415
+ job = ?
416
+ AND deptno = ?
417
+ EOS
418
+ result.sql == expected #=> true
419
+ result.bound_variables #=> ["MANAGER", 30]
420
+
421
+
422
+
423
+
424
+
353
425
  == REQUIREMENTS:
354
426
 
355
427
  * racc/parser (basically bundled with ruby)
@@ -357,7 +429,7 @@ In the above example,
357
429
 
358
430
  == INSTALL:
359
431
 
360
- * sudo gem install twowaysql
432
+ * (sudo) gem install twowaysql
361
433
 
362
434
 
363
435
  == AUTHOR:
@@ -0,0 +1,18 @@
1
+ --- !ditz.rubyforge.org,2008-03-06/issue
2
+ title: integrate RSpec report into website
3
+ desc: integrate RSpec report into website
4
+ type: :task
5
+ component: twowaysql
6
+ release:
7
+ reporter: takuto <takuto.wada@gmail.com>
8
+ status: :unstarted
9
+ disposition:
10
+ creation_time: 2008-09-09 05:46:28.201883 Z
11
+ references: []
12
+
13
+ id: 001c53236380a42cd8c5a9099bbcc6ec613919c2
14
+ log_events:
15
+ - - 2008-09-09 05:46:29.606754 Z
16
+ - takuto <takuto.wada@gmail.com>
17
+ - created
18
+ - ""
@@ -3,10 +3,10 @@ title: better whitespace handling
3
3
  desc: better whitespace handling on Scanner/Grammar.
4
4
  type: :feature
5
5
  component: twowaysql
6
- release:
6
+ release: release_0_3
7
7
  reporter: takuto <takuto.wada@gmail.com>
8
- status: :unstarted
9
- disposition:
8
+ status: :closed
9
+ disposition: :fixed
10
10
  creation_time: 2008-09-03 09:00:15.483485 Z
11
11
  references: []
12
12
 
@@ -16,3 +16,15 @@ log_events:
16
16
  - takuto <takuto.wada@gmail.com>
17
17
  - created
18
18
  - fix some dirty rules for whitespaces, if possible.
19
+ - - 2008-09-08 08:56:27.771360 Z
20
+ - takuto <takuto.wada@gmail.com>
21
+ - assigned to release release_0_3 from unassigned
22
+ - ""
23
+ - - 2008-09-08 08:57:22.550994 Z
24
+ - takuto <takuto.wada@gmail.com>
25
+ - changed status from unstarted to in_progress
26
+ - ""
27
+ - - 2008-09-09 05:38:29.182555 Z
28
+ - takuto <takuto.wada@gmail.com>
29
+ - closed with disposition fixed
30
+ - ""
@@ -0,0 +1,21 @@
1
+ --- !ditz.rubyforge.org,2008-03-06/issue
2
+ title: deal with trailing space of ELSE
3
+ desc: |-
4
+ deal with trailing space of ELSE. e.g.
5
+ ... --ELSE age IS NULL #=> 'age IS NULL'
6
+ ... --ELSE AND age IS NULL #=> 'AND age IS NULL' or ' age IS NULL'
7
+ type: :task
8
+ component: twowaysql
9
+ release:
10
+ reporter: takuto <takuto.wada@gmail.com>
11
+ status: :unstarted
12
+ disposition:
13
+ creation_time: 2008-09-09 05:43:46.691586 Z
14
+ references: []
15
+
16
+ id: 279105dd0d9f03514d318f5eab5e99c4c2d47fda
17
+ log_events:
18
+ - - 2008-09-09 05:43:48.017710 Z
19
+ - takuto <takuto.wada@gmail.com>
20
+ - created
21
+ - ""
@@ -0,0 +1,26 @@
1
+ --- !ditz.rubyforge.org,2008-03-06/issue
2
+ title: write docs for space compaction mode
3
+ desc: write docs for space compaction mode
4
+ type: :task
5
+ component: twowaysql
6
+ release: release_0_3
7
+ reporter: takuto <takuto.wada@gmail.com>
8
+ status: :closed
9
+ disposition: :fixed
10
+ creation_time: 2008-09-09 05:40:16.864740 Z
11
+ references: []
12
+
13
+ id: 28cde89ed3eb306957edc90595b1d16bf43daf42
14
+ log_events:
15
+ - - 2008-09-09 05:40:18.449669 Z
16
+ - takuto <takuto.wada@gmail.com>
17
+ - created
18
+ - ""
19
+ - - 2008-09-09 09:56:02.992717 Z
20
+ - takuto <takuto.wada@gmail.com>
21
+ - changed status from unstarted to in_progress
22
+ - ""
23
+ - - 2008-09-10 06:28:29.298991 Z
24
+ - takuto <takuto.wada@gmail.com>
25
+ - closed with disposition fixed
26
+ - ""
@@ -3,7 +3,7 @@ title: line number support on parse error
3
3
  desc: show line number of SQL when parse error has occurred.
4
4
  type: :feature
5
5
  component: twowaysql
6
- release: release_0_3
6
+ release: release_0_4
7
7
  reporter: takuto <takuto.wada@gmail.com>
8
8
  status: :unstarted
9
9
  disposition:
@@ -20,3 +20,7 @@ log_events:
20
20
  - takuto <takuto.wada@gmail.com>
21
21
  - assigned to release release_0_3 from unassigned
22
22
  - assign to release_0_3
23
+ - - 2008-09-10 06:27:47.942216 Z
24
+ - takuto <takuto.wada@gmail.com>
25
+ - assigned to release release_0_4 from release_0_3
26
+ - ""
@@ -0,0 +1,18 @@
1
+ --- !ditz.rubyforge.org,2008-03-06/issue
2
+ title: integrate ditz to 'push-button release'
3
+ desc: integrate 'ditz release' and 'ditz changelog' into rake task
4
+ type: :task
5
+ component: twowaysql
6
+ release:
7
+ reporter: takuto <takuto.wada@gmail.com>
8
+ status: :unstarted
9
+ disposition:
10
+ creation_time: 2008-09-07 17:34:42.830046 Z
11
+ references: []
12
+
13
+ id: 6daccddf089d11d42bf016897da98f70cf5ab46c
14
+ log_events:
15
+ - - 2008-09-07 17:34:44.130887 Z
16
+ - takuto <takuto.wada@gmail.com>
17
+ - created
18
+ - ""
@@ -3,10 +3,10 @@ title: Whitespace compaction mode
3
3
  desc: Whitespace compaction mode for log space saving
4
4
  type: :feature
5
5
  component: twowaysql
6
- release:
6
+ release: release_0_3
7
7
  reporter: takuto <takuto.wada@gmail.com>
8
- status: :unstarted
9
- disposition:
8
+ status: :closed
9
+ disposition: :fixed
10
10
  creation_time: 2008-09-05 11:32:38.661495 Z
11
11
  references: []
12
12
 
@@ -16,3 +16,15 @@ log_events:
16
16
  - takuto <takuto.wada@gmail.com>
17
17
  - created
18
18
  - ""
19
+ - - 2008-09-08 08:56:36.791742 Z
20
+ - takuto <takuto.wada@gmail.com>
21
+ - assigned to release release_0_3 from unassigned
22
+ - ""
23
+ - - 2008-09-08 08:57:29.584166 Z
24
+ - takuto <takuto.wada@gmail.com>
25
+ - changed status from unstarted to in_progress
26
+ - ""
27
+ - - 2008-09-09 05:38:35.131235 Z
28
+ - takuto <takuto.wada@gmail.com>
29
+ - closed with disposition fixed
30
+ - ""
@@ -0,0 +1,26 @@
1
+ --- !ditz.rubyforge.org,2008-03-06/issue
2
+ title: remove preserve_eol flag
3
+ desc: remove preserve_eol flag. both for one-liner and multi-line SQL.
4
+ type: :feature
5
+ component: twowaysql
6
+ release: release_0_3
7
+ reporter: takuto <takuto.wada@gmail.com>
8
+ status: :closed
9
+ disposition: :fixed
10
+ creation_time: 2008-09-08 18:50:03.580663 Z
11
+ references: []
12
+
13
+ id: f1bd40de5458397d9b142ea3e197e5264e0dcdbf
14
+ log_events:
15
+ - - 2008-09-08 18:50:05.346009 Z
16
+ - takuto <takuto.wada@gmail.com>
17
+ - created
18
+ - ""
19
+ - - 2008-09-08 18:50:28.843212 Z
20
+ - takuto <takuto.wada@gmail.com>
21
+ - changed status from unstarted to in_progress
22
+ - ""
23
+ - - 2008-09-08 19:11:02.345285 Z
24
+ - takuto <takuto.wada@gmail.com>
25
+ - closed with disposition fixed
26
+ - ""
@@ -3,10 +3,10 @@ title: change line-based scanning to whole string based scanning
3
3
  desc: try whole string based scanning to handle multiline comments and directives
4
4
  type: :task
5
5
  component: twowaysql
6
- release:
6
+ release: release_0_3
7
7
  reporter: takuto <takuto.wada@gmail.com>
8
- status: :unstarted
9
- disposition:
8
+ status: :closed
9
+ disposition: :fixed
10
10
  creation_time: 2008-09-03 09:04:04.695887 Z
11
11
  references: []
12
12
 
@@ -16,3 +16,15 @@ log_events:
16
16
  - takuto <takuto.wada@gmail.com>
17
17
  - created
18
18
  - this is a trial. not necessary for current specs.
19
+ - - 2008-09-08 08:56:33.359947 Z
20
+ - takuto <takuto.wada@gmail.com>
21
+ - assigned to release release_0_3 from unassigned
22
+ - ""
23
+ - - 2008-09-08 08:57:26.255202 Z
24
+ - takuto <takuto.wada@gmail.com>
25
+ - changed status from unstarted to in_progress
26
+ - ""
27
+ - - 2008-09-08 18:16:21.995139 Z
28
+ - takuto <takuto.wada@gmail.com>
29
+ - closed with disposition fixed
30
+ - ""
@@ -5,8 +5,8 @@ type: :feature
5
5
  component: twowaysql
6
6
  release: release_0_3
7
7
  reporter: takuto <takuto.wada@gmail.com>
8
- status: :unstarted
9
- disposition:
8
+ status: :closed
9
+ disposition: :fixed
10
10
  creation_time: 2008-09-03 08:33:12.940300 Z
11
11
  references: []
12
12
 
@@ -20,3 +20,11 @@ log_events:
20
20
  - takuto <takuto.wada@gmail.com>
21
21
  - assigned to release release_0_3 from unassigned
22
22
  - assign to release_0_3
23
+ - - 2008-09-08 10:33:48.093770 Z
24
+ - takuto <takuto.wada@gmail.com>
25
+ - changed status from unstarted to in_progress
26
+ - ""
27
+ - - 2008-09-08 17:51:22.696803 Z
28
+ - takuto <takuto.wada@gmail.com>
29
+ - closed with disposition fixed
30
+ - ""
data/issues/project.yaml CHANGED
@@ -20,13 +20,17 @@ releases:
20
20
  - 0.2 release done.
21
21
  - !ditz.rubyforge.org,2008-03-06/release
22
22
  name: release_0_3
23
- status: :unreleased
24
- release_time:
23
+ status: :released
24
+ release_time: 2008-09-10 06:33:15.041316 Z
25
25
  log_events:
26
26
  - - 2008-09-05 11:23:24.696817 Z
27
27
  - takuto <takuto.wada@gmail.com>
28
28
  - created
29
29
  - release 0.3
30
+ - - 2008-09-10 06:33:15.041327 Z
31
+ - takuto <takuto.wada@gmail.com>
32
+ - released
33
+ - ""
30
34
  - !ditz.rubyforge.org,2008-03-06/release
31
35
  name: release_0_2_1
32
36
  status: :released
@@ -40,3 +44,12 @@ releases:
40
44
  - takuto <takuto.wada@gmail.com>
41
45
  - released
42
46
  - 0.2.1 release
47
+ - !ditz.rubyforge.org,2008-03-06/release
48
+ name: release_0_4
49
+ status: :unreleased
50
+ release_time:
51
+ log_events:
52
+ - - 2008-09-10 06:27:14.808896 Z
53
+ - takuto <takuto.wada@gmail.com>
54
+ - created
55
+ - ""
@@ -210,20 +210,30 @@ module TwoWaySQL
210
210
  end
211
211
 
212
212
 
213
- class CommentNode < Node
214
- def initialize(val)
215
- @val = val
213
+ class ActualCommentNode < Node
214
+ def initialize(delim, content)
215
+ @delim = delim
216
+ @content = content
216
217
  end
217
218
  def accept(ctx)
218
- # nothing to do
219
+ ctx.add_sql("#{@delim}*#{@content}*#{@delim}")
219
220
  end
220
221
  end
221
222
 
222
223
 
223
- class EolNode < Node
224
+ class WhiteSpaceNode < Node
225
+ def initialize(val, preserve)
226
+ @val = val
227
+ @preserve = preserve
228
+ end
224
229
  def accept(ctx)
225
- ctx.add_sql("\n")
230
+ if @preserve
231
+ ctx.add_sql(@val)
232
+ else
233
+ ctx.add_sql(" ")
234
+ end
226
235
  end
227
236
  end
228
237
 
238
+
229
239
  end