Thanks, Jeremy! Great stuff. I think the row_type and pg_row plugins will
be very useful!
On Wednesday, August 1, 2012 12:40:39 PM UTC-4, Jeremy Evans wrote:
>
> Sequel 3.38.0 has been released and should be available on the gem
> mirrors.
>
> = New Features
>
> * A pg_row extension has been added that supports PostgreSQL's
> row-valued/composite types. You can register support for
> specific row types:
>
> DB.register_row_type(:address)
>
> Then you can create values of that row type:
>
> ad = DB.row_type(:address, ['555 Foo St.', 'Bar City', '98765'])
> # or
> ad = DB.row_type(:address, :street=>'555 Foo St.',
> :city=>'Bar City', :zip=>'98765')
>
> Which you can use in your datasets:
>
> DB[:people].insert(:name=>'Me', :address=>ad)
>
> If you are using the native postgres adapter, when retreiving
> row type values, they will be returned as instances of the row
> type, which are hash-like objects:
>
> ad = DB[:people].get(:address)
> ad[:street] # => '555 Foo St.'
> ad[:city] # => 'Bar City'
> ad[:zip] # => '98765'
>
> If you are also using the pg_array extension, then arrays of
> composite types are supported automatically. Composite
> types can also include arrays of other types as well as other
> composite types, though recursive composite types are not
> allowed by PostgreSQL.
>
> Using arrays and composite types brings one of the benefits
> of document databases to PostgreSQL, allowing you to store
> nested structures inside a single row.
>
> * A pg_row_ops extension has been added that adds DSL support
> for accessing members of row-valued/composite types. You
> first create a row op:
>
> r = Sequel.pg_row_op(:row_column)
>
> Then you can get DSL support for accessing members of that
> row_column via the #[] method:
>
> r[:a] # (row_column).a
>
> This works with composite types containing composite types:
>
> r[:a][:b] # ((row_column).a).b
>
> When used in conjunction with the pg_array_ops extension,
> there is support for composite types that include arrays,
> as well as arrays of composite types:
>
> r[1][:a] # (row_column[1]).a
> r[:a][1] # (row_column).a[1]
>
> The extension offers additional support for referencing
> a table's type when it contains a column with the same
> name, see the RDoc for details.
>
> * A pg_row plugin has been added, that works with the pg_row
> extension, and allows you to represent row-valued types as
> Sequel::Model objects (instead of the hash-like objects
> they use by default). In your model class, you load the
> plugin:
>
> class Address < Sequel::Model(:address)
> plugin :pg_row
> end
>
> Then you can use Address instances in your datasets:
>
> ad = Address.new(:street=>'555 Foo St.',
> :city=>'Bar City', :zip=>'98765')
> DB[:people].insert(:name=>'Me', :address=>ad)
>
> And if you are using the native postgres adapter, the dataset
> will return the type as a model instance:
>
> ad = DB[:people].get(:address)
> ad.street # => '555 Foo St.'
> ad.city # => 'Bar City'
> ad.zip # => '98765'
>
> * A pg_typecast_on_load plugin has been added. This plugin is
> designed for use with the jdbc/postgres, do/postgres, and
> swift/postgres adapters, and it is similar to the
> typecast_on_load plugin. However, while the typecast_on_load
> plugin uses setter methods, the pg_typecast_on_load plugin
> uses the same code that the native postgres adapter uses for
> typecasting.
>
> * The tinytds adapter now supports a :textsize option to override
> the default TEXTSIZE setting. The FreeTDS default is fairly
> small (~64k), so if you want to use large blob or text columns,
> you should probably set this to a value larger than the
> largest text/blob you want to use.
>
> * Sequel.expr when called with a symbol now splits the symbol and
> returns an Identifier, QualifiedIdentifier, or AliasedExpression,
> depending on the content of the symbol. Previously, it only
> wrapped the symbol using a Wrapper.
>
> * Identifier#* and QualifiedIdentifier#* when called without any
> argument now represent a selection of all columns from the
> represented table:
>
> Sequel.expr(:table).* # table.*
> Sequel.expr(:schema__table).* # schema.table.*
>
> This makes it easier to represent the selection of all columns
> in a table without using the core extensions.
>
> * Model#values now has a Model#to_hash alias.
>
> * SQL::Blob values now have as, cast, and lit methods even if the
> core extensions are not loaded.
>
> = Other Improvements
>
> * When loading multiple pg_* extensions into a Database instance,
> the conversion procs are only reset once instead of once per
> extension.
>
> * All adapters that access PostgreSQL now store type conversion
> procs, similar to the native postgres adapter. This has been
> added to make it easier to write extensions that support
> advanced PostgreSQL types.
>
> * Database#schema output on PostgreSQL now includes the type oid
> for each column.
>
> * You can now register custom array types to specific Database
> instances, using the :type_procs and :typecast_methods_module
> options, so it is now possible to have custom array types
> without affecting global state.
>
> * Dropping of columns with defaults now works correctly on
> Microsoft SQL Server. Before, it would fail as the related
> constraint was not dropped first.
>
> * The MySQL type "double(x,y)" is now recognized as a float type.
>
> * The jdbc/jtds and jdbc/derby adapters now handle nil prepared
> statement values in more cases.
>
> * Blob prepared statement arguments are now handled correctly on
> jdbc/db2 and jdbc/oracle.
>
> * Sequel now works around a Time#nsec bug in JRuby 1.6 ruby 1.9 mode
> when using Time values in prepared statements in the jdbc adapter.
>
> * Java::JavaUtil::UUID types are now returned as ruby strings
> when converting types in the jdbc adapter.
>
> * Real boolean literals are now used on derby 10.7+. On derby <10.7
> Sequel still uses (1 = 1) and (1 != 1) for true and false. This
> allows you to use boolean columns with a true/false default on
> derby 10.7+.
>
> * Clobs are now treated as string types instead of blobs on derby,
> since treating clob as blob doesn't work there.
>
> * The swift adapter now supports an output identifier method.
>
> * The swift adapter now returns blobs as SQL::Blob instances.
>
> * The schema_dumper extension no longer produces code that requires
> the core extensions.
>
> * All of Sequel's specs now run without the core extensions loaded,
> ensuring that none of the internals depend on the core extensions.
> The only exception is the specs for the core extensions themselves.
>
> = Backwards Compatibility
>
> * The pg_* extensions no longer modify core classes if the
> core_extensions extension is not loaded. All methods they added now
> have equivalent methods on the main Sequel module:
>
> Sequel.pg_array
> Sequel.pg_array_op
> Sequel.hstore
> Sequel.hstore_op
> Sequel.pg_json
> Sequel.pg_range
> Sequel.pg_range_op
>
> * The Sequel::SQL::IdentifierMethods module has been removed. This
> module was only included in Symbol if the core_extensions were
> enabled. Since it only defined a single method, now the core
> extensions just define that method directly on Symbol.
>
> * The swift adapter now requires swift-db-{postgres,mysql,sqlite3}
> gems instead of the swift gem. swift/postgres requires
> swift-db-postgres 0.2.0+, swift/sqlite requires swift-db-sqlite
> 0.1.2+, and swift/mysql requires swift-db-mysql.
>
> * Sequel will no longer typecast a string to a PostgreSQL array
> or hstore column in a model column setter. This is because the
> parsers that Sequel uses were designed to support only
> PostgreSQL's output format. It's unlikely that a user would
> provide that format for typecasting, and while there aren't known
> security issues with the parsers, they were not designed to handle
> arbtirary user input, so typecasting from string is no longer
> allowed and will now raise an error.
>
> The only reason such typecasting was allowed in the first place
> was to work around issues in the jdbc/postgres, do/postgres, and
> swift/postgres adapters, using the the typecast_on_load plugin.
> If you were previously using the typecast_on_load plugin for
> hstore or array columns, you need to switch to using the new
> pg_typecast_on_load plugin.
>
> * The private get_conversion_procs method in the postgres adapter
> no longer accepts an argument.
>
> * The Sequel::Postgres::PGArray::DatabaseMethods singleton
> define_array_typecast_method method has been removed. This
> method was designed for internal use.
>
> * The change to make Sequel.expr split symbols can cause the
> following type of code to break:
>
> Sequel.expr(:column___alias).desc
>
> This is because expr now returns an AliasedExpression, which
> doesn't support the desc method. However, as you can't
> apply an order to an aliased expression, nobody should be
> relying on this.
>
> Thanks,
> Jeremy
>
--
You received this message because you are subscribed to the Google Groups
"sequel-talk" group.
To view this discussion on the web visit
https://groups.google.com/d/msg/sequel-talk/-/bjkVhmdLciUJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sequel-talk?hl=en.