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.
- 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>
|