rdbi 0.9.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.
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
@@ -0,0 +1,33 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ doc
20
+ pkg
21
+ .yardoc
22
+
23
+ ## PROJECT::SPECIFIC
24
+ *.aux
25
+ *.cp
26
+ *.fn
27
+ *.fns
28
+ *.ky
29
+ *.log
30
+ *.pg
31
+ *.toc
32
+ *.tp
33
+ *.vr
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Erik Hollensbe
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,194 @@
1
+ = RDBI - Low-level Database Access Re-imagined
2
+
3
+ RDBI is intended primarily as an alternative to the heavier database layers in
4
+ the Ruby ecosystem. It provides a consistent interface to databases for working
5
+ with query languages directly, instead of providing an extremely high level
6
+ interface which does this work for you. While usable, it largely targets
7
+ high-level database libraries, similar to how +rack+ targets web frameworks.
8
+
9
+ == I'd like to get started
10
+
11
+ If you'd prefer to head straight to sinking your teeth into the API, here's a
12
+ path down the rabbit hole:
13
+
14
+ * RDBI is what you'll use to get your RDBI::Database handle. If you need
15
+ collections of database handles, look at RDBI::Pool.
16
+ * RDBI::Database contains methods for dealing with database level operations
17
+ and preparing and executing RDBI::Statement objects.
18
+ * RDBI::Statement works with RDBI::Cursor to yield RDBI::Result objects, which
19
+ leverage RDBI::Result::Driver classes to yield data.
20
+ * If you're interested in how schemas and types are dealt with, see
21
+ RDBI::Schema, RDBI::Column, and RDBI::Type.
22
+
23
+ == Give me a code sample already!
24
+
25
+ # connect to an in-memory sqlite3 database:
26
+ dbh = RDBI.connect(:SQLite3, :database => ":memory:")
27
+
28
+ # execute this CREATE TABLE statement:
29
+ dbh.execute("create table foo (bar integer, baz varchar)")
30
+
31
+ # prepare an insert statement for execution with two placeholders:
32
+ dbh.prepare("insert into foo (bar, baz) values (?, ?)") do |sth|
33
+
34
+ # and execute it with bound variables:
35
+ sth.execute(1, "foo")
36
+ sth.execute(2, "bar")
37
+ sth.execute(3, "quux")
38
+ end
39
+
40
+ # get a result handle from a select statement:
41
+ result = dbh.execute("select * from foo")
42
+
43
+ # and fetch the first row
44
+ result.fetch(:first) # [1, "foo"]
45
+
46
+ == What +is+ RDBI all about, anyway?
47
+
48
+ Here are some important pieces of information about RDBI that you may find
49
+ compelling (or off-putting. We're pragmatists.):
50
+
51
+ * RDBI is, at the time of this writing, fewer than 1000 lines of code.
52
+ * RDBI is light and fast. Eventually we will show you benchmarks.
53
+ * RDBI can be tested without a database, or even a database driver.
54
+ * RDBI is almost 100% thread-safe.
55
+ * RDBI can transform your results through a driver system. Want a CSV? Use the
56
+ CSV driver, don't bother transforming it yourself. Transform to JSON or YAML
57
+ with another gem. Drivers can be independently installed, used and swapped.
58
+ * RDBI contains no monkeypatching, core extensions, or other hell that will
59
+ conflict with your other libraries.
60
+ * RDBI is designed around properties of a relational database, but there is
61
+ nothing in it that demands one -- use it with Mongo or Redis if you want.
62
+ * RDBI database drivers are *small* -- our sqlite driver is about 150 lines and
63
+ our PostgreSQL driver is about 300. Our mock driver is about 50.
64
+ * RDBI has an active community of experienced Rails and Ruby programmers.
65
+
66
+ == I'd like some more, please.
67
+
68
+ # result objects are very flexible and amenable to method chaining:
69
+ dbh.execute("select * from foo").fetch(2) # [[1, "foo"], [2, "bar"]]
70
+
71
+ result = dbh.execute("select * from foo")
72
+
73
+ # select iteratively, then rewind to the first item:
74
+ result.fetch(2)
75
+ result.rewind
76
+
77
+ # change the way the results are presented:
78
+ result.as(:CSV).fetch(2) # '1,"foo"\n2,"bar"\n'
79
+
80
+ # :CSV is shorthand for RDBI::Result::Driver::CSV. you can also use literal
81
+ # class names:
82
+ result.as(RDBI::Result::Driver::CSV)
83
+
84
+ # or maybe your own:
85
+ result.as(MyCoolDriver)
86
+
87
+ # Here's another included driver:
88
+ str = result.as(:Struct).fetch(:first)
89
+ str.bar # 1
90
+ str.baz # "foo"
91
+
92
+ result.rewind
93
+
94
+ # select a single item in CSV format
95
+ csv = result.fetch(:first, :CSV)
96
+
97
+ # get the whole thing as an array of structs, keyed by column
98
+ ary_of_struct = result.as(:Struct).fetch(:all)
99
+
100
+ # as() automagically rewinds for you, so select twice for multi-dimension
101
+ # presentations:
102
+ ary = result.as(:Array).fetch(:all)
103
+
104
+ # and we're done! Disconnect from the database.
105
+ dbh.disconnect
106
+
107
+ Here are some things that it does:
108
+
109
+ * Connection pooling with aggregate transforms of your connections (that's a
110
+ fancy way of saying it uses Enumerable in the Pools). It can be responsible
111
+ for n segmented pools which relate to different logical databases.
112
+ * Native client binding *and* interpolated binding for databases that do not
113
+ support it.
114
+ * Don't like our drivers? No one's requiring you to use them -- RDBI drivers
115
+ aren't coupled with RDBI in any way.
116
+ * Result *drivers* can be used to transform your output into whatever you need --
117
+ never write a transformation skeleton again.
118
+ * Result *handles* can be used to work with results like real data structures.
119
+ Rewind them, ask the database to re-query the data, select a struct then select
120
+ an array (*without* requerying), select n items at a time as tuples (which
121
+ may be more than one or less than all).
122
+ * Cursors are used underneath the hood to ensure as performant a situation as
123
+ your database (and underlying driver) can provide.
124
+ * RDBI's core test suite passes in MRI 1.8, 1.9, and JRuby 1.5.
125
+
126
+ Aaaaaand here are some things RDBI won't do:
127
+
128
+ * RDBI won't write your queries for you. (There are libraries that use RDBI for
129
+ that.)
130
+ * RDBI won't dictate your schema.
131
+ * RDBI won't prevent you from being stupid or clever.
132
+ * It won't save you tons of time because you can't be bothered to think about
133
+ how you access your data.
134
+ * It won't make you (or anyone, really) a rockstar.
135
+ * Do not taunt RDBI.
136
+
137
+ == Show me even more awesome!
138
+
139
+ # retrieve cached handles 5 times -- handles will be yielded twice if there
140
+ # is a smaller Pool size:
141
+ 5.times do
142
+ RDBI.connect_cached(:SQLite3, :database => ":memory:")
143
+ end
144
+
145
+ # omg! this handle is really already connected!
146
+ dbh = RDBI.connect_cached(:SQLite3, :database => ":memory:")
147
+
148
+ # finer-grained control via RDBI::Pool:
149
+ # 2 connections:
150
+ pool = RDBI::Pool.new("my_pool_name", [:SQLite3, :database => ":memory:"], 2)
151
+
152
+ # zomg!
153
+ dbh = pool.get_dbh
154
+
155
+ # oh lordy lord! still 2 connections
156
+ 10.times { pool.get_dbh }
157
+
158
+ pool.disconnect # disconnect the entire pool
159
+ pool.reconnect # reconnect the entire pool
160
+
161
+ pool.resize(10) # resize the pool to 10 connections.
162
+
163
+ == Who is responsible for this madness?
164
+
165
+ * Erik Hollensbe (erikh)
166
+ * Pistos (... Pistos)
167
+ * Lee Jarvis (injekt)
168
+ * James Tucker (raggi)
169
+
170
+ == I found a bug!
171
+
172
+ We use the trackers in the github +RDBI+ project: http://github.com/RDBI for
173
+ each gem. Please find the appropriate place to add your ticket.
174
+
175
+ Not sure? Just add it to the +rdbi+ tracker: http://github.com/RDBI/rdbi/issues
176
+
177
+ == I'd like to patch and/or help maintain RDBI. How can I?
178
+
179
+ * Fork the project: http://github.com/RDBI
180
+ * Make your feature addition or bug fix.
181
+ * Please add tests for it, or indicate there are none. Patches without tests
182
+ will get integrated slower and must be very compelling.
183
+ * We use +jeweler+ for our repository management -- patches that mess with this
184
+ will be rejected regardless of merit.
185
+ * If you fork it permanently, be prepared to support it; we won't.
186
+
187
+ == Let's chat
188
+
189
+ * \#ruby-dbi on irc.freenode.net
190
+ * rdbi-devel@groups.google.com - for developers
191
+
192
+ == Copyright
193
+
194
+ Copyright (c) 2010 Erik Hollensbe. See LICENSE for details.
@@ -0,0 +1,109 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ version = (File.exist?('VERSION') ? File.read('VERSION') : "").chomp
5
+
6
+ begin
7
+ require 'jeweler'
8
+ Jeweler::Tasks.new do |gem|
9
+ gem.name = "rdbi"
10
+ gem.summary = %Q{RDBI provides sane query-level database access with low magic.}
11
+ gem.description = %Q{RDBI is a rearchitecture of the Ruby/DBI project by its maintainer and others. It intends to fully supplant Ruby/DBI in the future for similar database access needs.}
12
+ gem.email = "erik@hollensbe.org"
13
+ gem.homepage = "http://github.com/RDBI/rdbi"
14
+ gem.authors = ["Erik Hollensbe"]
15
+
16
+ gem.add_development_dependency 'rdbi-driver-mock'
17
+ gem.add_development_dependency 'test-unit'
18
+ gem.add_development_dependency 'rdoc'
19
+ ## for now, install hanna from here: http://github.com/erikh/hanna
20
+ #gem.add_development_dependency 'hanna'
21
+ gem.add_development_dependency 'fastercsv'
22
+
23
+ gem.add_dependency 'methlab', '>= 0.0.9'
24
+ gem.add_dependency 'epoxy', '>= 0.3.1'
25
+ gem.add_dependency 'typelib'
26
+
27
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
28
+ end
29
+ Jeweler::GemcutterTasks.new
30
+ rescue LoadError
31
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
32
+ end
33
+
34
+ begin
35
+ gem 'test-unit'
36
+ require 'rake/testtask'
37
+ Rake::TestTask.new(:test) do |test|
38
+ test.libs << 'lib' << 'test'
39
+ test.pattern = 'test/**/test_*.rb'
40
+ test.verbose = true
41
+ end
42
+ rescue LoadError
43
+ task :test do
44
+ abort "test-unit gem is not available. In order to run test-unit, you must: sudo gem install test-unit"
45
+ end
46
+ end
47
+
48
+
49
+ begin
50
+ require 'rcov/rcovtask'
51
+ Rcov::RcovTask.new do |test|
52
+ test.libs << 'test'
53
+ test.pattern = 'test/**/test_*.rb'
54
+ test.verbose = true
55
+ end
56
+ rescue LoadError
57
+ task :rcov do
58
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
59
+ end
60
+ end
61
+
62
+ task :test => :check_dependencies
63
+
64
+ begin
65
+ require 'roodi'
66
+ require 'roodi_task'
67
+ RoodiTask.new do |t|
68
+ t.verbose = false
69
+ end
70
+ rescue LoadError
71
+ task :roodi do
72
+ abort "Roodi is not available. In order to run roodi, you must: sudo gem install roodi"
73
+ end
74
+ end
75
+
76
+ task :default => :test
77
+
78
+ begin
79
+ require 'hanna'
80
+ require 'rdoc/task'
81
+ RDoc::Task.new do |rdoc|
82
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
83
+
84
+ rdoc.options.push '-f', 'hanna'
85
+ rdoc.main = 'README.rdoc'
86
+ rdoc.rdoc_dir = 'rdoc'
87
+ rdoc.title = "RDBI #{version} Documentation"
88
+ rdoc.rdoc_files.include('README*')
89
+ rdoc.rdoc_files.include('lib/**/*.rb')
90
+ end
91
+ rescue LoadError => e
92
+ rdoc_missing = lambda do
93
+ abort "What, were you born in a barn? Install rdoc and hanna at http://github.com/raggi/hanna ."
94
+ end
95
+ task :rdoc, &rdoc_missing
96
+ task :clobber_rdoc, &rdoc_missing
97
+ end
98
+
99
+ task :to_blog => [:clobber_rdoc, :rdoc] do
100
+ sh "rm -fr $git/blog/content/docs/rdbi && mv doc $git/blog/content/docs/rdbi"
101
+ end
102
+
103
+ task :install => [:test, :build]
104
+
105
+ task :docview => [:rerdoc] do
106
+ sh "open rdoc/index.html"
107
+ end
108
+
109
+ # vim: syntax=ruby ts=2 et sw=2 sts=2
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.9.0
Binary file
@@ -0,0 +1,365 @@
1
+ \input texinfo
2
+ @setfilename external-api.texi
3
+ @settitle RDBI External API specification 1.0 draft
4
+
5
+ @copying
6
+ Copyright @copyright{} 2010 Erik Hollensbe. My dad can distribute this work
7
+ better than your dad.
8
+ @end copying
9
+
10
+ @titlepage
11
+ @title RDBI External API specification 1.0 draft
12
+ @author Erik Hollensbe <erik@@hollensbe.org>
13
+ @page
14
+ @vskip 0pt plus 1filll
15
+ @insertcopying
16
+
17
+ @end titlepage
18
+
19
+ @contents
20
+ @node Top
21
+
22
+
23
+
24
+ @chapter All Classes
25
+
26
+
27
+
28
+ @deftypemethod {All Classes} Boolean reload
29
+ this method will semantically refresh items, such as Schema objects or
30
+ rows, depending on the context of the object in question.
31
+ @end deftypemethod
32
+
33
+
34
+
35
+ @chapter module DBI
36
+
37
+
38
+
39
+ @deftypemethod DBI DBH connect (Class @var{klass}, Array @var{*args}, Proc @var{&block})
40
+ class is a ruby class which corresponds to the database driver. it is no longer
41
+ a string.
42
+
43
+ *args is a hash with parameter -> value associations, such as :host or
44
+ :username.
45
+
46
+ Optionally yields a block for usage, yields a freshly connected DBH.
47
+ @end deftypemethod
48
+
49
+ @deftypemethod DBI {Array of Class} drivers
50
+ accessor to get at known classes that can be used as drivers.
51
+ @end deftypemethod
52
+
53
+ @deftypemethod DBI DBH connect_cached (Class @var{klass}, Array @var{*args}, Proc @var{&block})
54
+ connect to a new resource if one is required (or desired, see below) with
55
+ similar parameters as connect().
56
+
57
+ additional arguments :pool_name and :pool_size can be used to define a
58
+ Pool (object, see below) which holds a specific subset of connected
59
+ database handles. Playing with the size here introduces the ability for
60
+ connect_cached to maintain a minimum number of connections which can be
61
+ re-used over the lifetime of a program.
62
+ @end deftypemethod
63
+
64
+ @deftypemethod DBI Pool pool (String @var{pool_name})
65
+ a pool as described above is an array of database handles. this returns
66
+ that data as a "Pool" object, with its own API. See later on in the
67
+ document.
68
+ @end deftypemethod
69
+
70
+ @deftypemethod DBI Pool all_connections
71
+ similar to pool(), this returns all the connections, but ignores pools.
72
+ @end deftypemethod
73
+
74
+ @deftypemethod DBI Integer ping (Class @var{klass}, Array @var{*args})
75
+ similar to connect(), this issues a ping to the databases. This may issue
76
+ a connect() before the ping() to do it properly depending on the database
77
+ implementation.
78
+ @end deftypemethod
79
+
80
+ @deftypemethod DBI Boolean reconnect_all
81
+ reconnects all the known database handles.
82
+ @end deftypemethod
83
+
84
+ @deftypemethod DBI DBH last_dbh
85
+ returns the last returned dbh from connect() or connect_cached()
86
+
87
+ this method, by definition, can be unpredictable in threaded environments.
88
+ @end deftypemethod
89
+
90
+
91
+
92
+ @chapter class DBH
93
+
94
+
95
+
96
+ @deftypemethod DBH NilClass transaction (Proc @var{&block})
97
+ opens a transaction and executes the statements in the block. Yields self.
98
+ @end deftypemethod
99
+
100
+ @deftypemethod DBH Schema table_schema (Symbol @var{table_name})
101
+ returns information about a specific table in a Schema object
102
+ @end deftypemethod
103
+
104
+ @deftypemethod DBH {Array of Schema} schema (Symbol @var{schema_name})
105
+ returns information about a specific schema, the current one if none is
106
+ specified.
107
+ @end deftypemethod
108
+
109
+ @deftypemethod DBH Boolean reconnect
110
+ reconnects to the database
111
+ @end deftypemethod
112
+
113
+ @deftypemethod DBH Integer ping
114
+ attempts to contact the database, measuring round-trip.
115
+ @end deftypemethod
116
+
117
+ @deftypemethod DBH Object driver
118
+ returns the underlying driver.
119
+ @end deftypemethod
120
+
121
+ @deftypemethod DBH String last_query
122
+ returns the last query executed or prepared.
123
+ @end deftypemethod
124
+
125
+ @deftypemethod DBH STH last_sth
126
+ returns the last statement handle prepared.
127
+ @end deftypemethod
128
+
129
+ @deftypemethod DBH Mutex mutex
130
+ returns the mutex for this database. thread management will be per-dbh.
131
+ @end deftypemethod
132
+
133
+ @deftypemethod DBH String preprocess_query (String @var{query})
134
+ preprocesses the query and returns what it would look like right before
135
+ it gets sent to the database.
136
+ @end deftypemethod
137
+
138
+ @deftypemethod DBH Boolean disconnect
139
+ disconnects from the database. returns success.
140
+ @end deftypemethod
141
+
142
+ @deftypemethod DBH Symbol bind_style ({Symbol of [native, preprocessed]} @var{style})
143
+ Accessor. Native style delegates to the underlying database connector. preprocessed
144
+ means we do it.
145
+ @end deftypemethod
146
+
147
+
148
+
149
+ @section Query Methods
150
+ these methods all optionally use a block and yield a result or sth depending
151
+ on context. Additionally in async environments, they return immediately,
152
+ the block being transformed into a callback which will yield when the query
153
+ completes.
154
+
155
+
156
+ @deftypemethod DBH STH prepare (String @var{query})
157
+ prepares a query for execution and returns a statement handle.
158
+ @end deftypemethod
159
+
160
+ @deftypemethod DBH Result execute (String @var{query}, Array @var{*binds})
161
+ executes a query and returns a result. If a block is not provided, an async
162
+ result will be provided which will slowly result in items being fetchable.
163
+ @end deftypemethod
164
+
165
+
166
+
167
+ @chapter class STH
168
+
169
+
170
+ @deftypemethod STH String query
171
+ accessor for the query that was used to generate this sth.
172
+ @end deftypemethod
173
+
174
+ @deftypemethod STH Result execute (Array @var{*binds})
175
+ executes the prepared statement. optionally yielding a result if block given.
176
+ @end deftypemethod
177
+
178
+ @deftypemethod STH Object driver
179
+ if any, returns the underlying statement handle from the database object.
180
+ @end deftypemethod
181
+
182
+ @deftypemethod STH Result last_result
183
+ Returns the last Result this prepared statement has yielded.
184
+ @end deftypemethod
185
+
186
+ @deftypemethod STH Boolean finish
187
+ finishes the statement
188
+ @end deftypemethod
189
+
190
+ @deftypemethod STH DBH dbh
191
+ returns the dbh this statement handle was created from.
192
+ @end deftypemethod
193
+
194
+
195
+
196
+ @chapter class Pool
197
+
198
+
199
+
200
+ @deftypemethod Pool Boolean reconnect
201
+ attempts to reconnect the entire pool of database connections.
202
+ @end deftypemethod
203
+
204
+ @deftypemethod Pool Integer ping
205
+ attempts to ping and average the response time of all database
206
+ connections.
207
+ @end deftypemethod
208
+
209
+ @deftypemethod Pool Boolean disconnect
210
+ disconnects all the database connections in the pool.
211
+ @end deftypemethod
212
+
213
+
214
+
215
+ @chapter class Result
216
+
217
+
218
+
219
+ @deftypemethod Result Boolean complete?
220
+ Always returns true in a sync environment. In an async environment, only
221
+ returns true if all result processing has been completed.
222
+ @end deftypemethod
223
+
224
+ @deftypemethod Result Boolean has_data?
225
+ Always returns true in a sync environment. In an async environment, only
226
+ returns true if there is outstanding data to fetch.
227
+ @end deftypemethod
228
+
229
+ @deftypemethod Result Boolean eof?
230
+ Returns true if all results have been fetched.
231
+ @end deftypemethod
232
+
233
+ @deftypemethod Result NilClass rewind
234
+ resets the fetch iterator to the beginning. See also: #reload.
235
+ @end deftypemethod
236
+
237
+ @deftypemethod Result Integer rows
238
+ If available, returns the number of rows in this result. Else, nil.
239
+ @end deftypemethod
240
+
241
+ @deftypemethod Result Array binds
242
+ accessor for the binds that created this method
243
+ @end deftypemethod
244
+
245
+ @deftypemethod Result NilClass as (Class @var{kind}, Array @var{*args})
246
+ Given a Class and arguments, uses it to interpret the array. The class is
247
+ constructed with the result object and the arguments provided at the end,
248
+ and then a method called fetch() is attempted with the row count.
249
+
250
+ Especially for specific class designations, (XML formatting is a good
251
+ example) output formats may not necessarily equate to a single row, in that
252
+ case, one "unit" should be returned from #fetch, and this entailings of
253
+ this unit should be specified in the driver.
254
+
255
+ If this this method is not called, fetch yields a standard array with type
256
+ converted items.
257
+ @end deftypemethod
258
+
259
+ @deftypemethod Result Object fetch (Integer @var{row_count})
260
+ fetches one item, or given an argument, @var{row_count} rows. If the
261
+ row_count is ":all", fetches all outstanding rows. See #as for how rows may
262
+ be interpreted.
263
+ @end deftypemethod
264
+
265
+ @deftypemethod Result {Array of Object} raw_fetch (Integer @var{row_count})
266
+ Raw fetch performs no conversions -- returns an array of objects yielding
267
+ whatever the underlying driver gave us.
268
+ @end deftypemethod
269
+
270
+ @deftypemethod Result Boolean finish
271
+ finishes the underlying statement handle and invalidates the data.
272
+ reloading will no longer be possible once this is called and should
273
+ raise (or maybe we should reprepare/execute?).
274
+ @end deftypemethod
275
+
276
+ @deftypemethod Result STH sth
277
+ returns the statement handle that yielded this result.
278
+ @end deftypemethod
279
+
280
+ @deftypemethod Result Schema schema
281
+ returns a Schema object that corresponds to the data in this result.
282
+ @end deftypemethod
283
+
284
+ @deftypemethod Result NilClass each (@var{&block})
285
+ similar to calling fetch iteratively with a callback. With proper async
286
+ driver support, will register a callback from the block which will only
287
+ process when there are new rows to be had.
288
+ @end deftypemethod
289
+
290
+
291
+ @chapter class CursorResult < Result
292
+
293
+ This class is just a cursor-oriented method of transmitting results.
294
+
295
+
296
+
297
+ @chapter class Row
298
+
299
+ row is just an array, but this needs to be thought out a little more.
300
+
301
+
302
+
303
+ @chapter Schema
304
+
305
+
306
+
307
+ @deftypemethod Schema {Array of Column} columns
308
+ returns column information (see Column object below) for all elements of
309
+ the Schema.
310
+ @end deftypemethod
311
+
312
+ @deftypemethod Schema {Array of Symbol} table_names
313
+ returns table names (there may be more than one in the event of a query
314
+ Schema) for all the objects a part of this Schema.
315
+ @end deftypemethod
316
+
317
+
318
+
319
+ @chapter Column
320
+
321
+
322
+
323
+ @deftypemethod Column String name
324
+ @end deftypemethod
325
+
326
+ @deftypemethod Column String type
327
+ this is the type the database yields
328
+ @end deftypemethod
329
+
330
+ @deftypemethod Column Class ruby_type
331
+ Accessor. this is what ruby thinks this type should be, or you can set it directly
332
+ which will be used at type conversion time.
333
+ @end deftypemethod
334
+
335
+ @deftypemethod Column Integer precision
336
+ (alias: length)
337
+ precision is the first number in a database type. it is aliased to the
338
+ method 'length' because sometimes that's what precision actually is
339
+ depending on the type.
340
+ @end deftypemethod
341
+
342
+ @deftypemethod Column Integer scale
343
+ scale is the second number in a database type. this is often the right
344
+ side of a decimal value or sometimes a factoring quotient.
345
+ @end deftypemethod
346
+
347
+ @deftypemethod Column Boolean nullable@?
348
+ can this column be null?
349
+ @end deftypemethod
350
+
351
+ @deftypemethod Column String metadata
352
+ metadata is a bucket for things we don't understand; namely things like AUTOINCREMENT.
353
+ @end deftypemethod
354
+
355
+ @deftypemethod Column String default
356
+ default is the column default -- this is provided for informational
357
+ aspects only and should not be used for anything sane.
358
+ @end deftypemethod
359
+
360
+ @page
361
+ @node Method Index
362
+ @unnumbered Method Index
363
+ @printindex fn
364
+
365
+ @bye