cartodb/services/platform-limits/lib/importer/table_row_count.rb
2020-06-15 10:58:47 +08:00

113 lines
3.3 KiB
Ruby

module CartoDB
module PlatformLimits
module Importer
# This limit uses User.max_import_table_row_count attribute to limit table size regarding row count.
# Has no storage.
#
# 'context' is expected to be:
# Hash {
# :table_name String
# :tables_schema String|nil (Optional, defaults to import schema 'cdb_importer')
# }
class TableRowCount < AbstractLimit
# Where to search for the table if no schema specified at context
DEFAULT_SCHEMA = 'cdb_importer'
# This limit needs additional fields present at options Hash:
# :db
# :user (already defined, but mandatory)
# @see CartoDB::PlatformLimits::AbstractLimit initialize()
# @throws ArgumentError
def initialize(options={})
super(options)
raise ArgumentError.new('Must supply a user object') if user.nil?
unless user.respond_to?(:max_import_table_row_count)
raise ArgumentError.new('Supplied user object must have :max_import_table_row_count')
end
unless user.max_import_table_row_count.is_a?(Integer) && user.max_import_file_size > 0
raise ArgumentError.new('invalid user max_import_table_row_count (must be positive integer)')
end
self.max_value = user.max_import_table_row_count
@db = options.fetch(:db, nil)
raise ArgumentError.new('Must supply db connection object') if @db.nil?
end
protected
attr_accessor :db
def subkey
'Importer:TableRowCount'
end
# @param context mixed
# @return bool
def is_over_limit(context)
get(context) > max_value
end
# Gets current value of the limit
# @param context mixed
# Hash {
# :table_name String
# :tables_schema String|nil (Optional, defaults to import schema)
# }
# @return mixed
# @throws ArgumentError
def get(context)
raise ArgumentError.new('context must be a hash') unless context.is_a?(Hash)
table_name = context.fetch(:table_name, nil)
raise ArgumentError.new('context must be a hash') if table_name.nil?
schema_name = context.fetch(:tables_schema, DEFAULT_SCHEMA)
db.fetch(%Q{
SELECT reltuples::bigint AS row_count
FROM pg_class
WHERE oid='#{schema_name}.#{table_name}'::regclass;
})
.first[:row_count]
end
# Gets the maximum limit value
# @param context mixed
# @return mixed
def get_maximum(context)
max_value
end
# Gets when the limit expires
# @param context mixed
# @return integer|nil Timestamp
def get_time_period(context)
nil
end
# Increases the limit
# @param context mixed
# @param amount integer
def increase(context, amount=1)
# Not useful here
end
# Decreases the limit
# @param context mixed
# @param amount integer
def decrease(context, amount=1)
# Not useful here
end
# Resets the limit
def expire
# Does nothing
end
end
end
end
end