viking-sequel 3.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (237) hide show
  1. data/CHANGELOG +3134 -0
  2. data/COPYING +19 -0
  3. data/README.rdoc +723 -0
  4. data/Rakefile +193 -0
  5. data/bin/sequel +196 -0
  6. data/doc/advanced_associations.rdoc +644 -0
  7. data/doc/cheat_sheet.rdoc +218 -0
  8. data/doc/dataset_basics.rdoc +106 -0
  9. data/doc/dataset_filtering.rdoc +158 -0
  10. data/doc/opening_databases.rdoc +296 -0
  11. data/doc/prepared_statements.rdoc +104 -0
  12. data/doc/reflection.rdoc +84 -0
  13. data/doc/release_notes/1.0.txt +38 -0
  14. data/doc/release_notes/1.1.txt +143 -0
  15. data/doc/release_notes/1.3.txt +101 -0
  16. data/doc/release_notes/1.4.0.txt +53 -0
  17. data/doc/release_notes/1.5.0.txt +155 -0
  18. data/doc/release_notes/2.0.0.txt +298 -0
  19. data/doc/release_notes/2.1.0.txt +271 -0
  20. data/doc/release_notes/2.10.0.txt +328 -0
  21. data/doc/release_notes/2.11.0.txt +215 -0
  22. data/doc/release_notes/2.12.0.txt +534 -0
  23. data/doc/release_notes/2.2.0.txt +253 -0
  24. data/doc/release_notes/2.3.0.txt +88 -0
  25. data/doc/release_notes/2.4.0.txt +106 -0
  26. data/doc/release_notes/2.5.0.txt +137 -0
  27. data/doc/release_notes/2.6.0.txt +157 -0
  28. data/doc/release_notes/2.7.0.txt +166 -0
  29. data/doc/release_notes/2.8.0.txt +171 -0
  30. data/doc/release_notes/2.9.0.txt +97 -0
  31. data/doc/release_notes/3.0.0.txt +221 -0
  32. data/doc/release_notes/3.1.0.txt +406 -0
  33. data/doc/release_notes/3.10.0.txt +286 -0
  34. data/doc/release_notes/3.2.0.txt +268 -0
  35. data/doc/release_notes/3.3.0.txt +192 -0
  36. data/doc/release_notes/3.4.0.txt +325 -0
  37. data/doc/release_notes/3.5.0.txt +510 -0
  38. data/doc/release_notes/3.6.0.txt +366 -0
  39. data/doc/release_notes/3.7.0.txt +179 -0
  40. data/doc/release_notes/3.8.0.txt +151 -0
  41. data/doc/release_notes/3.9.0.txt +233 -0
  42. data/doc/schema.rdoc +36 -0
  43. data/doc/sharding.rdoc +113 -0
  44. data/doc/virtual_rows.rdoc +205 -0
  45. data/lib/sequel.rb +1 -0
  46. data/lib/sequel/adapters/ado.rb +90 -0
  47. data/lib/sequel/adapters/ado/mssql.rb +30 -0
  48. data/lib/sequel/adapters/amalgalite.rb +176 -0
  49. data/lib/sequel/adapters/db2.rb +139 -0
  50. data/lib/sequel/adapters/dbi.rb +113 -0
  51. data/lib/sequel/adapters/do.rb +188 -0
  52. data/lib/sequel/adapters/do/mysql.rb +49 -0
  53. data/lib/sequel/adapters/do/postgres.rb +91 -0
  54. data/lib/sequel/adapters/do/sqlite.rb +40 -0
  55. data/lib/sequel/adapters/firebird.rb +283 -0
  56. data/lib/sequel/adapters/informix.rb +77 -0
  57. data/lib/sequel/adapters/jdbc.rb +587 -0
  58. data/lib/sequel/adapters/jdbc/as400.rb +58 -0
  59. data/lib/sequel/adapters/jdbc/h2.rb +133 -0
  60. data/lib/sequel/adapters/jdbc/mssql.rb +57 -0
  61. data/lib/sequel/adapters/jdbc/mysql.rb +78 -0
  62. data/lib/sequel/adapters/jdbc/oracle.rb +50 -0
  63. data/lib/sequel/adapters/jdbc/postgresql.rb +108 -0
  64. data/lib/sequel/adapters/jdbc/sqlite.rb +55 -0
  65. data/lib/sequel/adapters/mysql.rb +421 -0
  66. data/lib/sequel/adapters/odbc.rb +143 -0
  67. data/lib/sequel/adapters/odbc/mssql.rb +42 -0
  68. data/lib/sequel/adapters/openbase.rb +64 -0
  69. data/lib/sequel/adapters/oracle.rb +131 -0
  70. data/lib/sequel/adapters/postgres.rb +504 -0
  71. data/lib/sequel/adapters/shared/mssql.rb +490 -0
  72. data/lib/sequel/adapters/shared/mysql.rb +498 -0
  73. data/lib/sequel/adapters/shared/oracle.rb +195 -0
  74. data/lib/sequel/adapters/shared/postgres.rb +830 -0
  75. data/lib/sequel/adapters/shared/progress.rb +44 -0
  76. data/lib/sequel/adapters/shared/sqlite.rb +389 -0
  77. data/lib/sequel/adapters/sqlite.rb +224 -0
  78. data/lib/sequel/adapters/utils/stored_procedures.rb +84 -0
  79. data/lib/sequel/connection_pool.rb +99 -0
  80. data/lib/sequel/connection_pool/sharded_single.rb +84 -0
  81. data/lib/sequel/connection_pool/sharded_threaded.rb +211 -0
  82. data/lib/sequel/connection_pool/single.rb +29 -0
  83. data/lib/sequel/connection_pool/threaded.rb +150 -0
  84. data/lib/sequel/core.rb +293 -0
  85. data/lib/sequel/core_sql.rb +241 -0
  86. data/lib/sequel/database.rb +1079 -0
  87. data/lib/sequel/database/schema_generator.rb +327 -0
  88. data/lib/sequel/database/schema_methods.rb +203 -0
  89. data/lib/sequel/database/schema_sql.rb +320 -0
  90. data/lib/sequel/dataset.rb +32 -0
  91. data/lib/sequel/dataset/actions.rb +441 -0
  92. data/lib/sequel/dataset/features.rb +86 -0
  93. data/lib/sequel/dataset/graph.rb +254 -0
  94. data/lib/sequel/dataset/misc.rb +119 -0
  95. data/lib/sequel/dataset/mutation.rb +64 -0
  96. data/lib/sequel/dataset/prepared_statements.rb +227 -0
  97. data/lib/sequel/dataset/query.rb +709 -0
  98. data/lib/sequel/dataset/sql.rb +996 -0
  99. data/lib/sequel/exceptions.rb +51 -0
  100. data/lib/sequel/extensions/blank.rb +43 -0
  101. data/lib/sequel/extensions/inflector.rb +242 -0
  102. data/lib/sequel/extensions/looser_typecasting.rb +21 -0
  103. data/lib/sequel/extensions/migration.rb +239 -0
  104. data/lib/sequel/extensions/named_timezones.rb +61 -0
  105. data/lib/sequel/extensions/pagination.rb +100 -0
  106. data/lib/sequel/extensions/pretty_table.rb +82 -0
  107. data/lib/sequel/extensions/query.rb +52 -0
  108. data/lib/sequel/extensions/schema_dumper.rb +271 -0
  109. data/lib/sequel/extensions/sql_expr.rb +122 -0
  110. data/lib/sequel/extensions/string_date_time.rb +46 -0
  111. data/lib/sequel/extensions/thread_local_timezones.rb +48 -0
  112. data/lib/sequel/metaprogramming.rb +9 -0
  113. data/lib/sequel/model.rb +120 -0
  114. data/lib/sequel/model/associations.rb +1514 -0
  115. data/lib/sequel/model/base.rb +1069 -0
  116. data/lib/sequel/model/default_inflections.rb +45 -0
  117. data/lib/sequel/model/errors.rb +39 -0
  118. data/lib/sequel/model/exceptions.rb +21 -0
  119. data/lib/sequel/model/inflections.rb +162 -0
  120. data/lib/sequel/model/plugins.rb +70 -0
  121. data/lib/sequel/plugins/active_model.rb +59 -0
  122. data/lib/sequel/plugins/association_dependencies.rb +103 -0
  123. data/lib/sequel/plugins/association_proxies.rb +41 -0
  124. data/lib/sequel/plugins/boolean_readers.rb +53 -0
  125. data/lib/sequel/plugins/caching.rb +141 -0
  126. data/lib/sequel/plugins/class_table_inheritance.rb +214 -0
  127. data/lib/sequel/plugins/composition.rb +138 -0
  128. data/lib/sequel/plugins/force_encoding.rb +72 -0
  129. data/lib/sequel/plugins/hook_class_methods.rb +126 -0
  130. data/lib/sequel/plugins/identity_map.rb +116 -0
  131. data/lib/sequel/plugins/instance_filters.rb +98 -0
  132. data/lib/sequel/plugins/instance_hooks.rb +57 -0
  133. data/lib/sequel/plugins/lazy_attributes.rb +77 -0
  134. data/lib/sequel/plugins/many_through_many.rb +208 -0
  135. data/lib/sequel/plugins/nested_attributes.rb +206 -0
  136. data/lib/sequel/plugins/optimistic_locking.rb +81 -0
  137. data/lib/sequel/plugins/rcte_tree.rb +281 -0
  138. data/lib/sequel/plugins/schema.rb +66 -0
  139. data/lib/sequel/plugins/serialization.rb +166 -0
  140. data/lib/sequel/plugins/single_table_inheritance.rb +74 -0
  141. data/lib/sequel/plugins/subclasses.rb +45 -0
  142. data/lib/sequel/plugins/tactical_eager_loading.rb +61 -0
  143. data/lib/sequel/plugins/timestamps.rb +87 -0
  144. data/lib/sequel/plugins/touch.rb +118 -0
  145. data/lib/sequel/plugins/typecast_on_load.rb +72 -0
  146. data/lib/sequel/plugins/validation_class_methods.rb +405 -0
  147. data/lib/sequel/plugins/validation_helpers.rb +223 -0
  148. data/lib/sequel/sql.rb +1020 -0
  149. data/lib/sequel/timezones.rb +161 -0
  150. data/lib/sequel/version.rb +12 -0
  151. data/lib/sequel_core.rb +1 -0
  152. data/lib/sequel_model.rb +1 -0
  153. data/spec/adapters/firebird_spec.rb +407 -0
  154. data/spec/adapters/informix_spec.rb +97 -0
  155. data/spec/adapters/mssql_spec.rb +403 -0
  156. data/spec/adapters/mysql_spec.rb +1019 -0
  157. data/spec/adapters/oracle_spec.rb +286 -0
  158. data/spec/adapters/postgres_spec.rb +969 -0
  159. data/spec/adapters/spec_helper.rb +51 -0
  160. data/spec/adapters/sqlite_spec.rb +432 -0
  161. data/spec/core/connection_pool_spec.rb +808 -0
  162. data/spec/core/core_sql_spec.rb +417 -0
  163. data/spec/core/database_spec.rb +1662 -0
  164. data/spec/core/dataset_spec.rb +3827 -0
  165. data/spec/core/expression_filters_spec.rb +595 -0
  166. data/spec/core/object_graph_spec.rb +296 -0
  167. data/spec/core/schema_generator_spec.rb +159 -0
  168. data/spec/core/schema_spec.rb +830 -0
  169. data/spec/core/spec_helper.rb +56 -0
  170. data/spec/core/version_spec.rb +7 -0
  171. data/spec/extensions/active_model_spec.rb +76 -0
  172. data/spec/extensions/association_dependencies_spec.rb +127 -0
  173. data/spec/extensions/association_proxies_spec.rb +50 -0
  174. data/spec/extensions/blank_spec.rb +67 -0
  175. data/spec/extensions/boolean_readers_spec.rb +92 -0
  176. data/spec/extensions/caching_spec.rb +250 -0
  177. data/spec/extensions/class_table_inheritance_spec.rb +252 -0
  178. data/spec/extensions/composition_spec.rb +194 -0
  179. data/spec/extensions/force_encoding_spec.rb +117 -0
  180. data/spec/extensions/hook_class_methods_spec.rb +470 -0
  181. data/spec/extensions/identity_map_spec.rb +202 -0
  182. data/spec/extensions/inflector_spec.rb +181 -0
  183. data/spec/extensions/instance_filters_spec.rb +55 -0
  184. data/spec/extensions/instance_hooks_spec.rb +133 -0
  185. data/spec/extensions/lazy_attributes_spec.rb +153 -0
  186. data/spec/extensions/looser_typecasting_spec.rb +39 -0
  187. data/spec/extensions/many_through_many_spec.rb +884 -0
  188. data/spec/extensions/migration_spec.rb +332 -0
  189. data/spec/extensions/named_timezones_spec.rb +72 -0
  190. data/spec/extensions/nested_attributes_spec.rb +396 -0
  191. data/spec/extensions/optimistic_locking_spec.rb +100 -0
  192. data/spec/extensions/pagination_spec.rb +99 -0
  193. data/spec/extensions/pretty_table_spec.rb +91 -0
  194. data/spec/extensions/query_spec.rb +85 -0
  195. data/spec/extensions/rcte_tree_spec.rb +205 -0
  196. data/spec/extensions/schema_dumper_spec.rb +357 -0
  197. data/spec/extensions/schema_spec.rb +127 -0
  198. data/spec/extensions/serialization_spec.rb +209 -0
  199. data/spec/extensions/single_table_inheritance_spec.rb +96 -0
  200. data/spec/extensions/spec_helper.rb +91 -0
  201. data/spec/extensions/sql_expr_spec.rb +89 -0
  202. data/spec/extensions/string_date_time_spec.rb +93 -0
  203. data/spec/extensions/subclasses_spec.rb +52 -0
  204. data/spec/extensions/tactical_eager_loading_spec.rb +65 -0
  205. data/spec/extensions/thread_local_timezones_spec.rb +45 -0
  206. data/spec/extensions/timestamps_spec.rb +150 -0
  207. data/spec/extensions/touch_spec.rb +155 -0
  208. data/spec/extensions/typecast_on_load_spec.rb +69 -0
  209. data/spec/extensions/validation_class_methods_spec.rb +984 -0
  210. data/spec/extensions/validation_helpers_spec.rb +438 -0
  211. data/spec/integration/associations_test.rb +281 -0
  212. data/spec/integration/database_test.rb +26 -0
  213. data/spec/integration/dataset_test.rb +963 -0
  214. data/spec/integration/eager_loader_test.rb +734 -0
  215. data/spec/integration/model_test.rb +130 -0
  216. data/spec/integration/plugin_test.rb +814 -0
  217. data/spec/integration/prepared_statement_test.rb +213 -0
  218. data/spec/integration/schema_test.rb +361 -0
  219. data/spec/integration/spec_helper.rb +73 -0
  220. data/spec/integration/timezone_test.rb +55 -0
  221. data/spec/integration/transaction_test.rb +122 -0
  222. data/spec/integration/type_test.rb +96 -0
  223. data/spec/model/association_reflection_spec.rb +175 -0
  224. data/spec/model/associations_spec.rb +2633 -0
  225. data/spec/model/base_spec.rb +418 -0
  226. data/spec/model/dataset_methods_spec.rb +78 -0
  227. data/spec/model/eager_loading_spec.rb +1391 -0
  228. data/spec/model/hooks_spec.rb +240 -0
  229. data/spec/model/inflector_spec.rb +26 -0
  230. data/spec/model/model_spec.rb +593 -0
  231. data/spec/model/plugins_spec.rb +236 -0
  232. data/spec/model/record_spec.rb +1500 -0
  233. data/spec/model/spec_helper.rb +97 -0
  234. data/spec/model/validations_spec.rb +153 -0
  235. data/spec/rcov.opts +6 -0
  236. data/spec/spec_config.rb.example +10 -0
  237. metadata +346 -0
@@ -0,0 +1,296 @@
1
+ = Connecting to a database
2
+
3
+ All Sequel activity begins with connecting to a database, which creates a
4
+ Sequel::Database object. The Database object is used to create datasets and execute
5
+ queries. Sequel provides a powerful and flexible mechanism for connecting to
6
+ databases. There are two main ways to establish database connections:
7
+
8
+ 1. Using the Sequel.connect method
9
+ 2. Using the specialized adapter method (Sequel.sqlite, Sequel.postgres, etc.)
10
+
11
+ The connection options needed depend on the adapter being used, though most adapters
12
+ share the same basic connection options.
13
+
14
+ If you are only connecting to a single database, it is recommended that you store the
15
+ database object in a constant named DB. This should never be required, but it is the
16
+ convention that most Sequel code uses.
17
+
18
+ == Using the Sequel.connect method
19
+
20
+ The connect method usually takes a well-formed URI, which is parsed into connection options needed to open
21
+ the database connection. The scheme/protocol part of the URI is used to determine the adapter to use:
22
+
23
+ DB = Sequel.connect('postgres://user:password@localhost/blog') # Uses the postgres adapter
24
+
25
+ You can use URI query parameters to specify options:
26
+
27
+ DB = Sequel.connect('postgres://localhost/blog?user=user&password=password')
28
+
29
+ You can also pass an additional option hash with the connection string:
30
+
31
+ DB = Sequel.connect('postgres://localhost/blog' :user=>'user', :password=>'password')
32
+
33
+ You can also just use an options hash without a connection string. If you do this, you must
34
+ provide the adapter to use:
35
+
36
+ DB = Sequel.connect(:adapter=>'postgres', :host=>'localhost', :database=>'blog', :user=>'user', :password=>'password')
37
+
38
+ All of the above statements are equivalent.
39
+
40
+ == Using the specialized adapter method
41
+
42
+ The specialized adapter method is similar to Sequel.connect with an options hash, except that it
43
+ automatically populates the :adapter option and assumes the first argument is the :database option,
44
+ unless the first argument is a hash. So the following statements are equivalent to the previous statements.
45
+
46
+ DB = Sequel.postgres('blog', :host=>'localhost', :user=>'user', :password=>'password')
47
+ DB = Sequel.postgres(:host=>'localhost', :user=>'user', :password=>'password', :database=>'blog')
48
+
49
+ == Passing a block to either method
50
+
51
+ Both the Sequel.connect method and the specialized adapter methods take a block. If you
52
+ provide a block to the method, Sequel will create a Database object and pass it as an argument
53
+ to the block. When the block returns, Sequel will disconnect the database connection.
54
+ For example:
55
+
56
+ Sequel.connect('sqlite://blog.db'){|db| puts db[:users].count}
57
+
58
+ == General connection options
59
+
60
+ These options are shared by all adapters unless otherwise noted.
61
+
62
+ * :adapter - The adapter to use
63
+ * :database - The name of the database to which to connect
64
+ * :default_schema - The database schema to use by default.
65
+ * :host - The hostname of the database server to which to connect
66
+ * :logger - An array of SQL loggers to log to
67
+ * :loggers - An array of SQL loggers to log to
68
+ * :password - The password for the user account
69
+ * :servers - A hash with symbol keys and hash or proc values, used with master/slave/partitioned database configurations
70
+ * :single_threaded - Whether to use a single-threaded (non-thread safe) connection pool
71
+ * :test - Whether to test that a valid database connection can be made (false by default)
72
+ * :user - The user account name to use logging in
73
+
74
+ The following options can be specified and are passed to the the database's internal connection pool.
75
+
76
+ * :after_connect - A proc called after a new connection is made, with the connection object (default: nil)
77
+ * :max_connections - The maximum size of the connection pool (default: 4 connections on most databases)
78
+ * :pool_sleep_time - The number of seconds to sleep before trying to acquire a connection again (default: 0.001 seconds)
79
+ * :pool_timeout - The number of seconds to wait if a connection cannot be acquired before raising an error (default: 5 seconds)
80
+
81
+ == Adapter specific connection options
82
+
83
+ The following sections explain the options and behavior specific to each adapter.
84
+ If the library the adapter requires is different from the name of the adapter
85
+ scheme, it is listed specifically, otherwise you can assume that is requires the
86
+ library with the same name.
87
+
88
+ === ado
89
+
90
+ Requires: win32ole
91
+
92
+ The ADO adapter provides connectivity to ADO databases in Windows. It relies
93
+ on WIN32OLE library, so it isn't usable on other operating systems (except
94
+ possibly through WINE, but that's fairly unlikely).
95
+
96
+ The following options are supported:
97
+ * :driver - The driver to use. The default if not specified is 'SQL Server'.
98
+ * :command_timeout - Sets the time in seconds to wait while attempting
99
+ to execute a command before cancelling the attempt and generating
100
+ an error. Specifically, it sets the ADO CommandTimeout property.
101
+ If this property is not set, the default of 30 seconds is used.
102
+ * :conn_string - The full ADO connection string. If this is provided,
103
+ the general connection options are ignored.
104
+ * :provider - Sets the Provider of this ADO connection (for example, "SQLOLEDB")
105
+
106
+ === amalgalite
107
+
108
+ Amalgalite is an ruby extension that provides self contained access to SQLite,
109
+ so you don't need to install SQLite separately. As amalgalite is a file backed
110
+ database, the :host, :user, and :password options are not used.
111
+
112
+ * :database - The name of the database file
113
+ * :timeout - The busy timeout period given in milliseconds
114
+
115
+ Without a database argument, assumes a memory database, so you can do:
116
+
117
+ Sequel.amalgalite
118
+
119
+ Handles paths in the connection string similar to the SQLite adapter, so see
120
+ the sqlite section below for details.
121
+
122
+ === db2
123
+
124
+ Requires: db2/db2cli
125
+
126
+ I'm not even sure exactly how this works, or if it works at all (I've never heard from
127
+ anyone who attempted to use it). It uses the SQL_HANDLE_DBC constant to
128
+ get a handle, and respects the :database, :user, and :password options. It doesn't
129
+ appear to respect the :host or :port options.
130
+
131
+ === dbi
132
+
133
+ Allows access to a multitude of databases via ruby-dbi. Additional options:
134
+
135
+ * :db_type - Specifying 'mssql' allows Microsoft SQL Server specific syntax to
136
+ be used. Otherwise has no effect.
137
+
138
+ DBI connection strings are a preprocessed a bit, and are specified with a dbi-
139
+ in front of the protocol. Examples:
140
+
141
+ dbi-ado://...
142
+ dbi-db2://...
143
+ dbi-frontbase://...
144
+ dbi-interbase://...
145
+ dbi-msql://...
146
+ dbi-mysql://...
147
+ dbi-odbc://...
148
+ dbi-oracle://...
149
+ dbi-pg://...
150
+ dbi-proxy://...
151
+ dbi-sqlite://...
152
+ dbi-sqlrelay://...
153
+
154
+ While the DBI adapter does work, it is recommended that you use another adapter
155
+ if your database supports it.
156
+
157
+ === do
158
+
159
+ Requires: data_objects
160
+
161
+ The DataObjects adapter supports PostgreSQL, MySQL, and SQLite. One possible
162
+ advantage of using DataObjects is that it does the typecasting in C, which may
163
+ be faster than the other adapters.
164
+
165
+ Similar to the JDBC adapter, the DO adapter only cares about connection strings,
166
+ which can either be the String argument given to Sequel.connect directly or contained
167
+ in a :uri or :url option. The DO adapter passes through the connection string
168
+ directly to DataObjects, it does no processing of it.
169
+
170
+ Connection string examples:
171
+
172
+ do:sqlite3::memory:
173
+ do:postgres://user:password@host/database
174
+ do:mysql://user:password@host/database
175
+
176
+ === firebird
177
+
178
+ Requires: fb (using code at http://github.com/wishdev/fb)
179
+
180
+ Does not support the :port option.
181
+
182
+ === informix
183
+
184
+ Does not support the :host or :port options.
185
+
186
+ === jdbc
187
+
188
+ Requires: java
189
+
190
+ Houses Sequel's JDBC support when running on JRuby.
191
+ Support for individual database types is done using sub adapters.
192
+ There are currently subadapters for PostgreSQL, MySQL, SQLite, H2,
193
+ Oracle, MSSQL, and AS400. All except Oracle, MSSQL, and AS400 can load the
194
+ JDBC gem, for those you need to have the .jar in your CLASSPATH
195
+ or load the Java class manually.
196
+
197
+ You just use the JDBC connection string directly, which can be specified
198
+ via the string given to Sequel.connect or via the :uri, :url, or :database options.
199
+ Sequel does no preprocessing of the string, it passes it directly to JDBC.
200
+ So if you have problems getting a connection string to work, look up the JDBC
201
+ documentation.
202
+
203
+ Example connections strings:
204
+
205
+ jdbc:sqlite::memory:
206
+ jdbc:postgresql://localhost/database?user=username
207
+ jdbc:mysql://localhost/test?user=root&password=root
208
+ jdbc:h2:mem:
209
+
210
+ You can also use JNDI connection strings:
211
+
212
+ jdbc:jndi:java:comp/env/jndi_resource_name
213
+
214
+ The following additional options are supported:
215
+
216
+ * :convert_types - If set to false, does not attempt to convert some Java types to ruby types.
217
+ Setting to false roughly doubles performance when selecting large numbers of rows.
218
+ Note that you can't provide this option inside the connection string (as that is passed
219
+ directly to JDBC), you have to pass it as a separate option.
220
+
221
+ === mysql
222
+
223
+ The MySQL adapter does not support the pure-ruby MySQL adapter that used to ship with
224
+ ActiveRecord, it requires the native adapter.
225
+
226
+ The following additional options are supported:
227
+
228
+ * :auto_is_null - If set to true, makes "WHERE primary_key IS NULL" select the last inserted id.
229
+ * :charset - Same as :encoding, :encoding takes precedence.
230
+ * :compress - Whether to compress data sent/received via the socket connection.
231
+ * :config_default_group - The default group to read from the in the MySQL config file.
232
+ * :config_local_infile - If provided, sets the Mysql::OPT_LOCAL_INFILE option on the connection with the given value.
233
+ * :encoding - Specify the encoding/character set to use for the connection.
234
+ * :socket - Can be used to specify a Unix socket file to connect to instead of a TCP host and port.
235
+ * :timeout - Sets the wait_timeout for the connection, defaults to 1 month.
236
+
237
+ === odbc
238
+
239
+ The ODBC adapter allows you to connect to any database with the appropriate ODBC drivers installed.
240
+ The :database option given ODBC database should be the DSN (Descriptive Service Name) from the ODBC configuration.
241
+
242
+ Sequel.odbc('mydb', :user => "user", :password => "password")
243
+
244
+ The :host and :port options are not respected. The following additional options are supported:
245
+
246
+ * :db_type - Can be specified as 'mssql' or 'progress' to use SQL syntax specific to those databases.
247
+ * :driver - The name of the ODBC driver to utilize.
248
+
249
+ === openbase
250
+
251
+ The :port option is ignored.
252
+
253
+ === oracle
254
+
255
+ Requires: oci8
256
+
257
+ The following additional options are supported:
258
+
259
+ * :privilege - The Oracle privilege level.
260
+
261
+ === postgres
262
+
263
+ Requires: pg (or postgres if pg is not available)
264
+
265
+ The Sequel postgres adapter works with the pg, postgres, and postgres-pr ruby libraries.
266
+ The pg library is the best supported, as it supports real bound variables and prepared statements.
267
+
268
+ The following additional options are supported:
269
+
270
+ * :charset - Same as :encoding, :encoding takes precedence
271
+ * :encoding - Set the client_encoding to the given string
272
+
273
+ === sqlite
274
+
275
+ As SQLite is a file-based database, the :host and :port options are ignored, and
276
+ the :database option should be a path to the file.
277
+
278
+ Examples:
279
+
280
+ # In Memory databases:
281
+ Sequel.sqlite
282
+ Sequel.connect('sqlite:/')
283
+ Sequel.sqlite(':memory:')
284
+
285
+ # Relative Path
286
+ Sequel.sqlite('blog.db')
287
+ Sequel.sqlite('./blog.db')
288
+ Sequel.connect('sqlite://blog.db')
289
+
290
+ # Absolute Path
291
+ Sequel.sqlite('/var/sqlite/blog.db')
292
+ Sequel.connect('sqlite:///var/sqlite/blog.db')
293
+
294
+ The following additional options are supported:
295
+
296
+ * :timeout - the busy timeout to use in milliseconds (default: 5000).
@@ -0,0 +1,104 @@
1
+ = Prepared Statements and Bound Variables
2
+
3
+ Sequel has support for prepared statements and bound variables. No matter which
4
+ database you are using, the Sequel prepared statement/bound variable API remains
5
+ the same. There is native support for prepared statements/bound variables on
6
+ the following databases:
7
+
8
+ * PostgreSQL (using the pg driver, requires type specifiers)
9
+ * MySQL (prepared statements only, as the ruby mysql driver doesn't support
10
+ bound variables)
11
+ * SQLite (a new native prepared statement is used for each call, though)
12
+ * JDBC
13
+
14
+ Support on other databases is emulated via string interpolation.
15
+
16
+ == Placeholders
17
+
18
+ Generally, when using prepared statements (and certainly when using bound
19
+ variables), you need to put placeholders in your SQL to indicate where you
20
+ want your bound arguments to appear. Database support and syntax vary
21
+ significantly for placeholders (e.g. :name, $1, ?). Sequel abstracts all of
22
+ that and allows you to specify placeholders by using the :$name format for
23
+ placeholders, e.g.:
24
+
25
+ ds = DB[:items].filter(:name=>:$n)
26
+
27
+ == Bound Variables
28
+
29
+ Using bound variables for this query is simple:
30
+
31
+ ds.call(:select, :n=>'Jim')
32
+
33
+ This will do the equivalent of selecting records that have the name 'Jim'. It
34
+ returns all records, and can take a block that is passed to Dataset#all.
35
+
36
+ Deleting or returning the first record works similarly:
37
+
38
+ ds.call(:first, :n=>'Jim') # First record with name 'Jim'
39
+ ds.call(:delete, :n=>'Jim') # Delete records with name 'Jim'
40
+
41
+ For inserting/updating records, you should also specify a value hash, which
42
+ may itself contain placeholders:
43
+
44
+ # Insert record with 'Jim', note that the previous filter is ignored
45
+ ds.call(:insert, {:n=>'Jim'}, :name=>:$n)
46
+ # Change name to 'Bob' for all records with name of 'Jim'
47
+ ds.call(:update, {:n=>'Jim', :new_n=>'Bob'}, :name=>$:new_n)
48
+
49
+ == Prepared Statements
50
+
51
+ Prepared statement support is similar to bound variable support, but you
52
+ use Dataset#prepare with a name, and Dataset#call or Database#call later with the values:
53
+
54
+ ds = DB[:items].filter(:name=>:$n)
55
+ ps = ds.prepare(:select, :select_by_name)
56
+ ps.call(:n=>'Jim')
57
+ DB.call(:select_by_name, :n=>'Jim') # same as above
58
+
59
+ The Dataset#prepare method returns a prepared statement, and also stores a
60
+ copy of the prepared statement in the database for later use. For insert
61
+ and update queries, the hash to insert/update is passed to prepare:
62
+
63
+ ps1 = DB[:items].prepare(:insert, :insert_with_name, :name=>:$n)
64
+ ps1.call(:n=>'Jim')
65
+ DB.call(:insert_with_name, :n=>'Jim') # same as above
66
+ ds = DB[:items].filter(:name=>:$n)
67
+ ps2 = ds.prepare(:update, :update_name, :name=>:$new_n)
68
+ ps2.call(:n=>'Jim', :new_n=>'Bob')
69
+ DB.call(:update_name, :n=>'Jim', :new_n=>'Bob') # same as above
70
+
71
+ == Database support
72
+
73
+ === PostgreSQL
74
+
75
+ If you are using the ruby-postgres or postgres-pr driver, PostgreSQL uses the
76
+ default emulated support. If you are using ruby-pg, there is native support,
77
+ but it requires type specifiers most of the time. This is easy if you have
78
+ direct control over the SQL string, but since Sequel abstracts that, the types
79
+ have to be specified another way. This is done by adding a __* suffix to the
80
+ placeholder symbol (e.g. :$name__text, which will be compiled to "$1::text"
81
+ in the SQL). Prepared statements are always server side.
82
+
83
+ === SQLite
84
+
85
+ SQLite supports bound variables and prepared statements exactly the same, since
86
+ a new native prepared statement is created and executed for each call.
87
+
88
+ === MySQL
89
+
90
+ The MySQL ruby driver does not support bound variables, so the the bound
91
+ variable methods fall back to string interpolation. It uses server side
92
+ prepared statements.
93
+
94
+ === JDBC
95
+
96
+ JDBC supports both prepared statements and bound variables. Whether these
97
+ are server side or client side depends on the JDBC driver. For PostgreSQL
98
+ over JDBC, you can add the prepareThreshold=N parameter to the connection
99
+ string, which will use a server side prepared statement after N calls to
100
+ the prepared statement.
101
+
102
+ === All Others
103
+
104
+ Support is emulated using interpolation.
@@ -0,0 +1,84 @@
1
+ = Reflection
2
+
3
+ Sequel supports reflection information in multiple ways.
4
+
5
+ == Adapter in Use
6
+
7
+ You can get the adapter in use using Database.adapter_scheme. As this is a class method, you generally need to do DB.class.adapter_scheme:
8
+
9
+ DB.class.adapter_scheme # e.g. :postgres, :jdbc, :odbc
10
+
11
+ == Database Connected To
12
+
13
+ In some cases, the adapter scheme will be the same as the database to which you are connecting. However, many adapters support multiple databases. You can use the Database#database_type method to get the type of database to which you are connecting:
14
+
15
+ DB.database_type # :postgres, :h2, :mssql
16
+
17
+ == Tables in the Database
18
+
19
+ On many database types/adapters, Database#tables exists and gives an array of table name symbols:
20
+
21
+ DB.tables # [:table1, :table2, :table3, ...]
22
+
23
+ == Indexes on a table
24
+
25
+ On a few database types/adapters, Database#indexes takes a table name gives a hash of index information. Keys are index names, values are subhashes with the keys :columns and :unique :
26
+
27
+ DB.indexes(:table1) # {:index1=>{:columns=>[:column1], :unique=>false}, :index2=>{:columns=>[:column2, :column3], :unique=>true}}
28
+
29
+ Index information generally does not include partial indexes, functional indexes, or indexes on the primary key of the table.
30
+
31
+ == Column Information for a Table
32
+
33
+ Database#schema takes a table symbol and returns column information in an array with each element being an array with two elements. The first elements of the subarray is a column symbol, and the second element is a hash of information about that column. The hash should include the following keys:
34
+
35
+ * :allow_null - Whether NULL/nil is an allowed value for this column. Used by the Sequel::Model typecasting code.
36
+ * :db_type - The type of column the database provided, as a string. Used by the schema_dumper plugin for a more specific type translation.
37
+ * :default - The default value of the column, as either a string or nil. Uses a database specific format. Used by the schema_dumper plugin for converting to a ruby value.
38
+ * :primary_key - Whether this column is one of the primary key columns for the table. Used by the Sequel::Model code to determine primary key columns.
39
+ * :ruby_default - The default value of the column as a ruby object, or nil if there is no default or the default could not be successfully parsed into a ruby object.
40
+ * :type - The type of column, as a symbol (e.g. :string). Used by the Sequel::Model typecasting code.
41
+
42
+ Example:
43
+
44
+ DB.schema(:table) # [[:column1, {:allow_null=>true, :db_type=>'varchar(255)', :default=>'blah', :primary_key=>false, :type=>:string}], ...]
45
+
46
+ == Column Information for a Model
47
+
48
+ Model#db_schema returns pretty much the same information, except it returns it as a hash with column keys instead of an array of two element arrays.
49
+
50
+ Model.db_schema # {:column1=>{:allow_null=>true, :db_type=>'varchar(255)', :default=>'blah', :primary_key=>false, :type=>:string}, ...}
51
+
52
+ == Columns used by a dataset/model
53
+
54
+ Dataset#columns returns the columns of the current dataset as an array of symbols:
55
+
56
+ DB[:table].columns # [:column1, :column2, :column3, ...]
57
+
58
+ Dataset#columns! does the same thing, except it ignores any cached value. In general, the cached value should never be incorrect, unless the database schema is changed after the dataset is created.
59
+
60
+ DB[:table].columns! # [:column1, :column2, :column3, ...]
61
+
62
+ Model.columns does the same thing as Dataset#columns, using the model's dataset:
63
+
64
+ Model.columns # [:column1, :column2, :column3, ...]
65
+
66
+ == Associations Defined
67
+
68
+ Sequel::Model offers complete introspection capability for all associations.
69
+
70
+ You can get an array of association symbols with Model.associations:
71
+
72
+ Model.associations # [:association1, :association2, ...]
73
+
74
+ You can get the association reflection for a single association via the Model.association_reflection. Association reflections are subclasses of hash, for ease of use and introspection (and backwards compatibility):
75
+
76
+ Model.association_reflection(:association1) # {:name=>:association1, :type=>:many_to_one, :model=>Model, :associated_class=>OtherModel, ...}
77
+
78
+ You can get an array of all association reflections via Model.all_association_reflections:
79
+
80
+ Model.all_association_reflections # [{:name=>:association1, :type=>:many_to_one, :model=>Model, :associated_class=>OtherModel, ...}, ...]
81
+
82
+ Finally, you can get a hash of association reflections via Model.association_reflections:
83
+
84
+ Model.association_reflections # {:association1=>{:name=>:association1, :type=>:many_to_one, :model=>Model, :associated_class=>OtherModel, ...}, ...}