<?xml version="1.0" encoding="UTF-8"?>
<commits type="array">
  <commit>
    <parents type="array">
      <parent>
        <id>5712d2a9fa7fc93bd5c31ba1a81b59ebcd76f4ec</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/85261d24d7ecd20a4eb35bc7d2495978cd82884c</url>
    <id>85261d24d7ecd20a4eb35bc7d2495978cd82884c</id>
    <committed-date>2009-12-21T12:56:14-08:00</committed-date>
    <authored-date>2009-12-21T12:56:14-08:00</authored-date>
    <message>Fix handling of non-existent server in single-threaded connection pool

This was already working in the threaded connection pool, but it
wasn't handled correctly in the single threaded connection pool.
Add a spec for correct behavior to both pools.</message>
    <tree>6c10c969f1b7d7debd03173fb94403df1359a211</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>61adab628272a16494ed03f8302c6d4b2a17ad12</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/5712d2a9fa7fc93bd5c31ba1a81b59ebcd76f4ec</url>
    <id>5712d2a9fa7fc93bd5c31ba1a81b59ebcd76f4ec</id>
    <committed-date>2009-12-21T04:11:09-08:00</committed-date>
    <authored-date>2009-12-21T04:11:09-08:00</authored-date>
    <message>Default to using mysqlplus driver in the native mysql adapter, fall back to mysql driver

mysqlplus is significantly better than the standard mysql driver in
threaded environments, as it does not block the entire interpreter
while waiting for query results.</message>
    <tree>c67e4feb5e64ce911a64f2392b23fc3e1fc8dbec</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>83d375bfbe73c38367a2b0b6f7f450f7250331f5</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/4ab719f437c7bb94ce16638d99b41e04144d4906</url>
    <id>4ab719f437c7bb94ce16638d99b41e04144d4906</id>
    <committed-date>2009-12-20T15:58:19-08:00</committed-date>
    <authored-date>2009-12-20T15:58:19-08:00</authored-date>
    <message>Handle 64-bit integers in JDBC prepared statements</message>
    <tree>be46b652a6e674c39866adb78e05872a05865242</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>5d1b2168def5c4f12ceb61c6d75888d557126b38</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/83d375bfbe73c38367a2b0b6f7f450f7250331f5</url>
    <id>83d375bfbe73c38367a2b0b6f7f450f7250331f5</id>
    <committed-date>2009-12-19T15:47:01-08:00</committed-date>
    <authored-date>2009-12-19T15:47:01-08:00</authored-date>
    <message>Return blobs as Sequel::SQL::Blob when using H2</message>
    <tree>b2956144a16ef8e95d73ccca06ebf5799309cab6</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>761af43673e2739a0697d6ccb6b801a9f9556eb0</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/5d1b2168def5c4f12ceb61c6d75888d557126b38</url>
    <id>5d1b2168def5c4f12ceb61c6d75888d557126b38</id>
    <committed-date>2009-12-17T11:10:58-08:00</committed-date>
    <authored-date>2009-12-17T11:10:58-08:00</authored-date>
    <message>Fix typo in Model.associate RDoc</message>
    <tree>030c278723a44dbaaccb2b4203e3c06f72f08f11</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>43e862c56b70146ee97635fc5f66a7ad57423925</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/adf6a891a52f28a7012d8534799ce8fab1c24aaf</url>
    <id>adf6a891a52f28a7012d8534799ce8fab1c24aaf</id>
    <committed-date>2009-12-13T18:58:04-08:00</committed-date>
    <authored-date>2009-12-13T15:43:02-08:00</authored-date>
    <message>Add #each_server to Database and Dataset, for running operations on all shards

Sequel has supported sharding for a long time (since 2.4.0), but it
hasn't had built in support for updating all shards at once until
now.  Database#each_server and Dataset#each_server are designed to
fill those needs.

Database#each_server yields a new Database object for each server,
and is intended for use when you want to run schema modification
(DDL) queries, or other custom SQL against all shards.

Dataset#each_server yields copies of the current dataset, each
of which is tied to a separate server in the connection pool.
It's intended for when you want to select/insert/update/delete
from all shards.

To implement this, ConnectionPool#servers and Database#servers
methods were added.</message>
    <tree>43f0d6918943c5d0ef65705fa27d4cb8f521fdcd</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>4f3029fc55c010c0556770f8586ffd47f946a676</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/43e862c56b70146ee97635fc5f66a7ad57423925</url>
    <id>43e862c56b70146ee97635fc5f66a7ad57423925</id>
    <committed-date>2009-12-10T11:40:39-08:00</committed-date>
    <authored-date>2009-12-10T11:32:03-08:00</authored-date>
    <message>Remove the irregular ox-&gt;oxen pluralization, it screws up box-&gt;boxes

I didn't want to touch the default inflections again, but as box is
much more common than ox, I think this is best removed.</message>
    <tree>2b74cb923fddd1bdf244a9296dd95211ca396af1</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>014c92d9efd9da6f473179452a2c15571c1167ac</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/4f3029fc55c010c0556770f8586ffd47f946a676</url>
    <id>4f3029fc55c010c0556770f8586ffd47f946a676</id>
    <committed-date>2009-12-10T11:31:31-08:00</committed-date>
    <authored-date>2009-12-10T11:31:31-08:00</authored-date>
    <message>Remove meta_eval and metaclass private methods from Sequel::Metaprogramming

If you want this, require 'metaid'.  Sequel only uses meta_def, both
in the lib and in the specs.  meta_def can be implemented without
meta_eval, and metaclass is small enough to inline into meta_def.</message>
    <tree>1a5e79d8560dbff13a8080d287906b2c7cf34bd4</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>0b7f5ea21d9f99082e75057ac636080da27a0766</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/014c92d9efd9da6f473179452a2c15571c1167ac</url>
    <id>014c92d9efd9da6f473179452a2c15571c1167ac</id>
    <committed-date>2009-12-10T11:30:57-08:00</committed-date>
    <authored-date>2009-12-10T11:30:57-08:00</authored-date>
    <message>Add RDoc for select_(hash|map|order_map)</message>
    <tree>15ca3a45012d4c66640801b404acca5c2f6f9d61</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>aeaa18813855b749309dd7d478f097d6534fbff2</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/0b7f5ea21d9f99082e75057ac636080da27a0766</url>
    <id>0b7f5ea21d9f99082e75057ac636080da27a0766</id>
    <committed-date>2009-12-10T11:30:43-08:00</committed-date>
    <authored-date>2009-12-10T11:30:43-08:00</authored-date>
    <message>Slightly better implementation for Dataset#each</message>
    <tree>f95084e5ccbbf0c2b8b4712926fedb4f68aadb2b</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>73e3f1fa014d8484a4494a6d326eaf9efeb76b72</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/aeaa18813855b749309dd7d478f097d6534fbff2</url>
    <id>aeaa18813855b749309dd7d478f097d6534fbff2</id>
    <committed-date>2009-12-10T11:30:00-08:00</committed-date>
    <authored-date>2009-12-10T11:30:00-08:00</authored-date>
    <message>Merge Dataset::FROM_SELF_KEEP_OPTS into Dataset::NON_SQL_OPTIONS

While used in different places, these were used pretty much for the
same things, and in both cases where one was used, the values from
the other should have been taken into account.  Breaks backwards
compatibility slightly, but it's unlikely anyone is using it.</message>
    <tree>6315c44901e1b8a2212f0764ef2a5664375c994a</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>27718c33269e94329b7c21cd236bd01c97628602</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/73e3f1fa014d8484a4494a6d326eaf9efeb76b72</url>
    <id>73e3f1fa014d8484a4494a6d326eaf9efeb76b72</id>
    <committed-date>2009-12-10T11:29:28-08:00</committed-date>
    <authored-date>2009-12-10T11:29:28-08:00</authored-date>
    <message>Minor doc and whitespace fixes</message>
    <tree>5ee0d42b32de96d773dee77583f9c675a9751078</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>0055b64b2f33048b268c2c1741724c2e4dbdc342</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/27718c33269e94329b7c21cd236bd01c97628602</url>
    <id>27718c33269e94329b7c21cd236bd01c97628602</id>
    <committed-date>2009-12-10T08:27:27-08:00</committed-date>
    <authored-date>2009-12-10T08:27:27-08:00</authored-date>
    <message>Allow removing servers/shards from a database and connection pool, and schedule disconnection of allocated connections

There are two main changes in this commit.  The first is the
scheduling of disconnection for currently allocated connections.
Previously, Database#disconnect would only disconnect available
connections, with no affect on currently allocated connections.
This commit changes that so that disconnect schedules currently
allocated connections to be disconnected as soon as they are
returned to the connection pool.

The second part is remove_servers, which removes existing shards
from the connection pool and database.  This is basically the same
as disconnecting, except that future attempts to acccess the server
will use the :default server instead.

Another small change is that #disconnect now accepts an option
hash and respects a :server option that can be a symbol or array
of symbols specifying server/shard names.  If used, only those
servers/shards will be disconnected.

The internals of the connection pool did change somewhat.  @servers
is now a hash which maps nonexistent server names to :default.
@allocated and @available_connections hashes no longer have default
procs.  Instead, when pool.hold is called, @servers is used to
transform the server name before anything else is done.

A consequence of this is that allocated and available_connections
return nil instead of an array or hash if they are called with a
nonexistent server.  This could be changed back, but I think the
current behavior is better.  created_count/size still does the
translation, though.

ConnectionPool#sync private method is added to cut down on some
code duplication.  ConnectionPool#remove no longer uses the mutex
internally, so callers need to have the mutex before calling it.
ConnectionPool#release now takes 3 arguments instead of 2.

While here, beef up the documentation for some of the private
methods.</message>
    <tree>4877046a910bc79c4dc0777fbecd6340442698b1</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>ccf9b601ccc81a142417462c0d3f463026115a1f</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/a536e76b8356dc9ae8da8bcfe5adbe72bfa7f7c3</url>
    <id>a536e76b8356dc9ae8da8bcfe5adbe72bfa7f7c3</id>
    <committed-date>2009-12-09T06:31:57-08:00</committed-date>
    <authored-date>2009-12-09T06:31:57-08:00</authored-date>
    <message>Handle multiple statements in a single query in the native MySQL adapter in all cases, not just when selecting via Dataset#each

Before, if you used Database#run or another method to run queries,
using multiple statements would cause a commands out of sync error.
This contains changes to always check for multiple statement result
sets when executing queries.

Note that the native MySQL adapter is one of the few (maybe the
only) adapters that supports sending multiple statements in a single
query, and using the feature is not encouraged.</message>
    <tree>fcbdc023541a0070d92269e3edd998e644879b8a</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>7f1dff4fcd786a1a98bf4a02dfd5a8599bb7ad45</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/ccf9b601ccc81a142417462c0d3f463026115a1f</url>
    <id>ccf9b601ccc81a142417462c0d3f463026115a1f</id>
    <committed-date>2009-12-06T15:10:34-08:00</committed-date>
    <authored-date>2009-12-06T15:10:34-08:00</authored-date>
    <message>Add Model.check_non_connection_error private method to reduce some code duplication</message>
    <tree>5cc70c39ee454ca371367405026b855c6d65f2ac</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>3726d19a1150b677945cc4cb991e6363b55f2da5</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/7f1dff4fcd786a1a98bf4a02dfd5a8599bb7ad45</url>
    <id>7f1dff4fcd786a1a98bf4a02dfd5a8599bb7ad45</id>
    <committed-date>2009-12-06T15:04:39-08:00</committed-date>
    <authored-date>2009-12-06T15:04:39-08:00</authored-date>
    <message>Minor fix to boolean readers plugin to handle columns that are not in the db_schema</message>
    <tree>153a830b05ddbf962a351f10a7a02cb891fba8b2</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>d149f1f87735d8e972ce2adba836c5644e84dc5a</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/3726d19a1150b677945cc4cb991e6363b55f2da5</url>
    <id>3726d19a1150b677945cc4cb991e6363b55f2da5</id>
    <committed-date>2009-12-06T14:56:51-08:00</committed-date>
    <authored-date>2009-12-06T14:56:51-08:00</authored-date>
    <message>In the boolean_readers plugin, don't raise an error if the model's columns can't be determined</message>
    <tree>26dbea3b107a4fbb8360ee5753b148361acd3236</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>a0a6d62011d36e7fbf8cb1c87a906ccb44221685</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/d149f1f87735d8e972ce2adba836c5644e84dc5a</url>
    <id>d149f1f87735d8e972ce2adba836c5644e84dc5a</id>
    <committed-date>2009-12-03T22:36:08-08:00</committed-date>
    <authored-date>2009-12-03T22:36:08-08:00</authored-date>
    <message>In the identity_map plugin, remove instances from the cache if they are deleted/destroyed</message>
    <tree>e90bee0f9e461e2b9bcd2570e1e569bd9cfc6da9</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>4d1f02bae79c818fee2598205d34439ad66ece8b</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/a0a6d62011d36e7fbf8cb1c87a906ccb44221685</url>
    <id>a0a6d62011d36e7fbf8cb1c87a906ccb44221685</id>
    <committed-date>2009-12-03T22:17:17-08:00</committed-date>
    <authored-date>2009-12-03T22:17:17-08:00</authored-date>
    <message>Minor modifications to chuckremes's Database#add_servers commit, with rewritten specs

I think Database#add_servers should only take a servers hash, not a
general options hash that must require a :servers key.

I rewrote the specs to better test what the actual results would be,
without unnecessary mocking.</message>
    <tree>72920533fede6b6ba19550dd5ebd8da4396f5bab</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>9a8b5cfe4baa0bf8ba7cccbda4de44fe3c43903c</id>
      </parent>
    </parents>
    <author>
      <name>Charles Remes</name>
      <email>cremes@charles-remess-mac-pro.local</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/904039d8c29ed1f69a76d1c969873290dd8a7016</url>
    <id>904039d8c29ed1f69a76d1c969873290dd8a7016</id>
    <committed-date>2009-12-03T09:13:35-08:00</committed-date>
    <authored-date>2009-12-03T09:13:35-08:00</authored-date>
    <message>Added Database#add_servers to allow for runtime addition of shards</message>
    <tree>3305df4682adc5b84cb60fe131e2c6919c1d5685</tree>
    <committer>
      <name>Charles Remes</name>
      <email>cremes@charles-remess-mac-pro.local</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>c2198d0d296285caca2730cea990484c1a8436b2</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/9a8b5cfe4baa0bf8ba7cccbda4de44fe3c43903c</url>
    <id>9a8b5cfe4baa0bf8ba7cccbda4de44fe3c43903c</id>
    <committed-date>2009-12-01T08:14:41-08:00</committed-date>
    <authored-date>2009-12-01T08:14:41-08:00</authored-date>
    <message>Bump version to 3.7.0</message>
    <tree>32308be47a7f622bb52f2063151d8697a7d9d52d</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>bf06ca4d33a7a166a3d140f67414256ce8515be7</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/c2198d0d296285caca2730cea990484c1a8436b2</url>
    <id>c2198d0d296285caca2730cea990484c1a8436b2</id>
    <committed-date>2009-11-30T11:26:05-08:00</committed-date>
    <authored-date>2009-11-30T11:26:05-08:00</authored-date>
    <message>Add Dataset#sequence to the shared Oracle Adapter, for returning autogenerated primary key values on insert (Fixes #280)

Oracle is like PostgreSQL in that autogenerated primary key values
are handled by sequences.  Unlike Sequel's shared PostgreSQL adapter,
Sequel's shared Oracle adapter doesn't handle automatically
determining the primary key value based on the table.  That may be
possible to fix, but without access to an Oracle database it would
be difficult.

Dataset#sequence provides a workaround for the problem, allowing the
manual specification of the sequence. Dataset#insert is then
overridden to check for an associated sequence, and return the most
recently inserted value upon insert.</message>
    <tree>fb16739148458da1cb9fab960a53a12644cd7b5b</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>883aebd03e965c65e56b73320c33d5a340ca482f</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/bf06ca4d33a7a166a3d140f67414256ce8515be7</url>
    <id>bf06ca4d33a7a166a3d140f67414256ce8515be7</id>
    <committed-date>2009-11-30T11:12:54-08:00</committed-date>
    <authored-date>2009-11-30T11:12:54-08:00</authored-date>
    <message>Fix code example in Sequel::MySQL module RDoc</message>
    <tree>674fc897972422ad70efa67b77a34304cc191d1b</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>77c04837744a9b06e4261dc5bfd3971357020ca8</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/883aebd03e965c65e56b73320c33d5a340ca482f</url>
    <id>883aebd03e965c65e56b73320c33d5a340ca482f</id>
    <committed-date>2009-11-23T08:05:47-08:00</committed-date>
    <authored-date>2009-11-23T08:05:47-08:00</authored-date>
    <message>Fix deleting from joined datasets on MySQL

While here, no longer include joins in delete_from_sql by default.
Since all of the adapters that support modifying joins override it,
there's no reason to include it.

Also, remove the order on the joined dataset in the integration
test so that updating works on MySQL (which allows order clauses
in update statements, but not when multiple tables are used).

Note that MySQL allows deleting from multiple tables at once, but
Sequel doesn't support this.  Sequel assumes the first table in
FROM is the one being deleted from, and the rest are just for
selecting rows.  This is for consistency with how Sequel works on
PostgreSQL and MSSQL.</message>
    <tree>8a1634df79b5599c28c940e6900a3f364eb9b7e8</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>edbfbb78018f62a14400f562024ef03c389a2cd4</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/a71d39d91b743870a317083d7b0c6a49bb72f3da</url>
    <id>a71d39d91b743870a317083d7b0c6a49bb72f3da</id>
    <committed-date>2009-11-20T21:16:17-08:00</committed-date>
    <authored-date>2009-11-20T21:16:17-08:00</authored-date>
    <message>Bring support for modifying joined datasets into Sequel proper, supported on MySQL and PostgreSQL

Previously, the MSSQL adapter had specific support for deleting and
updating joined datasets.  This commit brings support into standard
Sequel, and supports it on MySQL and PostgreSQL. Note that support
and semantics for updating joined datasets varies by database.

This also contains changes to the MSSQL support as well, which should
work better for datasets with multiple FROM tables.

To ease implementation, add a Dataset#joined_dataset? private method.</message>
    <tree>f14196cc5e8f70c9fd328fc2ba93d178f3a99a2b</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>1670de32266726e9ef22629e97599788ffcb5388</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/edbfbb78018f62a14400f562024ef03c389a2cd4</url>
    <id>edbfbb78018f62a14400f562024ef03c389a2cd4</id>
    <committed-date>2009-11-20T19:20:35-08:00</committed-date>
    <authored-date>2009-11-20T19:20:35-08:00</authored-date>
    <message>No longer use native autoreconnection in the mysql adapter

Native autoreconnection has problems with prepared statements, where
a new native connection is used behind Sequel's back, so Sequel
thinks the prepared statement has already been defined on the
connection, when it fact it hasn't.  Any other changes that affect
the state of the connection will be lost when native autoreconnection
is used as well.

Sequel's connection pool already handles reconnection if it detects a
disconnection.  This commit also adds an additional exception message
to recognize as a disconnect.</message>
    <tree>7aceba43d54219e440ddfd71335800e05b5b40e2</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>ee3445294f5a83fdc02d5f03129eac839fdc74d2</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/1670de32266726e9ef22629e97599788ffcb5388</url>
    <id>1670de32266726e9ef22629e97599788ffcb5388</id>
    <committed-date>2009-11-20T16:48:48-08:00</committed-date>
    <authored-date>2009-11-20T16:48:48-08:00</authored-date>
    <message>Add NULL, NOTNULL, TRUE, SQLTRUE, FALSE, and SQLFALSE constants

The main advantage here for most people is NOTNULL.  This allows the
following to work:

  include Sequel::SQL::Constants
  DB[:table].where(:a=&gt;'1', :b=&gt;NOTNULL)

Before, the shortest way to do this was:

  DB[:table].where(:a=&gt;'1').exclude(:b=&gt;nil)

It may make the code more descriptive:

  DB[:table].where(:b=&gt;NULL)
  # compared to
  DB[:table].where(:b=&gt;nil)

This gives the option to use SQL terminology instead of ruby
terminology.

The other advantage of using the constants it that they handle
operators and methods like other Sequel::SQL objects:

  NULL &amp; SQLFALSE # BooleanExpression =&gt; &quot;(NULL AND FALSE)&quot;
  nil &amp; false     # false

  NULL + :a       # NumericExpression =&gt; &quot;(NULL + a)&quot;
  nil + :a        # raises NoMethodError
  NULL.sql_string + :a  # StringExpression =&gt; &quot;(NULL || a)&quot;
  NULL.as(:b)     # AliasedExpression =&gt; &quot;NULL AS b&quot;

For complex systems that want to represent SQL boolean objects
in ruby (where you don't know exactly how they'll be used), using
the constants is recommended.

In order not to be too verbose, including Sequel::SQL::Constants
is recommended.  It's not done by default, but you can still
reference the constants under the main Sequel module by default
(e.g. Sequel::NULL).</message>
    <tree>4b51284a6d42d7e7b958bdd993198b5f50a74777</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>917dc3cde17df89cf8efb132751a293d334c4459</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/ee3445294f5a83fdc02d5f03129eac839fdc74d2</url>
    <id>ee3445294f5a83fdc02d5f03129eac839fdc74d2</id>
    <committed-date>2009-11-20T15:14:42-08:00</committed-date>
    <authored-date>2009-11-20T15:14:42-08:00</authored-date>
    <message>Add Dataset #select_map, #select_order_map, and #select_hash

select_map and select_order_map both return arrays of values for the
column specified.  The column can be specified either via an argument
or a block, similar to Dataset#get.  Both accept any valid objects as
arguments.

select_hash returns a hash.  It requires two symbol arguments, but
can handle implicit qualifiers or aliases in the symbols.

Neither of these methods offer any new functionality, they just cut
down on the number of required key strokes:

  select_map(:column)       # select(:column).map(:column)
  select_order_map(:column) # select(:column).order(:column).
                            #  map(:column)
  select_hash(:key_column, :value_column)
  # select(:key_column, :value_column).
  #  to_hash(:key_column, :value_column)

This makes it easier to get simple ruby arrays and hashes out of
datasets.

To implement select_hash, add private method Dataset#hash_key_symbol,
which attempts to guess the hash key symbol that will be used for
the given column symbol.

While here, remove Dataset::GET_ERROR_MSG and Dataset::MAP_ERROR_MSG
constants, replacing both with Dataset::ARG_BLOCK_ERROR_MSG.</message>
    <tree>86d4c64e6ff6d2ad9d869dfac3cbb9fab5201919</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>a52365582a3eeb679fc96336b42421d0c165554e</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/f439fc1e6609836dff7191d4938f21968ef5f649</url>
    <id>f439fc1e6609836dff7191d4938f21968ef5f649</id>
    <committed-date>2009-11-20T14:08:57-08:00</committed-date>
    <authored-date>2009-11-20T14:08:57-08:00</authored-date>
    <message>Make Dataset#group_and_count handle arguments other than Symbols

I think with a past change to handle implicit aliases in Symbol
arguments, it no longer worked with other objects, as it assumed
all arguments were Symbols.  That is not a valid assumption.

Introduce Dataset#unaliased_identifier private method that
handles both implicit aliases in symbols and AliasedExpression
objects, returning the unaliased argument, and have group_and_count
use it.</message>
    <tree>4eb1b791ac7f5e24671bf3e3c12f81e995d3d4a5</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>ae8ed72eb03aa221565d2bd687f1213a8587b5bc</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/a52365582a3eeb679fc96336b42421d0c165554e</url>
    <id>a52365582a3eeb679fc96336b42421d0c165554e</id>
    <committed-date>2009-11-20T13:42:12-08:00</committed-date>
    <authored-date>2009-11-20T13:42:12-08:00</authored-date>
    <message>Add :only_if_modified option to validates_unique method in validation_helpers plugin

Using this option should speed up the common case where the unique
attribute is not modified for an existing record.  It is not on by
default, since the following is possible:

  album = Album[1]
  album.name # 'YJM'
  # Database is modified outside application:
  #   UPDATE albums SET name ='BB' WHERE id = 1
  #   UPDATE albums SET name = 'YJM' WHERE id = 2

  # Would violate uniqueness constraint by setting album 1's
  # name back to 'YJM'
  album.save</message>
    <tree>2830fc5711bb8bb5bf1fd988e04c8cb14329f10e</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>13d2a4a2a6a6bbc920d2b6289f60d8dd07311ef9</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/ae8ed72eb03aa221565d2bd687f1213a8587b5bc</url>
    <id>ae8ed72eb03aa221565d2bd687f1213a8587b5bc</id>
    <committed-date>2009-11-19T10:40:31-08:00</committed-date>
    <authored-date>2009-11-19T10:40:31-08:00</authored-date>
    <message>Allow specifying dataset alias via :alias option when using union/intersect/except</message>
    <tree>200475b96e0f055b30af321f45637614a86c4f20</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>f333791c675ff3ce5b5f7c251193bb82ad6d6dd2</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/13d2a4a2a6a6bbc920d2b6289f60d8dd07311ef9</url>
    <id>13d2a4a2a6a6bbc920d2b6289f60d8dd07311ef9</id>
    <committed-date>2009-11-17T18:10:18-08:00</committed-date>
    <authored-date>2009-11-17T18:02:00-08:00</authored-date>
    <message>In Model#save and destroy, don't rollback transactions you didn't initiate

This fixes the issue where an outer transaction is present, and
use_transactions is set for the model instance, and one of the
before hooks returns false.  With the recent commits, that would
rollback the outer transaction.

This required refactoring so that save_failure now always raises,
it doesn't check raise_on_save_failure.  Model#save and destroy
now use checked_save_failure, which ignore the error raised by
save_failure if raise_on_save_failure is true.

While refactoring, I decided it was no longer worth using
save_failure to handle validation failures, so the validation
failures don't call it.  before_validation hook callers only call
it if raise_on_save_failure is true, since they aren't wrapped
by check_save_failure.

This breaks backwards compatibility for callers of save_failure,
which is a private method.

While here, add checked_transaction private method that uses
transactions if necessary.</message>
    <tree>3c14d2c1a5a162c1da1b7421290d7debc62f04dc</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>b6323102a5d3b7424ae095f9311ac334438e18e3</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/f333791c675ff3ce5b5f7c251193bb82ad6d6dd2</url>
    <id>f333791c675ff3ce5b5f7c251193bb82ad6d6dd2</id>
    <committed-date>2009-11-17T16:16:54-08:00</committed-date>
    <authored-date>2009-11-17T16:16:54-08:00</authored-date>
    <message>Fix and add some RDoc for the Sequel::MySQL module</message>
    <tree>8951666f7f924c7b0065c0c5cd98f8aeeca2c3cc</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>c89a4e47a22d7741745b625d2f0488c9d3d8755e</id>
      </parent>
    </parents>
    <author>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/b6323102a5d3b7424ae095f9311ac334438e18e3</url>
    <id>b6323102a5d3b7424ae095f9311ac334438e18e3</id>
    <committed-date>2009-11-17T11:21:48-08:00</committed-date>
    <authored-date>2009-11-17T11:21:48-08:00</authored-date>
    <message>Some minor cleanup to previous commit

Instead of making use_transactions a special instance method, keep
it as previously defined and add a use_transaction? private method
that takes an option hash.  I think this is a bit cleaner.

Also, make a few minor changes to the specs and update the
CHANGELOG.</message>
    <tree>f3cff6a5b7cf33d3dccbaf9fbee271711cee3922</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
  <commit>
    <parents type="array">
      <parent>
        <id>3d364a6b9186ca2fbac3b74e139679bb24e8eeb0</id>
      </parent>
    </parents>
    <author>
      <name>John Firebaugh</name>
      <email>john_firebaugh@bigfix.com</email>
    </author>
    <url>http://github.com/jeremyevans/sequel/commit/c89a4e47a22d7741745b625d2f0488c9d3d8755e</url>
    <id>c89a4e47a22d7741745b625d2f0488c9d3d8755e</id>
    <committed-date>2009-11-17T10:41:30-08:00</committed-date>
    <authored-date>2009-11-17T09:28:11-08:00</authored-date>
    <message>Ensure transactions around save and destroy are rolled back when a before hook returns false

Three cases:

1) raise_on_save_failure true: Existing behavior was correct;
save_failure raises an exception that rolls back the transaction
and is reraised.
2) raise_on_save_failure false and use_transaction true: save_failure
raises Rollback, which the transaction code will take care of.
3) raise_on_save_failure false and use_transaction false: should just
return false, as raising Rollback and catching it makes it impossible
to differentiate between the a before hook returning false and a user
raising Rollback in a before hook (which they expect to bubble up to
their own transaction code).

While here, support the :transaction option in destroy</message>
    <tree>04fd6678457564dab50941ff207eb1a4fc9136a2</tree>
    <committer>
      <name>Jeremy Evans</name>
      <email>code@jeremyevans.net</email>
    </committer>
  </commit>
</commits>
