sqlpostgres 1.2.4
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +8 -0
- data/Gemfile.lock +22 -0
- data/LICENSE.md +23 -0
- data/README.rdoc +59 -0
- data/Rakefile +32 -0
- data/VERSION +1 -0
- data/doc/BUGS +2 -0
- data/doc/examples/README +6 -0
- data/doc/examples/connection.rb +16 -0
- data/doc/examples/connection_auto.rb +22 -0
- data/doc/examples/connection_ctor.rb +18 -0
- data/doc/examples/connection_default.rb +15 -0
- data/doc/examples/connection_exec.rb +18 -0
- data/doc/examples/connection_manual.rb +12 -0
- data/doc/examples/connection_wrapped_new.rb +13 -0
- data/doc/examples/connection_wrapped_open.rb +13 -0
- data/doc/examples/cursor.rb +38 -0
- data/doc/examples/include_module.rb +9 -0
- data/doc/examples/include_module2.rb +12 -0
- data/doc/examples/insert.rb +30 -0
- data/doc/examples/insert2.rb +36 -0
- data/doc/examples/insert_bytea.rb +16 -0
- data/doc/examples/insert_bytea_array.rb +17 -0
- data/doc/examples/insert_default_values.rb +16 -0
- data/doc/examples/insert_insert.rb +16 -0
- data/doc/examples/insert_insert_default.rb +16 -0
- data/doc/examples/insert_insert_select.rb +20 -0
- data/doc/examples/insert_select.rb +20 -0
- data/doc/examples/interval.rb +17 -0
- data/doc/examples/savepoint.rb +38 -0
- data/doc/examples/select.rb +33 -0
- data/doc/examples/select2.rb +36 -0
- data/doc/examples/select_cross_join.rb +18 -0
- data/doc/examples/select_distinct.rb +18 -0
- data/doc/examples/select_distinct_on +19 -0
- data/doc/examples/select_for_update.rb +18 -0
- data/doc/examples/select_from.rb +17 -0
- data/doc/examples/select_from_subselect.rb +20 -0
- data/doc/examples/select_group_by.rb +19 -0
- data/doc/examples/select_having.rb +20 -0
- data/doc/examples/select_join_on.rb +18 -0
- data/doc/examples/select_join_using.rb +18 -0
- data/doc/examples/select_limit.rb +19 -0
- data/doc/examples/select_natural_join.rb +18 -0
- data/doc/examples/select_offset.rb +19 -0
- data/doc/examples/select_order_by.rb +20 -0
- data/doc/examples/select_select.rb +30 -0
- data/doc/examples/select_select_alias.rb +30 -0
- data/doc/examples/select_select_expression.rb +31 -0
- data/doc/examples/select_select_literal.rb +24 -0
- data/doc/examples/select_union.rb +21 -0
- data/doc/examples/select_where_array.rb +18 -0
- data/doc/examples/select_where_in.rb +18 -0
- data/doc/examples/select_where_string.rb +18 -0
- data/doc/examples/simple.rb +34 -0
- data/doc/examples/transaction.rb +30 -0
- data/doc/examples/transaction_abort.rb +30 -0
- data/doc/examples/transaction_commit.rb +34 -0
- data/doc/examples/translate_substitute_values.rb +17 -0
- data/doc/examples/update.rb +32 -0
- data/doc/examples/update2.rb +44 -0
- data/doc/examples/update_only.rb +17 -0
- data/doc/examples/update_set.rb +17 -0
- data/doc/examples/update_set_array.rb +16 -0
- data/doc/examples/update_set_bytea.rb +16 -0
- data/doc/examples/update_set_expression.rb +16 -0
- data/doc/examples/update_set_subselect.rb +20 -0
- data/doc/examples/update_where.rb +17 -0
- data/doc/examples/use_prefix.rb +8 -0
- data/doc/examples/use_prefix2.rb +11 -0
- data/doc/index.html +31 -0
- data/doc/insertexamples.rb +9 -0
- data/doc/makemanual +4 -0
- data/doc/makerdoc +5 -0
- data/doc/manual.dbk +622 -0
- data/lib/sqlpostgres/Connection.rb +198 -0
- data/lib/sqlpostgres/Cursor.rb +157 -0
- data/lib/sqlpostgres/Delete.rb +67 -0
- data/lib/sqlpostgres/Exceptions.rb +15 -0
- data/lib/sqlpostgres/Insert.rb +279 -0
- data/lib/sqlpostgres/NullConnection.rb +22 -0
- data/lib/sqlpostgres/PgBit.rb +73 -0
- data/lib/sqlpostgres/PgBox.rb +37 -0
- data/lib/sqlpostgres/PgCidr.rb +21 -0
- data/lib/sqlpostgres/PgCircle.rb +75 -0
- data/lib/sqlpostgres/PgInet.rb +21 -0
- data/lib/sqlpostgres/PgInterval.rb +208 -0
- data/lib/sqlpostgres/PgLineSegment.rb +37 -0
- data/lib/sqlpostgres/PgMacAddr.rb +21 -0
- data/lib/sqlpostgres/PgPath.rb +64 -0
- data/lib/sqlpostgres/PgPoint.rb +65 -0
- data/lib/sqlpostgres/PgPolygon.rb +56 -0
- data/lib/sqlpostgres/PgTime.rb +77 -0
- data/lib/sqlpostgres/PgTimeWithTimeZone.rb +98 -0
- data/lib/sqlpostgres/PgTimestamp.rb +93 -0
- data/lib/sqlpostgres/PgTwoPoints.rb +54 -0
- data/lib/sqlpostgres/PgType.rb +34 -0
- data/lib/sqlpostgres/PgWrapper.rb +41 -0
- data/lib/sqlpostgres/Savepoint.rb +98 -0
- data/lib/sqlpostgres/Select.rb +855 -0
- data/lib/sqlpostgres/Transaction.rb +120 -0
- data/lib/sqlpostgres/Translate.rb +436 -0
- data/lib/sqlpostgres/Update.rb +188 -0
- data/lib/sqlpostgres.rb +67 -0
- data/test/Assert.rb +72 -0
- data/test/Connection.test.rb +246 -0
- data/test/Cursor.test.rb +190 -0
- data/test/Delete.test.rb +68 -0
- data/test/Insert.test.rb +123 -0
- data/test/MockPGconn.rb +62 -0
- data/test/NullConnection.test.rb +32 -0
- data/test/PgBit.test.rb +98 -0
- data/test/PgBox.test.rb +108 -0
- data/test/PgCidr.test.rb +61 -0
- data/test/PgCircle.test.rb +107 -0
- data/test/PgInet.test.rb +61 -0
- data/test/PgInterval.test.rb +180 -0
- data/test/PgLineSegment.test.rb +108 -0
- data/test/PgMacAddr.test.rb +61 -0
- data/test/PgPath.test.rb +106 -0
- data/test/PgPoint.test.rb +100 -0
- data/test/PgPolygon.test.rb +95 -0
- data/test/PgTime.test.rb +120 -0
- data/test/PgTimeWithTimeZone.test.rb +117 -0
- data/test/PgTimestamp.test.rb +134 -0
- data/test/RandomThings.rb +25 -0
- data/test/Savepoint.test.rb +286 -0
- data/test/Select.test.rb +930 -0
- data/test/Test.rb +62 -0
- data/test/TestConfig.rb +21 -0
- data/test/TestSetup.rb +13 -0
- data/test/TestUtil.rb +92 -0
- data/test/Transaction.test.rb +275 -0
- data/test/Translate.test.rb +354 -0
- data/test/Update.test.rb +227 -0
- data/test/roundtrip.test.rb +565 -0
- data/test/test +34 -0
- data/tools/exampleinserter/ExampleInserter.rb +177 -0
- data/tools/rdoc/ChangeLog +796 -0
- data/tools/rdoc/EXAMPLE.rb +48 -0
- data/tools/rdoc/MANIFEST +58 -0
- data/tools/rdoc/Makefile +27 -0
- data/tools/rdoc/NEW_FEATURES +226 -0
- data/tools/rdoc/README +390 -0
- data/tools/rdoc/ToDo +6 -0
- data/tools/rdoc/contrib/Index +6 -0
- data/tools/rdoc/contrib/xslfo/ChangeLog +181 -0
- data/tools/rdoc/contrib/xslfo/README +106 -0
- data/tools/rdoc/contrib/xslfo/TODO +10 -0
- data/tools/rdoc/contrib/xslfo/convert.xsl +151 -0
- data/tools/rdoc/contrib/xslfo/demo/README +21 -0
- data/tools/rdoc/contrib/xslfo/demo/rdocfo +99 -0
- data/tools/rdoc/contrib/xslfo/fcm.xsl +54 -0
- data/tools/rdoc/contrib/xslfo/files.xsl +62 -0
- data/tools/rdoc/contrib/xslfo/labeled-lists.xsl +66 -0
- data/tools/rdoc/contrib/xslfo/lists.xsl +44 -0
- data/tools/rdoc/contrib/xslfo/modules.xsl +152 -0
- data/tools/rdoc/contrib/xslfo/rdoc.xsl +75 -0
- data/tools/rdoc/contrib/xslfo/source.xsl +66 -0
- data/tools/rdoc/contrib/xslfo/styles.xsl +69 -0
- data/tools/rdoc/contrib/xslfo/tables.xsl +67 -0
- data/tools/rdoc/contrib/xslfo/utils.xsl +21 -0
- data/tools/rdoc/debian/changelog +33 -0
- data/tools/rdoc/debian/compat +1 -0
- data/tools/rdoc/debian/control +20 -0
- data/tools/rdoc/debian/copyright +10 -0
- data/tools/rdoc/debian/dirs +2 -0
- data/tools/rdoc/debian/docs +2 -0
- data/tools/rdoc/debian/rdoc.1 +252 -0
- data/tools/rdoc/debian/rdoc.manpages +1 -0
- data/tools/rdoc/debian/rdoc.pod +149 -0
- data/tools/rdoc/debian/rules +9 -0
- data/tools/rdoc/dot/dot.rb +255 -0
- data/tools/rdoc/etc/rdoc.dtd +203 -0
- data/tools/rdoc/install.rb +137 -0
- data/tools/rdoc/markup/install.rb +43 -0
- data/tools/rdoc/markup/sample/sample.rb +42 -0
- data/tools/rdoc/markup/simple_markup/fragments.rb +323 -0
- data/tools/rdoc/markup/simple_markup/inline.rb +348 -0
- data/tools/rdoc/markup/simple_markup/lines.rb +147 -0
- data/tools/rdoc/markup/simple_markup/preprocess.rb +68 -0
- data/tools/rdoc/markup/simple_markup/to_html.rb +281 -0
- data/tools/rdoc/markup/simple_markup.rb +474 -0
- data/tools/rdoc/markup/test/AllTests.rb +2 -0
- data/tools/rdoc/markup/test/TestInline.rb +151 -0
- data/tools/rdoc/markup/test/TestParse.rb +411 -0
- data/tools/rdoc/rdoc/code_objects.rb +536 -0
- data/tools/rdoc/rdoc/diagram.rb +331 -0
- data/tools/rdoc/rdoc/generators/chm_generator.rb +112 -0
- data/tools/rdoc/rdoc/generators/html_generator.rb +1268 -0
- data/tools/rdoc/rdoc/generators/template/chm/chm.rb +86 -0
- data/tools/rdoc/rdoc/generators/template/html/html.rb +705 -0
- data/tools/rdoc/rdoc/generators/template/html/kilmer.rb +377 -0
- data/tools/rdoc/rdoc/generators/template/xml/rdf.rb +110 -0
- data/tools/rdoc/rdoc/generators/template/xml/xml.rb +110 -0
- data/tools/rdoc/rdoc/generators/xml_generator.rb +130 -0
- data/tools/rdoc/rdoc/options.rb +451 -0
- data/tools/rdoc/rdoc/parsers/parse_c.rb +287 -0
- data/tools/rdoc/rdoc/parsers/parse_f95.rb +118 -0
- data/tools/rdoc/rdoc/parsers/parse_rb.rb +2311 -0
- data/tools/rdoc/rdoc/parsers/parse_simple.rb +37 -0
- data/tools/rdoc/rdoc/parsers/parserfactory.rb +75 -0
- data/tools/rdoc/rdoc/rdoc.rb +219 -0
- data/tools/rdoc/rdoc/template.rb +234 -0
- data/tools/rdoc/rdoc/tokenstream.rb +25 -0
- data/tools/rdoc/rdoc.rb +9 -0
- metadata +291 -0
data/doc/manual.dbk
ADDED
@@ -0,0 +1,622 @@
|
|
1
|
+
<?xml version="1.0" encoding="ISO-8859-1" ?>
|
2
|
+
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
|
3
|
+
"/usr/share/sgml/docbook/dtd/xml/4.2/docbookx.dtd">
|
4
|
+
<book>
|
5
|
+
<bookinfo>
|
6
|
+
<title>sqlpostgres</title>
|
7
|
+
<author>
|
8
|
+
<firstname>Wayne</firstname>
|
9
|
+
<surname>Conrad</surname>
|
10
|
+
</author>
|
11
|
+
<copyright>
|
12
|
+
<year>2003</year>
|
13
|
+
<holder>Wayne Conrad</holder>
|
14
|
+
</copyright>
|
15
|
+
<abstract>
|
16
|
+
|
17
|
+
<para><application>sqlpostgres</application> is a Ruby library that
|
18
|
+
builds and executes insert, update, and select statements for
|
19
|
+
Postgresql. <application>sqlpostgres</application> statements are
|
20
|
+
easier to read and maintain than raw SQL. Ruby data types are
|
21
|
+
automatically converted to and from SQL data types, and results are
|
22
|
+
returned as an array of hashes rather than an array of arrays.</para>
|
23
|
+
|
24
|
+
</abstract>
|
25
|
+
</bookinfo>
|
26
|
+
|
27
|
+
<chapter>
|
28
|
+
<title>Overview</title>
|
29
|
+
|
30
|
+
<para><application>Sqlpostgres</application> is a Ruby library that
|
31
|
+
builds and executes insert, update and select statements for
|
32
|
+
Postgresql.</para>
|
33
|
+
|
34
|
+
<para><application>Features</application>:
|
35
|
+
|
36
|
+
<itemizedlist>
|
37
|
+
|
38
|
+
<listitem><para> uses the venerable <ulink
|
39
|
+
url="http://www.postgresql.jp/interfaces/ruby/">
|
40
|
+
<application>postgresql</application></ulink> library for its basic
|
41
|
+
access to the database. That means it will run anywhere the
|
42
|
+
postgresql runs and benefits from the proven reliability of the
|
43
|
+
<application>postgresql</application> library. </para></listitem>
|
44
|
+
|
45
|
+
<listitem><para> is fully documented with plenty of tested
|
46
|
+
examples.</para></listitem>
|
47
|
+
|
48
|
+
<listitem><para> is fully tested with a comprehensive suite of unit
|
49
|
+
tests.</para></listitem>
|
50
|
+
|
51
|
+
<listitem><para> automatically escapes <literal>'</literal>,
|
52
|
+
<literal>\</literal>, and non-printable characters in
|
53
|
+
strings.</para></listitem>
|
54
|
+
|
55
|
+
<listitem><para> automatically converts data read from the database
|
56
|
+
into Ruby types. If you read an integer column, you get a Ruby
|
57
|
+
<classname>Integer</classname>. If you read a text column, you get a
|
58
|
+
Ruby <classname>String</classname>. If you read a timestamp, you get
|
59
|
+
a Ruby <classname>Time</classname>. </para></listitem>
|
60
|
+
|
61
|
+
<listitem><para> returns each row as a hash keyed by column name (or
|
62
|
+
alias), not as an array. No more counting columns.</para></listitem>
|
63
|
+
|
64
|
+
<listitem><para> creates all common and most uncommon types of select,
|
65
|
+
insert or update statement with ease, including
|
66
|
+
<application>Postgres</application> extensions.</para></listitem>
|
67
|
+
|
68
|
+
<listitem><para> has an escape mechanism allowing you to execute any
|
69
|
+
SQL statement, for those things that this library doesn't
|
70
|
+
do.</para></listitem>
|
71
|
+
|
72
|
+
</itemizedlist>
|
73
|
+
</para>
|
74
|
+
|
75
|
+
<section>
|
76
|
+
<title>Connecting</title>
|
77
|
+
|
78
|
+
<para>
|
79
|
+
Here a simple way to make a connection to database 'foo':
|
80
|
+
|
81
|
+
<programlisting id='connection'>
|
82
|
+
Connection.open do |connection|
|
83
|
+
# Use the connection
|
84
|
+
end
|
85
|
+
</programlisting>
|
86
|
+
|
87
|
+
The connection is automatically closed at the end of the block.
|
88
|
+
</para>
|
89
|
+
|
90
|
+
<para> See <xref linkend="Connecting"/> for more about making and
|
91
|
+
using database connections. </para>
|
92
|
+
|
93
|
+
</section>
|
94
|
+
|
95
|
+
<section>
|
96
|
+
<title>Insert</title>
|
97
|
+
|
98
|
+
<para>Here is a simple insert statement:
|
99
|
+
<programlisting id="insert2">
|
100
|
+
insert = Insert.new('person', connection)
|
101
|
+
insert.insert('name', "O'Reilly")
|
102
|
+
insert.insert('date_of_birth', Date.civil(1972, 1, 1))
|
103
|
+
p insert.statement # "insert into person (name, date_of_birth) values
|
104
|
+
# (E'O\\047Reilly', date '1972-01-01')"
|
105
|
+
insert.exec
|
106
|
+
</programlisting>
|
107
|
+
</para>
|
108
|
+
|
109
|
+
<para>For documentation and examples, see the <ulink
|
110
|
+
url="rdoc/classes/SqlPostgres/Insert.html">class
|
111
|
+
documentation</ulink>. </para>
|
112
|
+
|
113
|
+
<sidebar>
|
114
|
+
<title>
|
115
|
+
Why do so many of the examples call <methodname>statement</methodname>?
|
116
|
+
</title>
|
117
|
+
|
118
|
+
<para>Many of the examples call <methodname>statement</methodname> and
|
119
|
+
print out the result. Do you have to? No. It's only done in the
|
120
|
+
examples because showing the what SQL the library generated makes it
|
121
|
+
easier to understand the example. In your own code, you will probably
|
122
|
+
only call <methodname>statement</methodname> when debugging.</para>
|
123
|
+
|
124
|
+
</sidebar>
|
125
|
+
|
126
|
+
</section>
|
127
|
+
|
128
|
+
<section>
|
129
|
+
<title>Update</title>
|
130
|
+
|
131
|
+
<para>Here is a simple update statement:
|
132
|
+
<programlisting id="update2">
|
133
|
+
update = Update.new('person', connection)
|
134
|
+
update.set('married', true)
|
135
|
+
update.where(['name = %s', 'Smith'])
|
136
|
+
p update.statement # "update person set married = true where
|
137
|
+
# name = E'Smith'"
|
138
|
+
update.exec
|
139
|
+
</programlisting>
|
140
|
+
</para>
|
141
|
+
|
142
|
+
<para>For documentation and examples, see the <ulink
|
143
|
+
url="rdoc/classes/SqlPostgres/Update.html">class
|
144
|
+
documentation</ulink>.</para>
|
145
|
+
|
146
|
+
</section>
|
147
|
+
|
148
|
+
<section>
|
149
|
+
<title>Select</title>
|
150
|
+
|
151
|
+
<para>Here is a simple select statement:
|
152
|
+
<programlisting id="select2">
|
153
|
+
select = Select.new(connection)
|
154
|
+
select.select('name')
|
155
|
+
select.select('married')
|
156
|
+
select.from('person')
|
157
|
+
select.where(['married = %s', false])
|
158
|
+
p select.statement # "select name, married from person where married =
|
159
|
+
# false"
|
160
|
+
p select.exec # [{"name"=>"Fred", "married"=>false}, {"name"=>"Mary",
|
161
|
+
# "married"=>false}]
|
162
|
+
</programlisting>
|
163
|
+
</para>
|
164
|
+
|
165
|
+
<para>For documentation and examples, see the <ulink
|
166
|
+
url="rdoc/classes/SqlPostgres/Select.html">class
|
167
|
+
documentation</ulink>. </para>
|
168
|
+
|
169
|
+
</section>
|
170
|
+
|
171
|
+
<section>
|
172
|
+
<title>Transactions</title>
|
173
|
+
|
174
|
+
<para>Transactions are simple. See the example in the <ulink
|
175
|
+
url="rdoc/classes/SqlPostgres/Transaction.html">class
|
176
|
+
documentation</ulink>.</para>
|
177
|
+
|
178
|
+
</section>
|
179
|
+
|
180
|
+
<section>
|
181
|
+
<title>Namespace</title>
|
182
|
+
|
183
|
+
<para> All classes and functions in the library are in module
|
184
|
+
<classname>SqlPostgres</classname>. You may either include
|
185
|
+
<classname>SqlPostgres</classname>:
|
186
|
+
|
187
|
+
<programlisting id='include_module2'>
|
188
|
+
require 'sqlpostgres'
|
189
|
+
include SqlPostgres
|
190
|
+
|
191
|
+
Connection.open do |connection|
|
192
|
+
#...
|
193
|
+
end
|
194
|
+
</programlisting>
|
195
|
+
|
196
|
+
or add the <classname>SqlPostgres</classname> prefix to the class
|
197
|
+
names you use:
|
198
|
+
|
199
|
+
<programlisting id='use_prefix2'>
|
200
|
+
require 'sqlpostgres'
|
201
|
+
|
202
|
+
SqlPostgres::Connection.open do |connection|
|
203
|
+
#...
|
204
|
+
end
|
205
|
+
</programlisting>
|
206
|
+
</para>
|
207
|
+
|
208
|
+
<para>The examples in this manual assume you've included
|
209
|
+
<classname>SqlPostgres</classname>.</para>
|
210
|
+
|
211
|
+
</section>
|
212
|
+
|
213
|
+
</chapter>
|
214
|
+
|
215
|
+
<chapter id="Connecting">
|
216
|
+
<title>Connecting</title>
|
217
|
+
|
218
|
+
<section>
|
219
|
+
<title>Getting a connection</title>
|
220
|
+
|
221
|
+
<section>
|
222
|
+
<title>Automatically closed connection</title>
|
223
|
+
|
224
|
+
<para>Here's the simplest way to make a database connection:
|
225
|
+
|
226
|
+
<programlisting id='connection_auto'>
|
227
|
+
Connection.open('db_name'=>'sqlpostgres_test') do |connection|
|
228
|
+
# Use the connection
|
229
|
+
end
|
230
|
+
</programlisting>
|
231
|
+
</para>
|
232
|
+
|
233
|
+
<para>The connection is automatically closed at the end of the block,
|
234
|
+
even if an exception occurs. You can create connections that you have
|
235
|
+
to close yourself, but you should prefer the automatic way when
|
236
|
+
possible.</para>
|
237
|
+
|
238
|
+
<para><methodname>Connection.open</methodname> takes many arguments to
|
239
|
+
allow you to select the database name, host name, user name, password,
|
240
|
+
and so on:
|
241
|
+
|
242
|
+
<table>
|
243
|
+
<title><methodname>Connection.open</methodname> arguments</title>
|
244
|
+
<tgroup cols='3'>
|
245
|
+
<thead>
|
246
|
+
<row>
|
247
|
+
<entry>name</entry>
|
248
|
+
<entry>type</entry>
|
249
|
+
<entry>description</entry>
|
250
|
+
<entry>default</entry>
|
251
|
+
</row>
|
252
|
+
</thead>
|
253
|
+
<tbody>
|
254
|
+
|
255
|
+
<row>
|
256
|
+
|
257
|
+
<entry><literal>"host_name"</literal></entry>
|
258
|
+
|
259
|
+
<entry>String</entry>
|
260
|
+
|
261
|
+
<entry> The name of the host to connect to. This can be a DNS name,
|
262
|
+
or an IP (dotted-quad)</entry>
|
263
|
+
|
264
|
+
<entry><literal>"localhost"</literal></entry>
|
265
|
+
|
266
|
+
</row>
|
267
|
+
|
268
|
+
<row>
|
269
|
+
|
270
|
+
<entry><literal>"port"</literal> </entry>
|
271
|
+
|
272
|
+
<entry>Integer</entry>
|
273
|
+
|
274
|
+
<entry>The port number to connect to</entry>
|
275
|
+
|
276
|
+
<entry><literal>5432</literal></entry>
|
277
|
+
|
278
|
+
</row>
|
279
|
+
|
280
|
+
<row>
|
281
|
+
|
282
|
+
<entry><literal>"options"</literal></entry>
|
283
|
+
|
284
|
+
<entry>String</entry>
|
285
|
+
|
286
|
+
<entry>Trace/debug options to be sent to the server</entry>
|
287
|
+
|
288
|
+
<entry><literal>""</literal></entry>
|
289
|
+
|
290
|
+
</row>
|
291
|
+
|
292
|
+
<row>
|
293
|
+
|
294
|
+
<entry><literal>"tty"</literal></entry>
|
295
|
+
|
296
|
+
<entry>String</entry>
|
297
|
+
|
298
|
+
<entry>Name of tty for back end messages</entry>
|
299
|
+
|
300
|
+
<entry><literal>""</literal></entry>
|
301
|
+
|
302
|
+
</row>
|
303
|
+
|
304
|
+
<row>
|
305
|
+
|
306
|
+
<entry><literal>"db_name"</literal></entry>
|
307
|
+
|
308
|
+
<entry>String</entry>
|
309
|
+
|
310
|
+
<entry>Database name. <literal>""</literal> means to use the user
|
311
|
+
name as the database name.</entry>
|
312
|
+
|
313
|
+
<entry><literal>""</literal></entry>
|
314
|
+
|
315
|
+
</row>
|
316
|
+
|
317
|
+
<row>
|
318
|
+
|
319
|
+
<entry><literal>"login"</literal></entry>
|
320
|
+
|
321
|
+
<entry>String</entry>
|
322
|
+
|
323
|
+
<entry>Login name. nil means to use the user name as the login
|
324
|
+
name.</entry>
|
325
|
+
|
326
|
+
<entry><literal>nil</literal></entry>
|
327
|
+
|
328
|
+
</row>
|
329
|
+
|
330
|
+
<row>
|
331
|
+
|
332
|
+
<entry><literal>"password"</literal></entry>
|
333
|
+
|
334
|
+
<entry>String</entry>
|
335
|
+
|
336
|
+
<entry>Password. nil means no password.</entry>
|
337
|
+
|
338
|
+
<entry><literal>nil</literal></entry>
|
339
|
+
|
340
|
+
</row>
|
341
|
+
|
342
|
+
</tbody>
|
343
|
+
</tgroup>
|
344
|
+
</table>
|
345
|
+
|
346
|
+
</para>
|
347
|
+
|
348
|
+
</section>
|
349
|
+
|
350
|
+
<section>
|
351
|
+
<title>Manually closed connection</title>
|
352
|
+
|
353
|
+
<para>If you need to take control over closing the database
|
354
|
+
connection, you can do it:
|
355
|
+
|
356
|
+
<programlisting id="connection_manual">
|
357
|
+
connection = Connection.new
|
358
|
+
# use the connection
|
359
|
+
connection.close
|
360
|
+
</programlisting>
|
361
|
+
</para>
|
362
|
+
|
363
|
+
<para> When doing the close yourself, only two things close the
|
364
|
+
connection: Your program ending, or you executing the close method.
|
365
|
+
Nothing else will close the connection (no, they're not closed when
|
366
|
+
garbage collected).</para>
|
367
|
+
|
368
|
+
</section>
|
369
|
+
|
370
|
+
<section>
|
371
|
+
<title>Wrapping an existing connection</title>
|
372
|
+
|
373
|
+
<para> If you have a connection you have already obtained from another
|
374
|
+
source, and wish to use with this library, then pass it to the
|
375
|
+
constructor of Connection like so:
|
376
|
+
|
377
|
+
<programlisting id="connection_wrapped_new">
|
378
|
+
pgconn = PGconn.connect('localhost', 5432, '', '', ENV['USER'])
|
379
|
+
connection = Connection.new('connection'=>pgconn)
|
380
|
+
# use the connection
|
381
|
+
connection.close # or, if you prefer, pgconn.close
|
382
|
+
</programlisting>
|
383
|
+
</para>
|
384
|
+
|
385
|
+
<para> When wrapping a connection this way, the library will not
|
386
|
+
automatically close it for you. You may close it by calling either
|
387
|
+
<methodname>Connection.close</methodname>, or
|
388
|
+
<methodname>PGconn.close</methodname> </para>
|
389
|
+
|
390
|
+
<para> You can wrap a connection and have it closed for you by passing
|
391
|
+
it to <methodname>Connection.open</methodname>:
|
392
|
+
|
393
|
+
<programlisting id="connection_wrapped_open">
|
394
|
+
pgconn = PGconn.connect('localhost', 5432, '', '', ENV['USER'])
|
395
|
+
connection = Connection.open('connection'=>pgconn) do |connection|
|
396
|
+
# use the connection
|
397
|
+
end
|
398
|
+
</programlisting>
|
399
|
+
|
400
|
+
</para>
|
401
|
+
|
402
|
+
</section>
|
403
|
+
|
404
|
+
</section>
|
405
|
+
|
406
|
+
<section>
|
407
|
+
<title>Using the connection</title>
|
408
|
+
|
409
|
+
<para>Once you have a connection, you have three ways to use it:
|
410
|
+
|
411
|
+
<orderedlist>
|
412
|
+
|
413
|
+
<listitem><para>Make it the default connection.</para></listitem>
|
414
|
+
|
415
|
+
<listitem><para>Pass it to the constructor of Insert, Update, or Select</para></listitem>
|
416
|
+
|
417
|
+
<listitem><para>Pass it to the exec method of Insert, Update, or Select.</para></listitem>
|
418
|
+
|
419
|
+
</orderedlist>
|
420
|
+
|
421
|
+
</para>
|
422
|
+
|
423
|
+
<section>
|
424
|
+
<title>Default Connection</title>
|
425
|
+
|
426
|
+
<para>You may set a default connection. After that, any
|
427
|
+
<classname>Insert</classname>, <classname>Update</classname> or
|
428
|
+
<classname>Select</classname> statements you make will use that
|
429
|
+
connection (unless a different connection is passed to
|
430
|
+
<methodname>new</methodname> or <methodname>exec</methodname>).
|
431
|
+
|
432
|
+
<programlisting id="connection_default">
|
433
|
+
Connection.open do |connection|
|
434
|
+
Connection.default = connection
|
435
|
+
select = Select.new
|
436
|
+
select.select_literal(1, 'i') # [{"i"=>1}]
|
437
|
+
p select.exec
|
438
|
+
end
|
439
|
+
</programlisting>
|
440
|
+
</para>
|
441
|
+
|
442
|
+
</section>
|
443
|
+
|
444
|
+
<section>
|
445
|
+
<title>Pass a connection to the constructor</title>
|
446
|
+
|
447
|
+
<para>You may pass a connection to the constructor of any
|
448
|
+
<classname>Select</classname>, <classname>Insert</classname> or
|
449
|
+
<classname>Update</classname>.
|
450
|
+
|
451
|
+
<programlisting id="connection_ctor">
|
452
|
+
insert = Insert.new('person', connection)
|
453
|
+
insert.insert('name', 'Fred')
|
454
|
+
insert.exec
|
455
|
+
</programlisting>
|
456
|
+
</para>
|
457
|
+
|
458
|
+
<para>A connection passed to the constructor overrides any default
|
459
|
+
connection.</para>
|
460
|
+
|
461
|
+
</section>
|
462
|
+
|
463
|
+
<section>
|
464
|
+
<title>Pass a connection to the exec method</title>
|
465
|
+
|
466
|
+
<para>You may pass a connection to the exec method of any
|
467
|
+
<classname>Select</classname>, <classname>Insert</classname> or
|
468
|
+
<classname>Update</classname>:
|
469
|
+
|
470
|
+
<programlisting id="connection_exec">
|
471
|
+
insert = Insert.new('person')
|
472
|
+
insert.insert('name', 'Fred')
|
473
|
+
insert.exec(connection)
|
474
|
+
</programlisting>
|
475
|
+
</para>
|
476
|
+
|
477
|
+
<para>A connection passed to the <methodname>exec</methodname> method
|
478
|
+
overrides the default connection or a connection passed to the
|
479
|
+
constructor.</para>
|
480
|
+
|
481
|
+
</section>
|
482
|
+
|
483
|
+
</section>
|
484
|
+
|
485
|
+
</chapter>
|
486
|
+
|
487
|
+
<chapter id="Types">
|
488
|
+
<title>Types</title>
|
489
|
+
|
490
|
+
<table>
|
491
|
+
<title>Types</title>
|
492
|
+
<tgroup cols='3'>
|
493
|
+
<thead>
|
494
|
+
<row>
|
495
|
+
<entry>Postgres type</entry>
|
496
|
+
<entry>Ruby type</entry>
|
497
|
+
<entry>Insert method (scalar)</entry>
|
498
|
+
<entry>Insert method(array)</entry>
|
499
|
+
</row>
|
500
|
+
</thead>
|
501
|
+
<tbody>
|
502
|
+
<row>
|
503
|
+
<entry>text, character varying(n), varchar(n)</entry>
|
504
|
+
<entry>String</entry>
|
505
|
+
<entry>insert</entry>
|
506
|
+
<entry>insert_array</entry>
|
507
|
+
</row>
|
508
|
+
<row>
|
509
|
+
<entry>character(n), char(n)</entry>
|
510
|
+
<entry>String</entry>
|
511
|
+
<entry>insert</entry>
|
512
|
+
<entry>insert_array</entry>
|
513
|
+
</row>
|
514
|
+
<row>
|
515
|
+
<entry>character, char</entry>
|
516
|
+
<entry>String</entry>
|
517
|
+
<entry>insert</entry>
|
518
|
+
<entry>insert_array</entry>
|
519
|
+
</row>
|
520
|
+
<row>
|
521
|
+
<entry>"char"</entry>
|
522
|
+
<entry>String</entry>
|
523
|
+
<entry>insert_char</entry>
|
524
|
+
<entry></entry>
|
525
|
+
</row>
|
526
|
+
<row>
|
527
|
+
<entry>name</entry>
|
528
|
+
<entry>String</entry>
|
529
|
+
<entry>insert</entry>
|
530
|
+
<entry>insert_char</entry>
|
531
|
+
</row>
|
532
|
+
<row>
|
533
|
+
<entry>integer, int, int4</entry>
|
534
|
+
<entry>Integer</entry>
|
535
|
+
<entry>insert</entry>
|
536
|
+
<entry>insert_array</entry>
|
537
|
+
</row>
|
538
|
+
<row>
|
539
|
+
<entry>smallint, int2</entry>
|
540
|
+
<entry>Integer</entry>
|
541
|
+
<entry>insert</entry>
|
542
|
+
<entry>insert_array</entry>
|
543
|
+
</row>
|
544
|
+
<row>
|
545
|
+
<entry>serial, serial4</entry>
|
546
|
+
<entry>Integer</entry>
|
547
|
+
<entry>insert</entry>
|
548
|
+
<entry>insert_array</entry>
|
549
|
+
</row>
|
550
|
+
<row>
|
551
|
+
<entry>bigserial, serial8</entry>
|
552
|
+
<entry>Integer</entry>
|
553
|
+
<entry>insert</entry>
|
554
|
+
<entry>insert_array</entry>
|
555
|
+
</row>
|
556
|
+
<row>
|
557
|
+
<entry>real, float4</entry>
|
558
|
+
<entry>Float</entry>
|
559
|
+
<entry>insert</entry>
|
560
|
+
<entry>insert_array</entry>
|
561
|
+
</row>
|
562
|
+
<row>
|
563
|
+
<entry>double precision, float8</entry>
|
564
|
+
<entry>Float</entry>
|
565
|
+
<entry>insert</entry>
|
566
|
+
<entry>insert_array</entry>
|
567
|
+
</row>
|
568
|
+
<row>
|
569
|
+
<entry>decimal, numeric</entry>
|
570
|
+
<entry>BigDecimal</entry>
|
571
|
+
<entry>insert</entry>
|
572
|
+
<entry>insert_array</entry>
|
573
|
+
</row>
|
574
|
+
</tbody>
|
575
|
+
</tgroup>
|
576
|
+
</table>
|
577
|
+
|
578
|
+
</chapter>
|
579
|
+
|
580
|
+
<chapter id="Development">
|
581
|
+
<title>Development</title>
|
582
|
+
|
583
|
+
<section>
|
584
|
+
<title>Building Debian Packages</title>
|
585
|
+
|
586
|
+
<para>This is just how I do it. Experts will doubtless do it better.
|
587
|
+
Each of these steps is done from the top level directory of the
|
588
|
+
package source (that is, from the parent directory of the
|
589
|
+
<filename>debian</filename> directory.</para>
|
590
|
+
|
591
|
+
<para>This is a debian native package, so there's no fooling around
|
592
|
+
with upstream versions, and package versions never have a "-1", "-2",
|
593
|
+
etc. on the end.</para>
|
594
|
+
|
595
|
+
<para>First, edit <filename>debian/changelog</filename> to increment
|
596
|
+
the version number and explain the changes. I like using
|
597
|
+
<application>debchange</application> to do it:</para>
|
598
|
+
|
599
|
+
<para><userinput><prompt>$ </prompt>dch -i -p 'Fixed a bad
|
600
|
+
bug'</userinput></para>
|
601
|
+
|
602
|
+
<para>The <userinput>-p</userinput> switch tells
|
603
|
+
<application>debchange</application> not to change the name of the
|
604
|
+
directory. That's just my preference.</para>
|
605
|
+
|
606
|
+
<para>Now build the package:</para>
|
607
|
+
|
608
|
+
<para><userinput><prompt>$ </prompt>dpkg-buildpackage -rfakeroot -us -uc
|
609
|
+
</userinput></para>
|
610
|
+
|
611
|
+
<para>I use <userinput>-us</userinput> and <userinput>-uc</userinput>
|
612
|
+
to avoid having to sign the packages. Better package maintainers will
|
613
|
+
no doubt do the right thing.</para>
|
614
|
+
|
615
|
+
<para>A whole bunch of stuff will happen. When it's done, the package
|
616
|
+
files will be in the parent directory.</para>
|
617
|
+
|
618
|
+
</section>
|
619
|
+
|
620
|
+
</chapter>
|
621
|
+
|
622
|
+
</book>
|