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
|