Files
ubicloud/db.rb
Jeremy Evans fc58e6b5d3 Better NetAddr/Sequel integration
Previously, the only integration was conversion procs for inet and
cidr. This adds:

* conversion procs for inet[] and cidr[] (previously these used
  IPAddr instead of NetAddr)

* typecasting support

* schema type validation

* NetAddr object literalization and bound variable support

Update the update_firewall_rules prog to handle NetAddr instead
of IPAddr instances.

This gives inet/cidr/inet[]/cidr[] columns a schema type when they
did not have a schema type previously, which breaks the usage of
literal string values for array columns in model objects. Literal
strings are expressions and not values, and therefore shouldn't
be used as model object values, they only work due to implementation
details if a schema type is not present.  Fix cases where literal
strings were used as model object values, making all affected code
simpler.
2025-06-12 07:32:57 +09:00

50 lines
2.4 KiB
Ruby

# frozen_string_literal: true
require "netaddr"
require "sequel/core"
require_relative "config"
require_relative "lib/util"
db_ca_bundle_filename = File.join(Dir.pwd, "var", "ca_bundles", "db_ca_bundle.crt")
Util.safe_write_to_file(db_ca_bundle_filename, Config.clover_database_root_certs)
max_connections = Config.db_pool - 1
max_connections = 1 if ENV["SHARED_CONNECTION"] == "1"
pg_auto_parameterize_min_array_size = 1 if Config.test? && ENV["CLOVER_FREEZE"] == "1"
DB = Sequel.connect(Config.clover_database_url, max_connections:, pool_timeout: Config.database_timeout, treat_string_list_as_untyped_array: true, pg_auto_parameterize_min_array_size:)
postgres_monitor_db_ca_bundle_filename = File.join(Dir.pwd, "var", "ca_bundles", "postgres_monitor_db.crt")
Util.safe_write_to_file(postgres_monitor_db_ca_bundle_filename, Config.postgres_monitor_database_root_certs)
begin
POSTGRES_MONITOR_DB = Sequel.connect(Config.postgres_monitor_database_url, max_connections: Config.db_pool, pool_timeout: Config.database_timeout) if Config.postgres_monitor_database_url
rescue Sequel::DatabaseConnectionError => ex
Clog.emit("Failed to connect to Postgres Monitor database") { {database_connection_failed: {exception: Util.exception_to_hash(ex)}} }
end
# Load Sequel Database/Global extensions here
# DB.extension :date_arithmetic
DB.extension :pg_array, :pg_json, :pg_auto_parameterize, :pg_auto_parameterize_in_array, :pg_timestamptz, :pg_range, :pg_enum
Sequel.extension :pg_range_ops, :pg_json_ops
# Replace dangerous (for cidrs) Ruby IPAddr type that is otherwise
# used by sequel_pg. Has come up more than once in the bug tracker:
#
# https://github.com/jeremyevans/sequel_pg/issues?q=inet
# https://github.com/jeremyevans/sequel_pg/issues/30
# https://github.com/jeremyevans/sequel_pg/pull/37
DB.add_conversion_proc(869, NetAddr.method(:parse_ip))
DB.add_conversion_proc(650, NetAddr.method(:parse_net))
DB.register_array_type("inet", oid: 1041, scalar_oid: 869)
DB.register_array_type("cidr", oid: 651, scalar_oid: 650)
require_relative "lib/net_addr_sequel"
DB.extend_datasets(NetAddrSequel::DatasetMethods)
DB.extend(NetAddrSequel::DatabaseMethods)
DB.extension :pg_schema_caching
DB.extension :index_caching
DB.load_schema_cache?("cache/schema.cache")
DB.load_index_cache?("cache/index.cache")
DB.extension :temporarily_release_connection if ENV["SHARED_CONNECTION"] == "1"
DB.extension :query_blocker if Config.test? && ENV["CLOVER_FREEZE"] == "1"