= New Features

* A paged_operations plugin has been added, which adds support for
  paged_datasets, paged_update, and paged_delete dataset methods.
  This methods are designed to be used on large datasets, to split 
  a large query into separate smaller queries, to avoid locking the
  related database table for a long period of time.
  paged_update and paged_delete operate the same as update and delete,
  returning the number of rows updated or deleted. paged_datasets yields
  one or more datasets representing subsets of the receiver, with the
  union of all of those datasets comprising all records in the receiver:

    Album.plugin :paged_operations

    Album.where{name > 'M'}.paged_datasets{|ds| puts ds.sql}
    # Runs: SELECT id FROM albums WHERE (name <= 'M') ORDER BY id LIMIT 1 OFFSET 1000
    # Prints: SELECT * FROM albums WHERE ((name <= 'M') AND ("id" < 1002))
    # Runs: SELECT id FROM albums WHERE ((name <= 'M') AND (id >= 1002)) ORDER BY id LIMIT 1 OFFSET 1000
    # Prints: SELECT * FROM albums WHERE ((name <= 'M') AND ("id" < 2002) AND (id >= 1002))
    # ...
    # Runs: SELECT id FROM albums WHERE ((name <= 'M') AND (id >= 10002)) ORDER BY id LIMIT 1 OFFSET 1000
    # Prints: SELECT * FROM albums WHERE ((name <= 'M') AND (id >= 10002))

    Album.where{name <= 'M'}.paged_update(:updated_at=>Sequel::CURRENT_TIMESTAMP)
    # SELECT id FROM albums WHERE (name <= 'M') ORDER BY id LIMIT 1 OFFSET 1000
    # UPDATE albums SET updated_at = CURRENT_TIMESTAMP WHERE ((name <= 'M') AND ("id" < 1002))
    # SELECT id FROM albums WHERE ((name <= 'M') AND (id >= 1002)) ORDER BY id LIMIT 1 OFFSET 1000
    # UPDATE albums SET updated_at = CURRENT_TIMESTAMP WHERE ((name <= 'M') AND ("id" < 2002) AND (id >= 1002))
    # ...
    # SELECT id FROM albums WHERE ((name <= 'M') AND (id >= 10002)) ORDER BY id LIMIT 1 OFFSET 1000
    # UPDATE albums SET updated_at = CURRENT_TIMESTAMP WHERE ((name <= 'M') AND (id >= 10002))

    Album.where{name > 'M'}.paged_delete
    # SELECT id FROM albums WHERE (name > 'M') ORDER BY id LIMIT 1 OFFSET 1000
    # DELETE FROM albums WHERE ((name > 'M') AND (id < 1002))
    # SELECT id FROM albums WHERE (name > 'M') ORDER BY id LIMIT 1 OFFSET 1000
    # DELETE FROM albums WHERE ((name > 'M') AND (id < 2002))
    # ...
    # SELECT id FROM albums WHERE (name > 'M') ORDER BY id LIMIT 1 OFFSET 1000
    # DELETE FROM albums WHERE (name > 'M')

* A Dataset#transaction :skip_transaction option is now support to
  checkout a connection from the pool without opening a transaction.  This
  makes it easier to handle cases where a transaction may or not be used
  based on configuration/options.  Dataset#import and Dataset#paged_each
  now both support the :skip_transaction option to skip transactions.

* Dataset#full_text_search now supports the to_tsquery: :websearch option
  on PostgreSQL 11+, to use the websearch_to_tsquery database function.

* The Sequel::MassAssignmentRestriction exception now supports model
  and column methods to get provide additional information about the
  exception.  Additionally, the exception message now includes information
  about the model class.

= Other Improvements

* The ibmdb and jdbc/db2 adapter now both handle disconnect errors
  correctly, removing the related connection from the pool.

* Dataset#import no longer uses an explicit transaction if given a dataset
  value, as in that case, only a single query is used.

* The column_encryption plugin no longer uses the base64 library.  The
  base64 library is moving from the standard library to a bundled gem
  in Ruby 3.4, and this avoids having a dependency on it.
