sqlpostgres 1.2.4

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.
Files changed (207) hide show
  1. data/Gemfile +8 -0
  2. data/Gemfile.lock +22 -0
  3. data/LICENSE.md +23 -0
  4. data/README.rdoc +59 -0
  5. data/Rakefile +32 -0
  6. data/VERSION +1 -0
  7. data/doc/BUGS +2 -0
  8. data/doc/examples/README +6 -0
  9. data/doc/examples/connection.rb +16 -0
  10. data/doc/examples/connection_auto.rb +22 -0
  11. data/doc/examples/connection_ctor.rb +18 -0
  12. data/doc/examples/connection_default.rb +15 -0
  13. data/doc/examples/connection_exec.rb +18 -0
  14. data/doc/examples/connection_manual.rb +12 -0
  15. data/doc/examples/connection_wrapped_new.rb +13 -0
  16. data/doc/examples/connection_wrapped_open.rb +13 -0
  17. data/doc/examples/cursor.rb +38 -0
  18. data/doc/examples/include_module.rb +9 -0
  19. data/doc/examples/include_module2.rb +12 -0
  20. data/doc/examples/insert.rb +30 -0
  21. data/doc/examples/insert2.rb +36 -0
  22. data/doc/examples/insert_bytea.rb +16 -0
  23. data/doc/examples/insert_bytea_array.rb +17 -0
  24. data/doc/examples/insert_default_values.rb +16 -0
  25. data/doc/examples/insert_insert.rb +16 -0
  26. data/doc/examples/insert_insert_default.rb +16 -0
  27. data/doc/examples/insert_insert_select.rb +20 -0
  28. data/doc/examples/insert_select.rb +20 -0
  29. data/doc/examples/interval.rb +17 -0
  30. data/doc/examples/savepoint.rb +38 -0
  31. data/doc/examples/select.rb +33 -0
  32. data/doc/examples/select2.rb +36 -0
  33. data/doc/examples/select_cross_join.rb +18 -0
  34. data/doc/examples/select_distinct.rb +18 -0
  35. data/doc/examples/select_distinct_on +19 -0
  36. data/doc/examples/select_for_update.rb +18 -0
  37. data/doc/examples/select_from.rb +17 -0
  38. data/doc/examples/select_from_subselect.rb +20 -0
  39. data/doc/examples/select_group_by.rb +19 -0
  40. data/doc/examples/select_having.rb +20 -0
  41. data/doc/examples/select_join_on.rb +18 -0
  42. data/doc/examples/select_join_using.rb +18 -0
  43. data/doc/examples/select_limit.rb +19 -0
  44. data/doc/examples/select_natural_join.rb +18 -0
  45. data/doc/examples/select_offset.rb +19 -0
  46. data/doc/examples/select_order_by.rb +20 -0
  47. data/doc/examples/select_select.rb +30 -0
  48. data/doc/examples/select_select_alias.rb +30 -0
  49. data/doc/examples/select_select_expression.rb +31 -0
  50. data/doc/examples/select_select_literal.rb +24 -0
  51. data/doc/examples/select_union.rb +21 -0
  52. data/doc/examples/select_where_array.rb +18 -0
  53. data/doc/examples/select_where_in.rb +18 -0
  54. data/doc/examples/select_where_string.rb +18 -0
  55. data/doc/examples/simple.rb +34 -0
  56. data/doc/examples/transaction.rb +30 -0
  57. data/doc/examples/transaction_abort.rb +30 -0
  58. data/doc/examples/transaction_commit.rb +34 -0
  59. data/doc/examples/translate_substitute_values.rb +17 -0
  60. data/doc/examples/update.rb +32 -0
  61. data/doc/examples/update2.rb +44 -0
  62. data/doc/examples/update_only.rb +17 -0
  63. data/doc/examples/update_set.rb +17 -0
  64. data/doc/examples/update_set_array.rb +16 -0
  65. data/doc/examples/update_set_bytea.rb +16 -0
  66. data/doc/examples/update_set_expression.rb +16 -0
  67. data/doc/examples/update_set_subselect.rb +20 -0
  68. data/doc/examples/update_where.rb +17 -0
  69. data/doc/examples/use_prefix.rb +8 -0
  70. data/doc/examples/use_prefix2.rb +11 -0
  71. data/doc/index.html +31 -0
  72. data/doc/insertexamples.rb +9 -0
  73. data/doc/makemanual +4 -0
  74. data/doc/makerdoc +5 -0
  75. data/doc/manual.dbk +622 -0
  76. data/lib/sqlpostgres/Connection.rb +198 -0
  77. data/lib/sqlpostgres/Cursor.rb +157 -0
  78. data/lib/sqlpostgres/Delete.rb +67 -0
  79. data/lib/sqlpostgres/Exceptions.rb +15 -0
  80. data/lib/sqlpostgres/Insert.rb +279 -0
  81. data/lib/sqlpostgres/NullConnection.rb +22 -0
  82. data/lib/sqlpostgres/PgBit.rb +73 -0
  83. data/lib/sqlpostgres/PgBox.rb +37 -0
  84. data/lib/sqlpostgres/PgCidr.rb +21 -0
  85. data/lib/sqlpostgres/PgCircle.rb +75 -0
  86. data/lib/sqlpostgres/PgInet.rb +21 -0
  87. data/lib/sqlpostgres/PgInterval.rb +208 -0
  88. data/lib/sqlpostgres/PgLineSegment.rb +37 -0
  89. data/lib/sqlpostgres/PgMacAddr.rb +21 -0
  90. data/lib/sqlpostgres/PgPath.rb +64 -0
  91. data/lib/sqlpostgres/PgPoint.rb +65 -0
  92. data/lib/sqlpostgres/PgPolygon.rb +56 -0
  93. data/lib/sqlpostgres/PgTime.rb +77 -0
  94. data/lib/sqlpostgres/PgTimeWithTimeZone.rb +98 -0
  95. data/lib/sqlpostgres/PgTimestamp.rb +93 -0
  96. data/lib/sqlpostgres/PgTwoPoints.rb +54 -0
  97. data/lib/sqlpostgres/PgType.rb +34 -0
  98. data/lib/sqlpostgres/PgWrapper.rb +41 -0
  99. data/lib/sqlpostgres/Savepoint.rb +98 -0
  100. data/lib/sqlpostgres/Select.rb +855 -0
  101. data/lib/sqlpostgres/Transaction.rb +120 -0
  102. data/lib/sqlpostgres/Translate.rb +436 -0
  103. data/lib/sqlpostgres/Update.rb +188 -0
  104. data/lib/sqlpostgres.rb +67 -0
  105. data/test/Assert.rb +72 -0
  106. data/test/Connection.test.rb +246 -0
  107. data/test/Cursor.test.rb +190 -0
  108. data/test/Delete.test.rb +68 -0
  109. data/test/Insert.test.rb +123 -0
  110. data/test/MockPGconn.rb +62 -0
  111. data/test/NullConnection.test.rb +32 -0
  112. data/test/PgBit.test.rb +98 -0
  113. data/test/PgBox.test.rb +108 -0
  114. data/test/PgCidr.test.rb +61 -0
  115. data/test/PgCircle.test.rb +107 -0
  116. data/test/PgInet.test.rb +61 -0
  117. data/test/PgInterval.test.rb +180 -0
  118. data/test/PgLineSegment.test.rb +108 -0
  119. data/test/PgMacAddr.test.rb +61 -0
  120. data/test/PgPath.test.rb +106 -0
  121. data/test/PgPoint.test.rb +100 -0
  122. data/test/PgPolygon.test.rb +95 -0
  123. data/test/PgTime.test.rb +120 -0
  124. data/test/PgTimeWithTimeZone.test.rb +117 -0
  125. data/test/PgTimestamp.test.rb +134 -0
  126. data/test/RandomThings.rb +25 -0
  127. data/test/Savepoint.test.rb +286 -0
  128. data/test/Select.test.rb +930 -0
  129. data/test/Test.rb +62 -0
  130. data/test/TestConfig.rb +21 -0
  131. data/test/TestSetup.rb +13 -0
  132. data/test/TestUtil.rb +92 -0
  133. data/test/Transaction.test.rb +275 -0
  134. data/test/Translate.test.rb +354 -0
  135. data/test/Update.test.rb +227 -0
  136. data/test/roundtrip.test.rb +565 -0
  137. data/test/test +34 -0
  138. data/tools/exampleinserter/ExampleInserter.rb +177 -0
  139. data/tools/rdoc/ChangeLog +796 -0
  140. data/tools/rdoc/EXAMPLE.rb +48 -0
  141. data/tools/rdoc/MANIFEST +58 -0
  142. data/tools/rdoc/Makefile +27 -0
  143. data/tools/rdoc/NEW_FEATURES +226 -0
  144. data/tools/rdoc/README +390 -0
  145. data/tools/rdoc/ToDo +6 -0
  146. data/tools/rdoc/contrib/Index +6 -0
  147. data/tools/rdoc/contrib/xslfo/ChangeLog +181 -0
  148. data/tools/rdoc/contrib/xslfo/README +106 -0
  149. data/tools/rdoc/contrib/xslfo/TODO +10 -0
  150. data/tools/rdoc/contrib/xslfo/convert.xsl +151 -0
  151. data/tools/rdoc/contrib/xslfo/demo/README +21 -0
  152. data/tools/rdoc/contrib/xslfo/demo/rdocfo +99 -0
  153. data/tools/rdoc/contrib/xslfo/fcm.xsl +54 -0
  154. data/tools/rdoc/contrib/xslfo/files.xsl +62 -0
  155. data/tools/rdoc/contrib/xslfo/labeled-lists.xsl +66 -0
  156. data/tools/rdoc/contrib/xslfo/lists.xsl +44 -0
  157. data/tools/rdoc/contrib/xslfo/modules.xsl +152 -0
  158. data/tools/rdoc/contrib/xslfo/rdoc.xsl +75 -0
  159. data/tools/rdoc/contrib/xslfo/source.xsl +66 -0
  160. data/tools/rdoc/contrib/xslfo/styles.xsl +69 -0
  161. data/tools/rdoc/contrib/xslfo/tables.xsl +67 -0
  162. data/tools/rdoc/contrib/xslfo/utils.xsl +21 -0
  163. data/tools/rdoc/debian/changelog +33 -0
  164. data/tools/rdoc/debian/compat +1 -0
  165. data/tools/rdoc/debian/control +20 -0
  166. data/tools/rdoc/debian/copyright +10 -0
  167. data/tools/rdoc/debian/dirs +2 -0
  168. data/tools/rdoc/debian/docs +2 -0
  169. data/tools/rdoc/debian/rdoc.1 +252 -0
  170. data/tools/rdoc/debian/rdoc.manpages +1 -0
  171. data/tools/rdoc/debian/rdoc.pod +149 -0
  172. data/tools/rdoc/debian/rules +9 -0
  173. data/tools/rdoc/dot/dot.rb +255 -0
  174. data/tools/rdoc/etc/rdoc.dtd +203 -0
  175. data/tools/rdoc/install.rb +137 -0
  176. data/tools/rdoc/markup/install.rb +43 -0
  177. data/tools/rdoc/markup/sample/sample.rb +42 -0
  178. data/tools/rdoc/markup/simple_markup/fragments.rb +323 -0
  179. data/tools/rdoc/markup/simple_markup/inline.rb +348 -0
  180. data/tools/rdoc/markup/simple_markup/lines.rb +147 -0
  181. data/tools/rdoc/markup/simple_markup/preprocess.rb +68 -0
  182. data/tools/rdoc/markup/simple_markup/to_html.rb +281 -0
  183. data/tools/rdoc/markup/simple_markup.rb +474 -0
  184. data/tools/rdoc/markup/test/AllTests.rb +2 -0
  185. data/tools/rdoc/markup/test/TestInline.rb +151 -0
  186. data/tools/rdoc/markup/test/TestParse.rb +411 -0
  187. data/tools/rdoc/rdoc/code_objects.rb +536 -0
  188. data/tools/rdoc/rdoc/diagram.rb +331 -0
  189. data/tools/rdoc/rdoc/generators/chm_generator.rb +112 -0
  190. data/tools/rdoc/rdoc/generators/html_generator.rb +1268 -0
  191. data/tools/rdoc/rdoc/generators/template/chm/chm.rb +86 -0
  192. data/tools/rdoc/rdoc/generators/template/html/html.rb +705 -0
  193. data/tools/rdoc/rdoc/generators/template/html/kilmer.rb +377 -0
  194. data/tools/rdoc/rdoc/generators/template/xml/rdf.rb +110 -0
  195. data/tools/rdoc/rdoc/generators/template/xml/xml.rb +110 -0
  196. data/tools/rdoc/rdoc/generators/xml_generator.rb +130 -0
  197. data/tools/rdoc/rdoc/options.rb +451 -0
  198. data/tools/rdoc/rdoc/parsers/parse_c.rb +287 -0
  199. data/tools/rdoc/rdoc/parsers/parse_f95.rb +118 -0
  200. data/tools/rdoc/rdoc/parsers/parse_rb.rb +2311 -0
  201. data/tools/rdoc/rdoc/parsers/parse_simple.rb +37 -0
  202. data/tools/rdoc/rdoc/parsers/parserfactory.rb +75 -0
  203. data/tools/rdoc/rdoc/rdoc.rb +219 -0
  204. data/tools/rdoc/rdoc/template.rb +234 -0
  205. data/tools/rdoc/rdoc/tokenstream.rb +25 -0
  206. data/tools/rdoc/rdoc.rb +9 -0
  207. metadata +291 -0
@@ -0,0 +1,281 @@
1
+ require 'markup/simple_markup/fragments'
2
+ require 'markup/simple_markup/inline'
3
+ require 'cgi'
4
+
5
+ module SM
6
+
7
+ class ToHtml
8
+
9
+ LIST_TYPE_TO_HTML = {
10
+ ListBase::BULLET => [ "<ul>", "</ul>" ],
11
+ ListBase::NUMBER => [ "<ol>", "</ol>" ],
12
+ ListBase::LABELED => [ "<dl>", "</dl>" ],
13
+ ListBase::NOTE => [ "<table>", "</table>" ],
14
+ }
15
+
16
+ InlineTag = Struct.new(:bit, :on, :off)
17
+
18
+ def initialize
19
+ init_tags
20
+ end
21
+
22
+ ##
23
+ # Set up the standard mapping of attributes to HTML tags
24
+ #
25
+ def init_tags
26
+ @attr_tags = [
27
+ InlineTag.new(SM::Attribute.bitmap_for(:BOLD), "<b>", "</b>"),
28
+ InlineTag.new(SM::Attribute.bitmap_for(:TT), "<tt>", "</tt>"),
29
+ InlineTag.new(SM::Attribute.bitmap_for(:EM), "<em>", "</em>"),
30
+ ]
31
+ end
32
+
33
+ ##
34
+ # Add a new set of HTML tags for an attribute. We allow
35
+ # separate start and end tags for flexibility
36
+ #
37
+ def add_tag(name, start, stop)
38
+ @attr_tags << InlineTag.new(SM::Attribute.bitmap_for(name), start, stop)
39
+ end
40
+
41
+ ##
42
+ # Given an HTML tag, decorate it with class information
43
+ # and the like if required. This is a no-op in the base
44
+ # class, but is overridden in HTML output classes that
45
+ # implement style sheets
46
+
47
+ def annotate(tag)
48
+ tag
49
+ end
50
+
51
+ ##
52
+ # Here's the client side of the visitor pattern
53
+
54
+ def start_accepting
55
+ @res = ""
56
+ @in_list_entry = []
57
+ end
58
+
59
+ def end_accepting
60
+ @res
61
+ end
62
+
63
+ def accept_paragraph(am, fragment)
64
+ @res << annotate("<p>") + "\n"
65
+ @res << wrap(convert_flow(am.flow(fragment.txt)))
66
+ @res << annotate("</p>") + "\n"
67
+ end
68
+
69
+ def accept_verbatim(am, fragment)
70
+ @res << annotate("<pre>") + "\n"
71
+ @res << CGI.escapeHTML(fragment.txt)
72
+ @res << annotate("</pre>") << "\n"
73
+ end
74
+
75
+ def accept_rule(am, fragment)
76
+ size = fragment.param
77
+ size = 10 if size > 10
78
+ @res << "<hr size=\"#{size}\"></hr>"
79
+ end
80
+
81
+ def accept_list_start(am, fragment)
82
+ @res << html_list_name(fragment.type, true) <<"\n"
83
+ @in_list_entry.push false
84
+ end
85
+
86
+ def accept_list_end(am, fragment)
87
+ if tag = @in_list_entry.pop
88
+ @res << annotate(tag) << "\n"
89
+ end
90
+ @res << html_list_name(fragment.type, false) <<"\n"
91
+ end
92
+
93
+ def accept_list_item(am, fragment)
94
+ if tag = @in_list_entry.last
95
+ @res << annotate(tag) << "\n"
96
+ end
97
+ @res << list_item_start(am, fragment)
98
+ @res << wrap(convert_flow(am.flow(fragment.txt))) << "\n"
99
+ @in_list_entry[-1] = list_end_for(fragment.type)
100
+ end
101
+
102
+ def accept_blank_line(am, fragment)
103
+ # @res << annotate("<p />") << "\n"
104
+ end
105
+
106
+ def accept_heading(am, fragment)
107
+ @res << convert_heading(fragment.head_level, am.flow(fragment.txt))
108
+ end
109
+
110
+ # This is a higher speed (if messier) version of wrap
111
+
112
+ def wrap(txt, line_len = 76)
113
+ res = ""
114
+ sp = 0
115
+ ep = txt.length
116
+ while sp < ep
117
+ # scan back for a space
118
+ p = sp + line_len - 1
119
+ if p >= ep
120
+ p = ep
121
+ else
122
+ while p > sp and txt[p] != ?\s
123
+ p -= 1
124
+ end
125
+ if p <= sp
126
+ p = sp + line_len
127
+ while p < ep and txt[p] != ?\s
128
+ p += 1
129
+ end
130
+ end
131
+ end
132
+ res << txt[sp...p] << "\n"
133
+ sp = p
134
+ sp += 1 while sp < ep and txt[sp] == ?\s
135
+ end
136
+ res
137
+ end
138
+
139
+ #######################################################################
140
+
141
+ private
142
+
143
+ #######################################################################
144
+
145
+ def on_tags(res, item)
146
+ attr_mask = item.turn_on
147
+ return if attr_mask.zero?
148
+
149
+ @attr_tags.each do |tag|
150
+ if attr_mask & tag.bit != 0
151
+ res << annotate(tag.on)
152
+ end
153
+ end
154
+ end
155
+
156
+ def off_tags(res, item)
157
+ attr_mask = item.turn_off
158
+ return if attr_mask.zero?
159
+
160
+ @attr_tags.reverse_each do |tag|
161
+ if attr_mask & tag.bit != 0
162
+ res << annotate(tag.off)
163
+ end
164
+ end
165
+ end
166
+
167
+ def convert_flow(flow)
168
+ res = ""
169
+ flow.each do |item|
170
+ case item
171
+ when String
172
+ res << convert_string(item)
173
+ when AttrChanger
174
+ off_tags(res, item)
175
+ on_tags(res, item)
176
+ when Special
177
+ res << convert_special(item)
178
+ else
179
+ raise "Unknown flow element: #{item.inspect}"
180
+ end
181
+ end
182
+ res
183
+ end
184
+
185
+ # some of these patterns are taken from SmartyPants...
186
+
187
+ def convert_string(item)
188
+
189
+ CGI.escapeHTML(item).
190
+
191
+
192
+ # convert -- to em-dash, (-- to en-dash)
193
+ gsub(/---?/, '&#8212;'). #gsub(/--/, '&#8211;').
194
+
195
+ # convert ... to elipsis (and make sure .... becomes .<elipsis>)
196
+ gsub(/\.\.\.\./, '.&#8230;').gsub(/\.\.\./, '&#8230;').
197
+
198
+ # convert single closing quote
199
+ gsub(%r{([^ \t\r\n\[\{\(])\'}) { "#$1&#8217;" }.
200
+ gsub(%r{\'(?=\W|s\b)}) { "&#8217;" }.
201
+
202
+ # convert single opening quote
203
+ gsub(/'/, '&#8216;').
204
+
205
+ # convert double closing quote
206
+ gsub(%r{([^ \t\r\n\[\{\(])\'(?=\W)}) { "#$1&#8221;" }.
207
+
208
+ # convert double opening quote
209
+ gsub(/'/, '&#8220;').
210
+
211
+ # convert copyright
212
+ gsub(/\(c\)/, '&#169;').
213
+
214
+ # convert and registered trademark
215
+ gsub(/\(r\)/, '&#174;')
216
+
217
+ end
218
+
219
+ def convert_special(special)
220
+ handled = false
221
+ Attribute.each_name_of(special.type) do |name|
222
+ method_name = "handle_special_#{name}"
223
+ if self.respond_to? method_name
224
+ special.text = send(method_name, special)
225
+ handled = true
226
+ end
227
+ end
228
+ raise "Unhandled special: #{special}" unless handled
229
+ special.text
230
+ end
231
+
232
+ def convert_heading(level, flow)
233
+ res =
234
+ annotate("<h#{level}>") +
235
+ convert_flow(flow) +
236
+ annotate("</h#{level}>\n")
237
+ end
238
+
239
+ def html_list_name(list_type, is_open_tag)
240
+ tags = LIST_TYPE_TO_HTML[list_type] || raise("Invalid list type: #{list_type.inspect}")
241
+ annotate(tags[ is_open_tag ? 0 : 1])
242
+ end
243
+
244
+ def list_item_start(am, fragment)
245
+ case fragment.type
246
+ when ListBase::BULLET, ListBase::NUMBER
247
+ annotate("<li>")
248
+
249
+ when ListBase::LABELED
250
+ annotate("<dt>") +
251
+ convert_flow(am.flow(fragment.param)) +
252
+ annotate("</dt>") +
253
+ annotate("<dd>")
254
+
255
+ when ListBase::NOTE
256
+ annotate("<tr>") +
257
+ annotate("<td valign=\"top\">") +
258
+ convert_flow(am.flow(fragment.param)) +
259
+ annotate("</td>") +
260
+ annotate("<td>")
261
+ else
262
+ raise "Invalid list type"
263
+ end
264
+ end
265
+
266
+ def list_end_for(fragment_type)
267
+ case fragment_type
268
+ when ListBase::BULLET, ListBase::NUMBER
269
+ "</li>"
270
+ when ListBase::LABELED
271
+ "</dd>"
272
+ when ListBase::NOTE
273
+ "</td></tr>"
274
+ else
275
+ raise "Invalid list type"
276
+ end
277
+ end
278
+
279
+ end
280
+
281
+ end