lib/activefacts/generator/sql/postgres.rb in activefacts-compositions-1.9.17 vs lib/activefacts/generator/sql/postgres.rb in activefacts-compositions-1.9.18
- old
+ new
@@ -1,165 +1,23 @@
#
# ActiveFacts PostgreSQL Schema Generator
#
# Copyright (c) 2017 Clifford Heath. Read the LICENSE file.
#
-# Reserved words gathered from:
-# https://www.postgresql.org/docs/9.5/static/sql-keywords-appendix.html
-#
require 'digest/sha1'
require 'activefacts/metamodel'
require 'activefacts/compositions'
require 'activefacts/generator/sql'
+require 'activefacts/generator/traits/sql/postgres'
module ActiveFacts
module Generators
# Options are comma or space separated:
# * underscore
class SQL
class Postgres < SQL
- def self.options
- super.merge({
- # no: [String, "no new options defined here"]
- })
- end
-
- def initialize composition, options = {}
- super(composition, {'tables' => 'snake', 'columns' => 'snake'}.merge(options))
- end
-
- def table_name_max
- 63
- end
-
- def data_type_context
- PostgresDataTypeContext.new
- end
-
- def auto_assign_modifier
- ''
- end
-
- def generate_schema
- go "CREATE EXTENSION IF NOT EXISTS pgcrypto WITH SCHEMA public"
- end
-
- def normalise_type(type_name, length, value_constraint, options)
- if type_name =~ /^(guid|uuid)$/i
- if ![nil, ''].include?(options[:auto_assign])
- options[:default] = " DEFAULT 'gen_random_uuid()'"
- end
- return ['UUID']
- end
-
- type = MM::DataType.normalise(type_name)
- case type
- when MM::DataType::TYPE_Integer
- if aa = options[:auto_assign]
- if aa.size > 0
- 'BIGSERIAL'
- else
- 'BIGINT'
- end
- else
- super
- end
- when MM::DataType::TYPE_Money; 'MONEY'
- when MM::DataType::TYPE_DateTime; 'TIMESTAMP'
- when MM::DataType::TYPE_Timestamp;'TIMESTAMP'
- when MM::DataType::TYPE_Binary;
- if length && length <= 8192
- super
- else
- 'IMAGE'
- end
- else
- super
- end
- end
-
- # Reserved words cannot be used anywhere without quoting.
- # Keywords have existing definitions, so should not be used without quoting.
- # Both lists here are added to the supertype's lists
- def reserved_words
- @postgres_reserved_words ||= %w{
- ANALYSE ANALYZE LIMIT PLACING RETURNING VARIADIC
- }
- super + @postgres_reserved_words
- end
-
- def key_words
- # These keywords should not be used for columns or tables:
- @postgres_key_words ||= %w{
- ABORT ACCESS AGGREGATE ALSO BACKWARD CACHE CHECKPOINT
- CLASS CLUSTER COMMENT COMMENTS CONFIGURATION CONFLICT
- CONVERSION COPY COST CSV DATABASE DELIMITER DELIMITERS
- DICTIONARY DISABLE DISCARD ENABLE ENCRYPTED ENUM EVENT
- EXCLUSIVE EXPLAIN EXTENSION FAMILY FORCE FORWARD FUNCTIONS
- HEADER IMMUTABLE IMPLICIT INDEX INDEXES INHERIT INHERITS
- INLINE LABEL LEAKPROOF LISTEN LOAD LOCK LOCKED LOGGED
- MATERIALIZED MODE MOVE NOTHING NOTIFY NOWAIT OIDS
- OPERATOR OWNED OWNER PARSER PASSWORD PLANS POLICY
- PREPARED PROCEDURAL PROGRAM QUOTE REASSIGN RECHECK
- REFRESH REINDEX RENAME REPLACE REPLICA RESET RULE
- SEQUENCES SHARE SHOW SKIP SNAPSHOT STABLE STATISTICS
- STDIN STDOUT STORAGE STRICT SYSID TABLES TABLESPACE
- TEMP TEMPLATE TEXT TRUSTED TYPES UNENCRYPTED UNLISTEN
- UNLOGGED VACUUM VALIDATE VALIDATOR VIEWS VOLATILE
- }
-
- # These keywords cannot be used for type or functions (and should not for columns or tables)
- @postgres_key_words_func_type ||= %w{
- GREATEST LEAST SETOF XMLROOT
- }
- super + @postgres_key_words + @postgres_key_words_func_type
- end
-
- def go s = ''
- "#{s};\n\n"
- end
-
- def open_escape
- '"'
- end
-
- def close_escape
- '"'
- end
-
- def index_kind(index)
- ''
- end
-
- class PostgresDataTypeContext < SQLDataTypeContext
- def integer_ranges
- super
- end
-
- def boolean_type
- 'BOOLEAN'
- end
-
- def valid_from_type
- 'TIMESTAMP'
- end
-
- # There is no performance benefit in using fixed-length CHAR fields,
- # and an added burden of trimming the implicitly added white-space
- def default_char_type
- (@unicode ? 'N' : '') +
- 'VARCHAR'
- end
-
- def default_varchar_type
- (@unicode ? 'N' : '') +
- 'VARCHAR'
- end
-
- def date_time_type
- 'TIMESTAMP'
- end
- end
+ prepend Traits::SQL::Postgres
+ extend Traits::SQL::Postgres # Needed for class methods, like options
end
end
publish_generator SQL::Postgres
end