fireruby 0.1.0-mswin32 → 0.2.0-mswin32

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 (127) hide show
  1. data/doc/README +297 -31
  2. data/examples/example01.rb +60 -0
  3. data/lib/doc.tar.gz +0 -0
  4. data/lib/fireruby.bundle +0 -0
  5. data/lib/fireruby.so +0 -0
  6. data/lib/mkdoc +1 -1
  7. data/lib/src.rb +158 -15
  8. data/test/ConnectionTest.rb +11 -10
  9. data/test/DDLTest.rb +7 -6
  10. data/test/DatabaseTest.rb +13 -14
  11. data/test/GeneratorTest.rb +4 -3
  12. data/test/ResultSetTest.rb +6 -5
  13. data/test/RowTest.rb +49 -0
  14. data/test/SQLTest.rb +43 -26
  15. data/test/StatementTest.rb +6 -5
  16. data/test/TransactionTest.rb +7 -6
  17. data/test/UnitTest.rb +1 -0
  18. metadata +11 -135
  19. data/doc/CVS/Entries +0 -10
  20. data/doc/CVS/Repository +0 -1
  21. data/doc/CVS/Root +0 -1
  22. data/doc/classes/CVS/Entries +0 -2
  23. data/doc/classes/CVS/Entries.Log +0 -1
  24. data/doc/classes/CVS/Repository +0 -1
  25. data/doc/classes/CVS/Root +0 -1
  26. data/doc/classes/FireRuby/CVS/Entries +0 -8
  27. data/doc/classes/FireRuby/CVS/Entries.Log +0 -7
  28. data/doc/classes/FireRuby/CVS/Repository +0 -1
  29. data/doc/classes/FireRuby/CVS/Root +0 -1
  30. data/doc/classes/FireRuby/Connection.html +0 -364
  31. data/doc/classes/FireRuby/Connection.src/CVS/Entries +0 -10
  32. data/doc/classes/FireRuby/Connection.src/CVS/Repository +0 -1
  33. data/doc/classes/FireRuby/Connection.src/CVS/Root +0 -1
  34. data/doc/classes/FireRuby/Connection.src/M000046.html +0 -17
  35. data/doc/classes/FireRuby/Connection.src/M000047.html +0 -17
  36. data/doc/classes/FireRuby/Connection.src/M000048.html +0 -17
  37. data/doc/classes/FireRuby/Connection.src/M000049.html +0 -17
  38. data/doc/classes/FireRuby/Connection.src/M000050.html +0 -17
  39. data/doc/classes/FireRuby/Connection.src/M000051.html +0 -17
  40. data/doc/classes/FireRuby/Connection.src/M000052.html +0 -18
  41. data/doc/classes/FireRuby/Connection.src/M000053.html +0 -18
  42. data/doc/classes/FireRuby/Connection.src/M000054.html +0 -18
  43. data/doc/classes/FireRuby/Database.html +0 -292
  44. data/doc/classes/FireRuby/Database.src/CVS/Entries +0 -7
  45. data/doc/classes/FireRuby/Database.src/CVS/Repository +0 -1
  46. data/doc/classes/FireRuby/Database.src/CVS/Root +0 -1
  47. data/doc/classes/FireRuby/Database.src/M000035.html +0 -17
  48. data/doc/classes/FireRuby/Database.src/M000036.html +0 -17
  49. data/doc/classes/FireRuby/Database.src/M000037.html +0 -17
  50. data/doc/classes/FireRuby/Database.src/M000038.html +0 -18
  51. data/doc/classes/FireRuby/Database.src/M000039.html +0 -17
  52. data/doc/classes/FireRuby/Database.src/M000040.html +0 -17
  53. data/doc/classes/FireRuby/FireRubyError.html +0 -221
  54. data/doc/classes/FireRuby/FireRubyError.src/CVS/Entries +0 -6
  55. data/doc/classes/FireRuby/FireRubyError.src/CVS/Repository +0 -1
  56. data/doc/classes/FireRuby/FireRubyError.src/CVS/Root +0 -1
  57. data/doc/classes/FireRuby/FireRubyError.src/M000041.html +0 -17
  58. data/doc/classes/FireRuby/FireRubyError.src/M000042.html +0 -17
  59. data/doc/classes/FireRuby/FireRubyError.src/M000043.html +0 -17
  60. data/doc/classes/FireRuby/FireRubyError.src/M000044.html +0 -17
  61. data/doc/classes/FireRuby/FireRubyError.src/M000045.html +0 -17
  62. data/doc/classes/FireRuby/Generator.html +0 -343
  63. data/doc/classes/FireRuby/Generator.src/CVS/Entries +0 -9
  64. data/doc/classes/FireRuby/Generator.src/CVS/Repository +0 -1
  65. data/doc/classes/FireRuby/Generator.src/CVS/Root +0 -1
  66. data/doc/classes/FireRuby/Generator.src/M000001.html +0 -17
  67. data/doc/classes/FireRuby/Generator.src/M000002.html +0 -17
  68. data/doc/classes/FireRuby/Generator.src/M000003.html +0 -17
  69. data/doc/classes/FireRuby/Generator.src/M000004.html +0 -17
  70. data/doc/classes/FireRuby/Generator.src/M000005.html +0 -17
  71. data/doc/classes/FireRuby/Generator.src/M000006.html +0 -17
  72. data/doc/classes/FireRuby/Generator.src/M000007.html +0 -17
  73. data/doc/classes/FireRuby/Generator.src/M000008.html +0 -17
  74. data/doc/classes/FireRuby/ResultSet.html +0 -343
  75. data/doc/classes/FireRuby/ResultSet.src/CVS/Entries +0 -10
  76. data/doc/classes/FireRuby/ResultSet.src/CVS/Repository +0 -1
  77. data/doc/classes/FireRuby/ResultSet.src/CVS/Root +0 -1
  78. data/doc/classes/FireRuby/ResultSet.src/M000026.html +0 -17
  79. data/doc/classes/FireRuby/ResultSet.src/M000027.html +0 -17
  80. data/doc/classes/FireRuby/ResultSet.src/M000028.html +0 -17
  81. data/doc/classes/FireRuby/ResultSet.src/M000029.html +0 -17
  82. data/doc/classes/FireRuby/ResultSet.src/M000030.html +0 -17
  83. data/doc/classes/FireRuby/ResultSet.src/M000031.html +0 -17
  84. data/doc/classes/FireRuby/ResultSet.src/M000032.html +0 -17
  85. data/doc/classes/FireRuby/ResultSet.src/M000033.html +0 -17
  86. data/doc/classes/FireRuby/ResultSet.src/M000034.html +0 -17
  87. data/doc/classes/FireRuby/Statement.html +0 -349
  88. data/doc/classes/FireRuby/Statement.src/CVS/Entries +0 -10
  89. data/doc/classes/FireRuby/Statement.src/CVS/Repository +0 -1
  90. data/doc/classes/FireRuby/Statement.src/CVS/Root +0 -1
  91. data/doc/classes/FireRuby/Statement.src/M000017.html +0 -17
  92. data/doc/classes/FireRuby/Statement.src/M000018.html +0 -17
  93. data/doc/classes/FireRuby/Statement.src/M000019.html +0 -17
  94. data/doc/classes/FireRuby/Statement.src/M000020.html +0 -17
  95. data/doc/classes/FireRuby/Statement.src/M000021.html +0 -17
  96. data/doc/classes/FireRuby/Statement.src/M000022.html +0 -17
  97. data/doc/classes/FireRuby/Statement.src/M000023.html +0 -18
  98. data/doc/classes/FireRuby/Statement.src/M000024.html +0 -18
  99. data/doc/classes/FireRuby/Statement.src/M000025.html +0 -17
  100. data/doc/classes/FireRuby/Transaction.html +0 -484
  101. data/doc/classes/FireRuby/Transaction.src/CVS/Entries +0 -9
  102. data/doc/classes/FireRuby/Transaction.src/CVS/Repository +0 -1
  103. data/doc/classes/FireRuby/Transaction.src/CVS/Root +0 -1
  104. data/doc/classes/FireRuby/Transaction.src/M000009.html +0 -17
  105. data/doc/classes/FireRuby/Transaction.src/M000010.html +0 -17
  106. data/doc/classes/FireRuby/Transaction.src/M000011.html +0 -17
  107. data/doc/classes/FireRuby/Transaction.src/M000012.html +0 -17
  108. data/doc/classes/FireRuby/Transaction.src/M000013.html +0 -17
  109. data/doc/classes/FireRuby/Transaction.src/M000014.html +0 -17
  110. data/doc/classes/FireRuby/Transaction.src/M000015.html +0 -18
  111. data/doc/classes/FireRuby/Transaction.src/M000016.html +0 -17
  112. data/doc/classes/FireRuby.html +0 -116
  113. data/doc/created.rid +0 -1
  114. data/doc/files/CVS/Entries +0 -2
  115. data/doc/files/CVS/Repository +0 -1
  116. data/doc/files/CVS/Root +0 -1
  117. data/doc/files/src_rb.html +0 -119
  118. data/doc/fr_class_index.html +0 -34
  119. data/doc/fr_file_index.html +0 -27
  120. data/doc/fr_method_index.html +0 -80
  121. data/doc/index.html +0 -24
  122. data/doc/rdoc-style.css +0 -175
  123. data/test/example.c +0 -91
  124. data/test/fb.c +0 -297
  125. data/test/mfb +0 -1
  126. data/test/sql_unit_test.fdb +0 -0
  127. data/test/test.fdb +0 -0
data/doc/README CHANGED
@@ -1,39 +1,305 @@
1
- = FireRuby - Interface Library For The Firebird Database
1
+ == FireRuby Version 0.2.0
2
+ This is the second release of the FireRuby library. FireRuby is an extension to
3
+ the Ruby language that provides access to the functionality of the Firebird
4
+ relational database management system.
2
5
 
3
- This is the initial release of the FireRuby library. The FireRuby library
4
- provides an interface to the Firebird open source database management system.
5
- The library has been developed as an extension to the Ruby language using the
6
- Ruby interface API. The library is provided in binary form only to avoid
7
- compilation issues.
6
+ Still no Linux build as I don't have a Linux box to build it on.
8
7
 
9
- If you are wondering why I haven't released a version of the library for Linux
10
- it is simply that I do not have access to a Linux box to build it. I hope to
11
- rectify this situation in the future but there is no definite timetable for
12
- doing this yet.
8
+ == Enhancements & Alterations
13
9
 
14
- == Usage
10
+ This release sees a switch away from returning arrays containing the row data
11
+ for queries. Calling the fetch method on a ResultSet object returns an object
12
+ of the new Row class. This class possesses a lot more information on the row
13
+ data, including the column name, column aliases, row number and column data.
14
+ See the API documentation for more information on this class.
15
15
 
16
- The library is provided as a gem. Installation follows the normal procedure for
17
- gem installation. The installation includes API documentation in HTML format.
18
- Some examples will be provided at a later date.
16
+ A change has been made to the Database and Connection classes. Previously the
17
+ database user name and password was specified when creating a Database object.
18
+ This didn't make sense so the user name and password have now been switched to
19
+ be parameters of the connect method. The Connection class has also be updated
20
+ to reflect this change. Apologies if this breaks existing code but this kind of
21
+ change is better done sooner rather than later.
22
+
23
+ A few additional methods have been added to the existing class set. The
24
+ ResultSet class now has a method call exhausted? that can be used to detect
25
+ when there are no more rows available (the fetch method must have been called
26
+ at least once however). The Statement object now has a parameter_count method
27
+ that returns a count of the number of parameters require for the execution of
28
+ the SQL statement.
29
+
30
+ Also improved the documentation a little, by adding in the missing documentation
31
+ for the Blob class, including a piece on the actual usage of the library in
32
+ code, and adding a source example.
33
+
34
+ == Bug Fixes
35
+
36
+ A problem with using scalar numeric values as a parameter to an insert
37
+ Statement was corrected and the whole area of input parameter type conversion
38
+ tidied up a little.
19
39
 
20
40
  == Issues
21
41
 
22
42
  Nothing is perfect so this section outlines those issues that are known to
23
- exist before the release of the library.
24
-
25
- - The library currently does not support array columns. This may be implemented
26
- for a later release depending on demand.
27
-
28
- - There is an issue with storing and retrieving float values. The value is
29
- stored but the actual value stored seems to be out by a small amount. This
30
- will require further investigation.
31
-
32
- - There is an issue with the use of anonymous transactions inside of a block
33
- for the Database#connect method. An attempt is made to close the connection
34
- when the block exits. If, within the block, there is a call to the
35
- Connection#execute_immediate method that generates a result set and,
36
- subsequently, an exception is raised the anonymous transaction used in the
37
- execute_immediate will be unavailable for closure. This will, in turn,
38
- make it impossible to close the connection, resulting in an exception. As
39
- a work around, don't use anonynous transactions.
43
+ exist as of this release.
44
+
45
+ - The library currently does not support array columns. This may be implemented
46
+ for a later release depending on demand.
47
+
48
+ - There is an issue with the use of anonymous transactions inside of a block
49
+ for the Database#connect method. An attempt is made to close the connection
50
+ when the block exits. If, within the block, there is a call to the
51
+ Connection#execute_immediate method that generates a result set and,
52
+ subsequently, an exception is raised the anonymous transaction used in the
53
+ execute_immediate will be unavailable for closure. This will, in turn,
54
+ make it impossible to close the connection, resulting in an exception. As
55
+ a work around, don't use anonymous transactions for queries.
56
+
57
+ == Installation & Usage
58
+
59
+ The library is provided as a gem and built for use with Ruby 1.8+. Testing
60
+ against an earlier release of Ruby has not been performed. Installation requires
61
+ the Ruby Gems package to be installed. Assuming that these installation criteria
62
+ have been met the library can be installed on Windows by executing a command
63
+ such as the following...
64
+
65
+ gem install fireruby-0.2.0-mswin32.gem
66
+
67
+ On the Mac OS X platform you may require super user privilege if your Ruby is
68
+ installed to the default location (i.e. /usr/local/lib). In this case you can
69
+ use the sudo command to make the installation like this...
70
+
71
+ sudo gem install fireruby-0.2.0-powerpc-darwin.gem
72
+
73
+ Once the gem installation is complete the FireRuby functionality can be accessed
74
+ in code with the usual gem style requires...
75
+
76
+ require 'rubygems'
77
+ require_gem 'fireruby'
78
+
79
+ == Build Details
80
+
81
+ The FireRuby library is an extension of the Ruby language written in C. For Mac
82
+ OS X the library was built against Firebird installed as a framework, version
83
+ 1.5.1, and with Ruby version 1.8.2. For the Windows platform the library was
84
+ built against a Ruby installation created using the one-click installer, version
85
+ 1.8.2. The Windows build was created using the freely available Microsoft
86
+ compilers and SDKs and built against a standard installation of Firebird,
87
+ version 1.5.2.
88
+
89
+ == So How Do I Use It?
90
+
91
+ This section will provide some examples of usage for the the FireRuby classes.
92
+ Throughout the code the following set of assumptions are made.
93
+
94
+ - The user name and password that will be employed to attach to the database
95
+ are 'sysdba' and 'masterkey' respectively (the Firebird defaults).
96
+
97
+ - The databases attached to will all be local (i.e. they will all reside on the
98
+ same machine) as the test code.
99
+
100
+ A database, from the Firebird perspective, is made up of one or more files. From
101
+ a FireRuby perspective a user interaction with a database starts through the
102
+ Database class. This class provides facilities that allow for creating, dropping
103
+ and connecting to database instances. For example, to obtain a connection to a
104
+ database you would use something like the following...
105
+
106
+ require 'rubygems'
107
+ require_gem 'fireruby'
108
+
109
+ include FireRuby
110
+
111
+ db = Database.new('./test.fdb')
112
+ c = db.connect('sysdba', 'masterkey')
113
+
114
+ This example starts by requiring the necessary files and including the FireRuby
115
+ module locally - later examples will not detail these lines but they are always
116
+ required to use the FireRuby code.
117
+
118
+ The first line of code after the include creates a new database object. This
119
+ process does not actually create the database file (see the Database#create
120
+ method API documentation if that is what you want to do), it simple creates an
121
+ abstract reference to a database. In creating the Database object we had to
122
+ provide a database specification string which identifies the database we want to
123
+ access. In this case we are specifying a database in the current working
124
+ directory called 'test.fdb'. See the Firebird documentation for details on the
125
+ structure of more complex database specifications.
126
+
127
+ The last line of code in the example given above opens a connection to the
128
+ database. In doing this we had to provide two parameters, the database user
129
+ name and password. These are required to gain access to the database.
130
+
131
+ A connection represents a conduit to a database and obtaining a connection is a
132
+ prerequisite to working with the database. The FireRuby library support having
133
+ multiple connections, to one or more databases, using one or more users, active
134
+ simultaneously. FireRuby represents a database connection through objects of the
135
+ Connection class. This class provides functionality to determine the current
136
+ state a database connection (open or closed) and for closing the connection.
137
+ Connections take up resources, both locally and on the database server and
138
+ should be explicitly closed when they are no longer required.
139
+
140
+ The connection class also provides a set of conveniences methods to allow for
141
+ the execution of SQL against a database. These methods, execute_immediate and
142
+ execute, represently two slightly different approaches to executing SQL against
143
+ the database. Refer to the API documentation for more information.
144
+
145
+ An advantage of using a relational database management system like Firebird is
146
+ that it provides transactions. A transaction represents a block of work that is
147
+ either all completed successful or none of it is applied. From the perspective
148
+ of the database this means that a series of steps that make changes to the
149
+ tables in the database can be wrapped in a transaction to insure that they
150
+ either all complete or that none of the changes are applied.
151
+
152
+ The FireRuby library represents a database transaction through instances of the
153
+ Transaction class. There are two ways of obtaining a Transaction using the
154
+ library, both requiring you to have an open database connection. The first way
155
+ is to construct a new Transaction object like so...
156
+
157
+ tx = Transaction.new(connection)
158
+
159
+ The Transaction constructor takes a single parameter which must be either a
160
+ Connection object or an array of Connection objects. If you pass an array of
161
+ Connection objects to this constructor then the Transaction created will apply
162
+ across all of the databases that the connections refer to, allowing you to
163
+ have transactional control of work that must utilise more than one database. The
164
+ second way to obtain a transaction is to simply request one from a Connection
165
+ object, like so.
166
+
167
+ tx = connection.start_transaction
168
+
169
+ In this case the transaction will only ever apply to one database, the one that
170
+ the connection relates to. This method also accepts a block, taking a single
171
+ parameter. The parameter passed to the block will be the transaction created.
172
+ In this case the lifetime of the transaction is delimited by the block. If the
173
+ block completes successfully then the work of the transaction will be committed
174
+ to the database. If the block raises an exception then the transactional work
175
+ will be rolled back.
176
+
177
+ When the block of work associated with a transaction is complete the user must
178
+ instruct the system to either apply the changes implemented by the work or to
179
+ discard them. This can be done by calling the commit or rollback methods of the
180
+ Transaction class respectively. Once a transaction has been committed or rolled
181
+ back it can no longer be used and should be discarded. Note that attempts to
182
+ close a connection that has an active transaction against it will fail, so one
183
+ of the commit or rollback methods should be explictly called in code. The
184
+ block technique detailed above helps protect against the failure to do this and
185
+ is a useful technique.
186
+
187
+ The Transaction object provides a number of other informational and utility
188
+ methods. Check the API documentation for this class for more information.
189
+
190
+ So we've looked at connections and transactions, but how do we actually do
191
+ something practical with the database. Well there are a number of possible
192
+ approaches that we can take to this. Both the Connection and Transaction classes
193
+ have convenience method for the execution of SQL statements and these are useful
194
+ for quick SQL. Where you want something that you can repeatedly reuse and,
195
+ optionally, pass parameters to then you need the Statement class.
196
+
197
+ The Statement class represents a SQL statement that has been validated and
198
+ prepared for execution. Here's an example of creating a SQL statement...
199
+
200
+ s = Statement.new(cxn, tx, 'SELECT * FROM MY_TABLE', 3)
201
+
202
+ In this example we have created a Statement object that wraps a SQL select from
203
+ a table called MY_TABLE. The first parameter to the constructor is a Connection
204
+ object and the second is a Transaction, both mandatory. You may be thinking
205
+ 'why do I need a transaction here, I'm not changing anything?'. This is true
206
+ (well sort of) but it's a requirement of the underlying database system. This
207
+ is also the case for the final parameter to the constructor. The value 3 is
208
+ the SQL dialect to be used with the Statement. This exists for reason arising
209
+ from the move from closed source Interbase to open source Firebird. The
210
+ parameter should be given a value of between 1 and 3. If you're not sure what
211
+ this is and you're only using Firebird it's probably safe to use a value of
212
+ 3 here. Other values are for backward compatibility. Consult the Firebird and
213
+ Interbase documentation for more details.
214
+
215
+ Anyway, now that we have our Statement how do we use it. Well, there are two
216
+ approaches to using the Statement object. For statements like the one used
217
+ above, queries that take no parameters, you can use the Statement object to
218
+ build a ResultSet object, like so...
219
+
220
+ r = ResultSet.new(s)
221
+
222
+ The ResultSet class will be covered in a little more detail below. The other
223
+ means by which a Statement can be used is to call one of it's execute methods.
224
+ The one to be called depends on whether the Statement requires parameters or
225
+ not. What are parameters you ask? Well, look at the following...
226
+
227
+ s = Statement.new(cxn, tx, 'SELECT * FROM MY_TABLE WHERE MYID = ?', 3)
228
+
229
+ Note that the SQL select for this Statement contains a '?'. This is a position
230
+ holder for a value that the statement expects to be provided later. A Statement
231
+ that wraps such a piece of SQL must be provided with the necessary parameters
232
+ to execute properly. Where a Statement object represents SQL that requires a
233
+ parameter then the execute_for method must be called, like this...
234
+
235
+ r = s.execute_for([25])
236
+
237
+ This code executes the SQL substituting the parameters from the array of data
238
+ passed to the function call. If a Statement object represents SQL that does not
239
+ require parameter values a call to the execute method will suffice, such as the
240
+ following...
241
+
242
+ r = s.execute
243
+
244
+ The execute methods for the Statement class, as with all of the execute methods
245
+ for the FireRuby library, have two potential return values. They will either
246
+ return nil or they will return a ResultSet object. A ResultSet object will only
247
+ be returned for SQL statements that constitute a query, irrespective of whether
248
+ that query returns any data. For all other SQL statements the various execute
249
+ method will return nil.
250
+
251
+ A ResultSet object represents a handle by which the data retrieved for a SQL
252
+ query can be accessed. To fetch a row of data from a ResultSet object you call
253
+ the fetch method, like the following...
254
+
255
+ row = r.fetch
256
+
257
+ This fetches a single row of data for a query represented as a Row object (which
258
+ will be covered shortly). The ResultSet class also provides for iteration across
259
+ the contents of a result set by providing an each method. The block to the each
260
+ method will be passed the data for the ResultSet, a row at a time.
261
+
262
+ It should be noted that both the Statement and ResultSet objects hold resources
263
+ while they are active. They both possess close methods and these should be
264
+ explicitly called to release the associated resources. The exception to this
265
+ rule is for ResultSets. If you select all of the rows from a ResultSet then the
266
+ resources for the ResultSet are automatically released. It is still safe to call
267
+ close on such a ResultSet as this will not cause errors.
268
+
269
+ Okay, so you've gotten a row of data in the form of a Row object from your
270
+ ResultSet, how do we get the data out of it? Well, there are a number of ways
271
+ of doing this. You can treat the Row object like an array and dereference the
272
+ columns of data within the row like this...
273
+
274
+ value = row[1]
275
+
276
+ The index specified to the array dereference operator specifies the column that
277
+ you want the data for. Column indices start at 0. Alternatively you can use the
278
+ column name to access the data, like this...
279
+
280
+ value = row['MYID']
281
+
282
+ This is beneficial as it frees you from the constraint of knowing the ordering
283
+ of the columns within the row. For more information of the Row class please
284
+ consult the API documentation.
285
+
286
+ Well that covers the bulk of the classes provided by the FireRuby library. The
287
+ three which haven't been touched upon are the Generator class, the Blob class
288
+ and the FireRubyException class.
289
+
290
+ The Generator class is a wrapper around the Firebird generator facility. A
291
+ generator, also known as a sequence, provides a means of creating a list of
292
+ numeric values in a way that is guaranteed to be thread and process safe. Used
293
+ properly generators can be employed to create unique sequences that make perfect
294
+ table keys. Consult the API documentation for more details on the Generator
295
+ class.
296
+
297
+ The Blob class is returned as part of the Row object data obtained from a
298
+ ResultSet. The class wraps the concept of a binary large object stored in the
299
+ database. Consult the API documentation for further information.
300
+
301
+ The FireRubyException class is the error class used by the FireRuby library
302
+ whenever it hits trouble. If an exception is raised by the FireRuby code then
303
+ its extremely likely that it will be an instance of this class. The class
304
+ provides a means of finding out a little more about what exactly has gone
305
+ wrong. Again, consult the API documentation for more details.
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require_gem 'fireruby'
5
+
6
+ include FireRuby
7
+
8
+ # SQL constants.
9
+ CREATE_TABLE_SQL = 'CREATE TABLE TESTTABLE (TESTID INTEGER NOT NULL PRIMARY '\
10
+ 'KEY, TESTTEXT VARCHAR(100), TESTFLOAT NUMERIC(6,2), '\
11
+ 'CREATED TIMESTAMP)'
12
+ DROP_TABLE_SQL = 'DROP TABLE TESTTABLE'
13
+ INSERT_SQL = 'INSERT INTO TESTTABLE VALUES(?, ?, ?, ?)'
14
+ SELECT_SQL = 'SELECT * FROM TESTTABLE'
15
+
16
+ begin
17
+ # Check if the database file exists.
18
+ db = nil
19
+ if File.exist?('./example.fdb') == false
20
+ # Create the database file.
21
+ db = Database.create('./example.fdb', 'sysdba', 'masterkey', 1024, 'ASCII')
22
+ else
23
+ # Create the databse object.
24
+ db = Database.new('./example.fdb')
25
+ end
26
+
27
+ # Obtain a connection to the database.
28
+ db.connect('sysdba', 'masterkey') do |cxn|
29
+ # Create the database table.
30
+ cxn.execute_immediate(CREATE_TABLE_SQL)
31
+
32
+ # Insert 50 rows into the database.
33
+ decimal = 1.0
34
+ cxn.start_transaction do |tx|
35
+ s = Statement.new(cxn, tx, INSERT_SQL, 3)
36
+ 1.upto(20) do |number|
37
+ s.execute_for([number, "Number is #{number}.", decimal, Time.new])
38
+ decimal = decimal + 0.24
39
+ end
40
+ s.close
41
+ end
42
+
43
+ # Select back the rows inserted and display them
44
+ rows = cxn.execute_immediate(SELECT_SQL)
45
+ rows.each do |row|
46
+ puts "-----"
47
+ puts "Test Id: #{row['TESTID']}"
48
+ puts "Test Text: '#{row['TESTTEXT']}'"
49
+ puts "Test Float: #{row['TESTFLOAT']}"
50
+ puts "Test Created: #{row['CREATED']}"
51
+ puts "-----"
52
+ end
53
+ rows.close
54
+
55
+ # Drop the table.
56
+ cxn.execute_immediate(DROP_TABLE_SQL)
57
+ end
58
+ rescue Excepton => error
59
+ puts error.message
60
+ end
data/lib/doc.tar.gz ADDED
Binary file
data/lib/fireruby.bundle CHANGED
Binary file
data/lib/fireruby.so CHANGED
Binary file
data/lib/mkdoc CHANGED
@@ -1 +1 @@
1
- rdoc --op ../doc src.rb
1
+ rdoc -m README src.rb README
data/lib/src.rb CHANGED
@@ -13,7 +13,7 @@ module FireRuby
13
13
  #
14
14
  # This class provides the exception type used by the FireRuby library.
15
15
  #
16
- class FireRubyError
16
+ class FireRubyException
17
17
  #
18
18
  # This is the constructor for the FireRubyError class.
19
19
  #
@@ -62,20 +62,10 @@ module FireRuby
62
62
  # This is the constructor for the Database class.
63
63
  #
64
64
  # ==== Parameters
65
- # user:: A string containing the user name that will be used to
66
- # connect to the database.
67
- # password:: A string containing the user password that will be used to
68
- # connect to the database.
69
65
  # file:: A string containing the database file specifier. This can
70
66
  # include details for a remote server if needed.
71
67
  #
72
- def initialize(user, password, file)
73
- end
74
-
75
- #
76
- # This is the accessor for the user database attribute.
77
- #
78
- def user
68
+ def initialize(file)
79
69
  end
80
70
 
81
71
 
@@ -93,11 +83,15 @@ module FireRuby
93
83
  # block completes. If a block is specified the connection is provided
94
84
  # as a parameter to the block.
95
85
  #
86
+ # ==== Parameters
87
+ # user:: The user name to be used in making the connection.
88
+ # password:: The password to be used in making the connection.
89
+ #
96
90
  # ==== Exceptions
97
91
  # Exception:: Thrown whenever a problem occurs connecting with the
98
92
  # database.
99
93
  #
100
- def connect
94
+ def connect(user, password)
101
95
  yield(connection)
102
96
  end
103
97
 
@@ -106,11 +100,15 @@ module FireRuby
106
100
  # This method attempts to drop the database referred to by the details
107
101
  # in a Database object.
108
102
  #
103
+ # ==== Parameters
104
+ # user:: The user name to be used in dropping the database.
105
+ # password:: The password to be used in dropping the database.
106
+ #
109
107
  # ==== Exceptions
110
108
  # FireRubyError:: Thrown whenever a problem occurs dropping the database
111
109
  # instance.
112
110
  #
113
- def drop
111
+ def drop(user, password)
114
112
  end
115
113
 
116
114
 
@@ -148,13 +146,17 @@ module FireRuby
148
146
  #
149
147
  # ==== Parameters
150
148
  # database:: A reference to the Database object to be connected to.
149
+ # user:: A reference to the user name to be used in making the
150
+ # database connection.
151
+ # password:: A reference to the user password to be used in making the
152
+ # connection.
151
153
  #
152
154
  # ==== Exceptions
153
155
  # Exception:: Generated whenever an invalid database is specified to
154
156
  # the method or an issue occurs establishing the database
155
157
  # connection.
156
158
  #
157
- def initialize(database)
159
+ def initialize(database, user, password)
158
160
  end
159
161
 
160
162
 
@@ -195,6 +197,14 @@ module FireRuby
195
197
  end
196
198
 
197
199
 
200
+ #
201
+ # This method retrieves the user name that was used in creating a
202
+ # Connection object.
203
+ #
204
+ def user
205
+ end
206
+
207
+
198
208
  #
199
209
  # This method generates a simple descriptive string for a Connection
200
210
  # object.
@@ -463,6 +473,15 @@ module FireRuby
463
473
  end
464
474
 
465
475
 
476
+ #
477
+ # This method fetches a count of the number of dynamic parameters for
478
+ # a statement object (i.e. the number of parameters that must be provided
479
+ # with values before the SQL statement can be executed).
480
+ #
481
+ def parameter_count
482
+ end
483
+
484
+
466
485
  #
467
486
  # This method executes the SQL statement within a Statement object. This
468
487
  # method returns a ResultSet object if the statement executed was a SQL
@@ -599,6 +618,24 @@ module FireRuby
599
618
  end
600
619
 
601
620
 
621
+ #
622
+ # This method is used to determine if all of the rows have been retrieved
623
+ # from a ResultSet object. This method will always return false until
624
+ # the fetch method has been called at least once so it cannot be used to
625
+ # detect a result set that returns no rows.
626
+ #
627
+ def exhausted?
628
+ end
629
+
630
+
631
+ #
632
+ # This method fetches a count of the total number of rows retrieved
633
+ # from a result set.
634
+ #
635
+ def row_count
636
+ end
637
+
638
+
602
639
  #
603
640
  # This method provides an iterator for the (remaining) rows contained in
604
641
  # a ResultSet object.
@@ -628,6 +665,112 @@ module FireRuby
628
665
  end
629
666
 
630
667
 
668
+ #
669
+ # This class models a row of data fetched as part of a SQL query.
670
+ #
671
+ class Row
672
+ #
673
+ # This is the constructor for the Row class. This method shouldn't really
674
+ # be used as Row objects are automatically created by ResultSets.
675
+ #
676
+ # ==== Parameters
677
+ # results:: The ResultSet object that the row relates to.
678
+ # data:: An array containing the row data values.
679
+ # number:: The row number for the new row.
680
+ #
681
+ def initialize(results, data, number)
682
+ end
683
+
684
+ #
685
+ # This is the accessor for the row number attribute. This will generally
686
+ # reflect the order the row was fetched from the result set in, with 1
687
+ # being the first row retrieved.
688
+ #
689
+ def number
690
+ end
691
+
692
+
693
+ #
694
+ # This method fetches a count of the number of columns of data that are
695
+ # available from a row.
696
+ #
697
+ def column_count
698
+ end
699
+
700
+
701
+ #
702
+ # This method fetches the name of a column within a row of data.
703
+ #
704
+ # ==== Parameters
705
+ # index:: The index of the column to fetch the name for. The first
706
+ # column in the row is at offset zero.
707
+ #
708
+ def column_name(index)
709
+ end
710
+
711
+
712
+ #
713
+ # This method fetches the alias of a column within a row of data.
714
+ #
715
+ # ==== Parameters
716
+ # index:: The index of the column to fetch the alias for. The first
717
+ # column in the row is at offset zero.
718
+ #
719
+ def column_alias(index)
720
+ end
721
+
722
+
723
+ #
724
+ # This method fetches the value associated with a column within a Row
725
+ # object.
726
+ #
727
+ # ==== Parameters
728
+ # index:: Either the offset of the column to retrieve the value of or
729
+ # the name of the column to retrieve the value of (column name
730
+ # comparisons are case sensitive).
731
+ #
732
+ def [](index)
733
+ end
734
+ end
735
+
736
+ #
737
+ # This class represents Blob data fetched from the database. The class defers
738
+ # the actual loading of the blob until requested. The class is somewhat basic
739
+ # and maybe expanded upon in later releases.
740
+ #
741
+ class Blob
742
+ #
743
+ # This is the constructor for the Blob class. This shouldn't really be
744
+ # used outside of the FireRuby library.
745
+ #
746
+ def initialize
747
+ end
748
+
749
+
750
+ #
751
+ # This method loads the entire data set for a blob as a string.
752
+ #
753
+ def to_s
754
+ end
755
+
756
+
757
+ #
758
+ # This method closes a blob, freeing any resources associated with it.
759
+ #
760
+ def close
761
+ end
762
+
763
+
764
+ #
765
+ # This method loads the segments of a blob one after another. The blob
766
+ # segments are passed as strings to the block passed to the method.
767
+ #
768
+ def each
769
+ yield segment
770
+ end
771
+ end
772
+
773
+
631
774
  #
632
775
  # This class represents a Firebird generator entity.
633
776
  #