113 lines
3.3 KiB
Ruby
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
|