Module | Sequel::Postgres::PGRange::DatabaseMethods |
In: |
lib/sequel/extensions/pg_range.rb
|
Add the conversion procs to the database and extend the datasets to correctly literalize ruby Range values.
# File lib/sequel/extensions/pg_range.rb, line 136 136: def self.extended(db) 137: db.instance_exec do 138: @pg_range_schema_types ||= {} 139: extend_datasets(DatasetMethods) 140: register_range_type('int4range', :oid=>3904, :subtype_oid=>23) 141: register_range_type('numrange', :oid=>3906, :subtype_oid=>1700) 142: register_range_type('tsrange', :oid=>3908, :subtype_oid=>1114) 143: register_range_type('tstzrange', :oid=>3910, :subtype_oid=>1184) 144: register_range_type('daterange', :oid=>3912, :subtype_oid=>1082) 145: register_range_type('int8range', :oid=>3926, :subtype_oid=>20) 146: if respond_to?(:register_array_type) 147: register_array_type('int4range', :oid=>3905, :scalar_oid=>3904, :scalar_typecast=>:int4range) 148: register_array_type('numrange', :oid=>3907, :scalar_oid=>3906, :scalar_typecast=>:numrange) 149: register_array_type('tsrange', :oid=>3909, :scalar_oid=>3908, :scalar_typecast=>:tsrange) 150: register_array_type('tstzrange', :oid=>3911, :scalar_oid=>3910, :scalar_typecast=>:tstzrange) 151: register_array_type('daterange', :oid=>3913, :scalar_oid=>3912, :scalar_typecast=>:daterange) 152: register_array_type('int8range', :oid=>3927, :scalar_oid=>3926, :scalar_typecast=>:int8range) 153: end 154: [:int4range, :numrange, :tsrange, :tstzrange, :daterange, :int8range].each do |v| 155: @schema_type_classes[v] = PGRange 156: end 157: 158: procs = conversion_procs 159: add_conversion_proc(3908, Parser.new("tsrange", procs[1114])) 160: add_conversion_proc(3910, Parser.new("tstzrange", procs[1184])) 161: if defined?(PGArray::Creator) 162: add_conversion_proc(3909, PGArray::Creator.new("tsrange", procs[3908])) 163: add_conversion_proc(3911, PGArray::Creator.new("tstzrange", procs[3910])) 164: end 165: end 166: end
Handle Range and PGRange values in bound variables
# File lib/sequel/extensions/pg_range.rb, line 169 169: def bound_variable_arg(arg, conn) 170: case arg 171: when PGRange 172: arg.unquoted_literal(schema_utility_dataset) 173: when Range 174: PGRange.from_range(arg).unquoted_literal(schema_utility_dataset) 175: else 176: super 177: end 178: end
Freeze the pg range schema types to prevent adding new ones.
# File lib/sequel/extensions/pg_range.rb, line 181 181: def freeze 182: @pg_range_schema_types.freeze 183: super 184: end
Register a database specific range type. This can be used to support different range types per Database. Options:
:converter : | A callable object (e.g. Proc), that is called with the start or end of the range (usually a string), and should return the appropriate typecasted object. |
:oid : | The PostgreSQL OID for the range type. This is used by the Sequel postgres adapter to set up automatic type conversion on retrieval from the database. |
:subtype_oid : | Should be the PostgreSQL OID for the range‘s subtype. If given, automatically sets the :converter option by looking for scalar conversion proc. |
If a block is given, it is treated as the :converter option.
# File lib/sequel/extensions/pg_range.rb, line 198 198: def register_range_type(db_type, opts=OPTS, &block) 199: oid = opts[:oid] 200: soid = opts[:subtype_oid] 201: 202: if has_converter = opts.has_key?(:converter) 203: raise Error, "can't provide both a block and :converter option to register_range_type" if block 204: converter = opts[:converter] 205: else 206: has_converter = true if block 207: converter = block 208: end 209: 210: unless (soid || has_converter) && oid 211: range_oid, subtype_oid = from(:pg_range).join(:pg_type, :oid=>:rngtypid).where(:typname=>db_type.to_s).get([:rngtypid, :rngsubtype]) 212: soid ||= subtype_oid unless has_converter 213: oid ||= range_oid 214: end 215: 216: db_type = db_type.to_s.dup.freeze 217: 218: if converter = opts[:converter] 219: raise Error, "can't provide both a block and :converter option to register" if block 220: else 221: converter = block 222: end 223: 224: if soid 225: raise Error, "can't provide both a converter and :subtype_oid option to register" if has_converter 226: raise Error, "no conversion proc for :subtype_oid=>#{soid.inspect} in conversion_procs" unless converter = conversion_procs[soid] 227: end 228: 229: parser = Parser.new(db_type, converter) 230: add_conversion_proc(oid, parser) 231: 232: @pg_range_schema_types[db_type] = db_type.to_sym 233: 234: singleton_class.class_eval do 235: meth = "typecast_value_#{db_type}""typecast_value_#{db_type}" 236: define_method(meth){|v| typecast_value_pg_range(v, parser)} 237: private meth 238: end 239: 240: @schema_type_classes["#{opts[:type_symbol] || db_type}""#{opts[:type_symbol] || db_type}"] = PGRange 241: nil 242: end