moneta 1.4.0 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +415 -0
- data/CHANGES +18 -0
- data/CONTRIBUTORS +2 -0
- data/Gemfile +144 -56
- data/README.md +21 -17
- data/lib/moneta/adapter.rb +52 -0
- data/lib/moneta/adapters/activerecord.rb +77 -68
- data/lib/moneta/adapters/activesupportcache.rb +22 -31
- data/lib/moneta/adapters/cassandra.rb +114 -116
- data/lib/moneta/adapters/client.rb +17 -18
- data/lib/moneta/adapters/couch.rb +31 -26
- data/lib/moneta/adapters/datamapper.rb +9 -5
- data/lib/moneta/adapters/daybreak.rb +15 -21
- data/lib/moneta/adapters/dbm.rb +6 -12
- data/lib/moneta/adapters/file.rb +21 -13
- data/lib/moneta/adapters/fog.rb +5 -6
- data/lib/moneta/adapters/gdbm.rb +6 -12
- data/lib/moneta/adapters/hbase.rb +10 -12
- data/lib/moneta/adapters/kyotocabinet.rb +22 -27
- data/lib/moneta/adapters/leveldb.rb +14 -20
- data/lib/moneta/adapters/lmdb.rb +19 -22
- data/lib/moneta/adapters/localmemcache.rb +7 -13
- data/lib/moneta/adapters/lruhash.rb +20 -20
- data/lib/moneta/adapters/memcached/dalli.rb +25 -33
- data/lib/moneta/adapters/memcached/native.rb +14 -20
- data/lib/moneta/adapters/memory.rb +5 -7
- data/lib/moneta/adapters/mongo.rb +59 -50
- data/lib/moneta/adapters/pstore.rb +21 -27
- data/lib/moneta/adapters/redis.rb +42 -37
- data/lib/moneta/adapters/restclient.rb +17 -25
- data/lib/moneta/adapters/riak.rb +8 -9
- data/lib/moneta/adapters/sdbm.rb +6 -12
- data/lib/moneta/adapters/sequel/mysql.rb +8 -8
- data/lib/moneta/adapters/sequel/postgres.rb +17 -17
- data/lib/moneta/adapters/sequel/postgres_hstore.rb +47 -47
- data/lib/moneta/adapters/sequel/sqlite.rb +9 -9
- data/lib/moneta/adapters/sequel.rb +56 -65
- data/lib/moneta/adapters/sqlite.rb +37 -35
- data/lib/moneta/adapters/tdb.rb +8 -14
- data/lib/moneta/adapters/tokyocabinet.rb +19 -17
- data/lib/moneta/adapters/tokyotyrant.rb +29 -30
- data/lib/moneta/adapters/yaml.rb +1 -5
- data/lib/moneta/config.rb +101 -0
- data/lib/moneta/expires.rb +0 -1
- data/lib/moneta/expires_support.rb +3 -4
- data/lib/moneta/pool.rb +27 -7
- data/lib/moneta/proxy.rb +29 -0
- data/lib/moneta/server.rb +21 -14
- data/lib/moneta/version.rb +1 -1
- data/lib/moneta/wrapper.rb +5 -0
- data/lib/moneta.rb +2 -0
- data/moneta.gemspec +1 -0
- data/spec/active_support/cache_moneta_store_spec.rb +13 -13
- data/spec/helper.rb +14 -3
- data/spec/moneta/adapters/activerecord/adapter_activerecord_existing_connection_spec.rb +3 -1
- data/spec/moneta/adapters/activerecord/adapter_activerecord_spec.rb +15 -7
- data/spec/moneta/adapters/activerecord/standard_activerecord_spec.rb +5 -2
- data/spec/moneta/adapters/activerecord/standard_activerecord_with_expires_spec.rb +5 -2
- data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_spec.rb +3 -3
- data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_with_default_expires_spec.rb +2 -2
- data/spec/moneta/adapters/client/client_helper.rb +4 -3
- data/spec/moneta/adapters/datamapper/adapter_datamapper_spec.rb +25 -8
- data/spec/moneta/adapters/datamapper/standard_datamapper_spec.rb +2 -2
- data/spec/moneta/adapters/datamapper/standard_datamapper_with_expires_spec.rb +2 -2
- data/spec/moneta/adapters/datamapper/standard_datamapper_with_repository_spec.rb +2 -2
- data/spec/moneta/adapters/faraday_helper.rb +3 -2
- data/spec/moneta/adapters/lruhash/adapter_lruhash_spec.rb +10 -6
- data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_spec.rb +13 -3
- data/spec/moneta/adapters/memcached/native/adapter_memcached_native_spec.rb +13 -3
- data/spec/moneta/adapters/mongo/adapter_mongo_spec.rb +17 -3
- data/spec/moneta/adapters/mongo/adapter_mongo_with_default_expires_spec.rb +4 -4
- data/spec/moneta/adapters/mongo/standard_mongo_spec.rb +1 -1
- data/spec/moneta/adapters/redis/adapter_redis_spec.rb +13 -3
- data/spec/moneta/adapters/redis/standard_redis_spec.rb +8 -1
- data/spec/moneta/adapters/sequel/adapter_sequel_spec.rb +4 -4
- data/spec/moneta/adapters/sequel/helper.rb +10 -5
- data/spec/moneta/adapters/sequel/standard_sequel_spec.rb +1 -1
- data/spec/moneta/adapters/sequel/standard_sequel_with_expires_spec.rb +1 -1
- data/spec/moneta/adapters/sqlite/adapter_sqlite_spec.rb +1 -1
- data/spec/moneta/adapters/sqlite/standard_sqlite_spec.rb +1 -1
- data/spec/moneta/adapters/sqlite/standard_sqlite_with_expires_spec.rb +1 -1
- data/spec/moneta/config_spec.rb +219 -0
- data/spec/moneta/proxies/pool/pool_spec.rb +31 -3
- data/spec/moneta/proxies/transformer/transformer_bson_spec.rb +3 -1
- data/spec/moneta/proxies/transformer/transformer_marshal_escape_spec.rb +2 -0
- data/spec/rack/session_moneta_spec.rb +44 -25
- data/spec/restserver.rb +3 -14
- metadata +25 -17
- data/.travis.yml +0 -146
- data/spec/moneta/adapters/memcached/dalli/adapter_memcached_dalli_with_default_expires_spec.rb +0 -15
- data/spec/moneta/adapters/memcached/native/adapter_memcached_native_with_default_expires_spec.rb +0 -15
- data/spec/moneta/adapters/redis/adapter_redis_with_default_expires_spec.rb +0 -10
- data/spec/moneta/proxies/proxy/proxy_redis_spec.rb +0 -13
- data/spec/support/mongo_helper.rb +0 -12
@@ -4,32 +4,28 @@ module Moneta
|
|
4
4
|
module Adapters
|
5
5
|
# Redis backend
|
6
6
|
# @api public
|
7
|
-
class Redis
|
8
|
-
include Defaults
|
7
|
+
class Redis < Adapter
|
9
8
|
include ExpiresSupport
|
10
9
|
|
11
10
|
supports :create, :increment, :each_key
|
12
|
-
|
13
|
-
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
|
19
|
-
self.default_expires = options.delete(:expires)
|
20
|
-
@backend = options[:backend] || ::Redis.new(options)
|
21
|
-
end
|
11
|
+
|
12
|
+
# @!method initialize(options = {})
|
13
|
+
# @param [Hash] options
|
14
|
+
# @option options [Integer] :expires Default expiration time
|
15
|
+
# @option options [::Redis] :backend Use existing backend instance
|
16
|
+
# @option options Other options passed to `Redis#new`
|
17
|
+
backend { |**options| ::Redis.new(options) }
|
22
18
|
|
23
19
|
# (see Proxy#key?)
|
24
20
|
#
|
25
21
|
# This method considers false and 0 as "no-expire" and every positive
|
26
22
|
# number as a time to live in seconds.
|
27
23
|
def key?(key, options = {})
|
28
|
-
with_expiry_update(key, default: nil, **options) do
|
29
|
-
if
|
30
|
-
|
24
|
+
with_expiry_update(key, default: nil, **options) do |pipeline_handle|
|
25
|
+
if pipeline_handle.respond_to?(:exists?)
|
26
|
+
pipeline_handle.exists?(key)
|
31
27
|
else
|
32
|
-
|
28
|
+
pipeline_handle.exists(key)
|
33
29
|
end
|
34
30
|
end
|
35
31
|
end
|
@@ -44,8 +40,8 @@ module Moneta
|
|
44
40
|
|
45
41
|
# (see Proxy#load)
|
46
42
|
def load(key, options = {})
|
47
|
-
with_expiry_update(key, default: nil, **options) do
|
48
|
-
|
43
|
+
with_expiry_update(key, default: nil, **options) do |pipeline_handle|
|
44
|
+
pipeline_handle.get(key)
|
49
45
|
end
|
50
46
|
end
|
51
47
|
|
@@ -63,17 +59,17 @@ module Moneta
|
|
63
59
|
# (see Proxy#delete)
|
64
60
|
def delete(key, options = {})
|
65
61
|
future = nil
|
66
|
-
@backend.pipelined do
|
67
|
-
future =
|
68
|
-
|
62
|
+
@backend.pipelined do |pipeline|
|
63
|
+
future = pipeline.get(key)
|
64
|
+
pipeline.del(key)
|
69
65
|
end
|
70
66
|
future.value
|
71
67
|
end
|
72
68
|
|
73
69
|
# (see Proxy#increment)
|
74
70
|
def increment(key, amount = 1, options = {})
|
75
|
-
with_expiry_update(key, **options) do
|
76
|
-
|
71
|
+
with_expiry_update(key, **options) do |pipeline_handle|
|
72
|
+
pipeline_handle.incrby(key, amount)
|
77
73
|
end
|
78
74
|
end
|
79
75
|
|
@@ -85,10 +81,10 @@ module Moneta
|
|
85
81
|
|
86
82
|
# (see Defaults#create)
|
87
83
|
def create(key, value, options = {})
|
88
|
-
expires = expires_value(options,
|
84
|
+
expires = expires_value(options, config.expires)
|
89
85
|
|
90
86
|
if @backend.setnx(key, value)
|
91
|
-
update_expires(key, expires)
|
87
|
+
update_expires(@backend, key, expires)
|
92
88
|
true
|
93
89
|
else
|
94
90
|
false
|
@@ -103,8 +99,8 @@ module Moneta
|
|
103
99
|
|
104
100
|
# (see Defaults#values_at)
|
105
101
|
def values_at(*keys, **options)
|
106
|
-
with_expiry_update(*keys, default: nil, **options) do
|
107
|
-
|
102
|
+
with_expiry_update(*keys, default: nil, **options) do |pipeline_handle|
|
103
|
+
pipeline_handle.mget(*keys)
|
108
104
|
end
|
109
105
|
end
|
110
106
|
|
@@ -130,8 +126,8 @@ module Moneta
|
|
130
126
|
end
|
131
127
|
end
|
132
128
|
|
133
|
-
with_expiry_update(*keys, **options) do
|
134
|
-
|
129
|
+
with_expiry_update(*keys, **options) do |pipeline_handle|
|
130
|
+
pipeline_handle.mset(*pairs.to_a.flatten(1))
|
135
131
|
end
|
136
132
|
|
137
133
|
self
|
@@ -139,24 +135,33 @@ module Moneta
|
|
139
135
|
|
140
136
|
protected
|
141
137
|
|
142
|
-
def update_expires(key, expires)
|
138
|
+
def update_expires(pipeline_handle, key, expires)
|
143
139
|
case expires
|
144
140
|
when false
|
145
|
-
|
141
|
+
pipeline_handle.persist(key)
|
146
142
|
when Numeric
|
147
|
-
|
143
|
+
pipeline_handle.pexpire(key, (expires * 1000).to_i)
|
148
144
|
end
|
149
145
|
end
|
150
146
|
|
151
|
-
def with_expiry_update(*keys, default:
|
147
|
+
def with_expiry_update(*keys, default: config.expires, **options)
|
152
148
|
expires = expires_value(options, default)
|
153
149
|
if expires == nil
|
154
|
-
yield
|
150
|
+
yield(@backend)
|
155
151
|
else
|
156
152
|
future = nil
|
157
|
-
@backend.multi do
|
158
|
-
|
159
|
-
|
153
|
+
@backend.multi do |pipeline|
|
154
|
+
# as of redis 4.6 calling redis methods on the redis client itself
|
155
|
+
# is deprecated in favor of a pipeline handle provided by the
|
156
|
+
# +multi+ call. This will cause in error in redis >= 5.0.
|
157
|
+
#
|
158
|
+
# In order to continue supporting redis versions < 4.6, the following
|
159
|
+
# fallback has been introduced and can be removed once moneta
|
160
|
+
# no longer supports redis < 4.6.
|
161
|
+
|
162
|
+
pipeline_handle = pipeline || @backend
|
163
|
+
future = yield(pipeline_handle)
|
164
|
+
keys.each { |key| update_expires(pipeline_handle, key, expires) }
|
160
165
|
end
|
161
166
|
future.value
|
162
167
|
end
|
@@ -4,55 +4,47 @@ module Moneta
|
|
4
4
|
module Adapters
|
5
5
|
# Moneta rest client backend which works together with {Rack::MonetaRest}
|
6
6
|
# @api public
|
7
|
-
class RestClient
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
@backend = options.delete(:backend) ||
|
20
|
-
begin
|
21
|
-
raise ArgumentError, 'Option :url is required' unless url = options.delete(:url)
|
22
|
-
block = if faraday_adapter = options.delete(:adapter)
|
23
|
-
proc { |faraday| faraday.adapter faraday_adapter }
|
24
|
-
end
|
25
|
-
::Faraday.new(url, options, &block)
|
26
|
-
end
|
7
|
+
class RestClient < Adapter
|
8
|
+
# @!method initialize(options = {})
|
9
|
+
# @param [Hash] options
|
10
|
+
# @option options [String] :url URL
|
11
|
+
# @option options [Symbol] :adapter The adapter to tell Faraday to use
|
12
|
+
# @option options [Faraday::Connection] :backend Use existing backend instance
|
13
|
+
# @option options Other options passed to {Faraday::new} (unless
|
14
|
+
# :backend option is provided).
|
15
|
+
backend do |url:, adapter: nil, **options|
|
16
|
+
::Faraday.new(url, options) do |faraday|
|
17
|
+
faraday.adapter adapter if adapter
|
18
|
+
end
|
27
19
|
end
|
28
20
|
|
29
21
|
# (see Proxy#key?)
|
30
22
|
def key?(key, options = {})
|
31
|
-
|
23
|
+
backend.head(key).status == 200
|
32
24
|
end
|
33
25
|
|
34
26
|
# (see Proxy#load)
|
35
27
|
def load(key, options = {})
|
36
|
-
response =
|
28
|
+
response = backend.get(key)
|
37
29
|
response.status == 200 ? response.body : nil
|
38
30
|
end
|
39
31
|
|
40
32
|
# (see Proxy#store)
|
41
33
|
def store(key, value, options = {})
|
42
|
-
response =
|
34
|
+
response = backend.post(key, value)
|
43
35
|
raise "HTTP error #{response.status}" unless response.status == 200
|
44
36
|
value
|
45
37
|
end
|
46
38
|
|
47
39
|
# (see Proxy#delete)
|
48
40
|
def delete(key, options = {})
|
49
|
-
response =
|
41
|
+
response = backend.delete(key)
|
50
42
|
response.status == 200 ? response.body : nil
|
51
43
|
end
|
52
44
|
|
53
45
|
# (see Proxy#clear)
|
54
46
|
def clear(options = {})
|
55
|
-
|
47
|
+
backend.delete ''
|
56
48
|
self
|
57
49
|
end
|
58
50
|
end
|
data/lib/moneta/adapters/riak.rb
CHANGED
@@ -5,21 +5,20 @@ module Moneta
|
|
5
5
|
# Riak backend
|
6
6
|
# @api public
|
7
7
|
# @author Potapov Sergey (aka Blake)
|
8
|
-
class Riak
|
9
|
-
|
8
|
+
class Riak < Adapter
|
9
|
+
config :bucket, default: 'moneta'
|
10
|
+
config :content_type, default: 'application/octet-stream'
|
10
11
|
|
11
|
-
|
12
|
+
backend { |**options| ::Riak::Client.new(options) }
|
12
13
|
|
13
14
|
# @param [Hash] options
|
14
15
|
# @option options [String] :bucket ('moneta') Bucket name
|
15
16
|
# @option options [String] :content_type ('application/octet-stream') Default content type
|
16
|
-
# @option options All other options passed to `Riak::Client#new`
|
17
17
|
# @option options [::Riak::Client] :backend Use existing backend instance
|
18
|
+
# @option options All other options passed to `Riak::Client#new`
|
18
19
|
def initialize(options = {})
|
19
|
-
|
20
|
-
@
|
21
|
-
@backend = options[:backend] || ::Riak::Client.new(options)
|
22
|
-
@bucket = @backend.bucket(bucket)
|
20
|
+
super
|
21
|
+
@bucket = backend.bucket(config.bucket)
|
23
22
|
end
|
24
23
|
|
25
24
|
# (see Proxy#key?)
|
@@ -44,7 +43,7 @@ module Moneta
|
|
44
43
|
# (see Proxy#store)
|
45
44
|
def store(key, value, options = {})
|
46
45
|
obj = ::Riak::RObject.new(@bucket, key)
|
47
|
-
obj.content_type = options[:content_type] ||
|
46
|
+
obj.content_type = options[:content_type] || config.content_type
|
48
47
|
obj.raw_data = value
|
49
48
|
obj.store(options.dup)
|
50
49
|
value
|
data/lib/moneta/adapters/sdbm.rb
CHANGED
@@ -4,23 +4,17 @@ module Moneta
|
|
4
4
|
module Adapters
|
5
5
|
# SDBM backend
|
6
6
|
# @api public
|
7
|
-
class SDBM
|
8
|
-
include Defaults
|
7
|
+
class SDBM < Adapter
|
9
8
|
include DBMAdapter
|
10
9
|
include IncrementSupport
|
11
10
|
include CreateSupport
|
12
11
|
include EachKeySupport
|
13
12
|
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
|
18
|
-
|
19
|
-
begin
|
20
|
-
raise ArgumentError, 'Option :file is required' unless options[:file]
|
21
|
-
::SDBM.new(options[:file])
|
22
|
-
end
|
23
|
-
end
|
13
|
+
# @!method initialize(options = {})
|
14
|
+
# @param [Hash] options
|
15
|
+
# @option options [String] :file Database file
|
16
|
+
# @option options [::SDBM] :backend Use existing backend instance
|
17
|
+
backend { |file:| ::SDBM.new(file) }
|
24
18
|
end
|
25
19
|
end
|
26
20
|
end
|
@@ -14,7 +14,7 @@ module Moneta
|
|
14
14
|
# "gap lock").
|
15
15
|
if row = @load_for_update.call(key: key)
|
16
16
|
# Integer() will raise an exception if the existing value cannot be parsed
|
17
|
-
amount += Integer(row[value_column])
|
17
|
+
amount += Integer(row[config.value_column])
|
18
18
|
@increment_update.call(key: key, value: amount)
|
19
19
|
else
|
20
20
|
@create.call(key: key, value: amount)
|
@@ -31,17 +31,17 @@ module Moneta
|
|
31
31
|
pairs = yield_merge_pairs(pairs, &block) if block_given?
|
32
32
|
@table
|
33
33
|
.on_duplicate_key_update
|
34
|
-
.import([key_column, value_column], blob_pairs(pairs).to_a)
|
34
|
+
.import([config.key_column, config.value_column], blob_pairs(pairs).to_a)
|
35
35
|
end
|
36
36
|
|
37
37
|
self
|
38
38
|
end
|
39
39
|
|
40
40
|
def each_key
|
41
|
-
return super unless block_given? &&
|
41
|
+
return super unless block_given? && config.each_key_server && @table.respond_to?(:stream)
|
42
42
|
# Order is not required when streaming
|
43
|
-
@table.server(
|
44
|
-
yield row[key_column]
|
43
|
+
@table.server(config.each_key_server).select(config.key_column).paged_each do |row|
|
44
|
+
yield row[config.key_column]
|
45
45
|
end
|
46
46
|
self
|
47
47
|
end
|
@@ -51,13 +51,13 @@ module Moneta
|
|
51
51
|
def prepare_store
|
52
52
|
@store = @table
|
53
53
|
.on_duplicate_key_update
|
54
|
-
.prepare(:insert, statement_id(:store), key_column => :$key, value_column => :$value)
|
54
|
+
.prepare(:insert, statement_id(:store), config.key_column => :$key, config.value_column => :$value)
|
55
55
|
end
|
56
56
|
|
57
57
|
def prepare_increment
|
58
58
|
@increment_update = @table
|
59
|
-
.where(key_column => :$key)
|
60
|
-
.prepare(:update, statement_id(:increment_update), value_column => :$value)
|
59
|
+
.where(config.key_column => :$key)
|
60
|
+
.prepare(:update, statement_id(:increment_update), config.value_column => :$value)
|
61
61
|
super
|
62
62
|
end
|
63
63
|
end
|
@@ -12,14 +12,14 @@ module Moneta
|
|
12
12
|
def increment(key, amount = 1, options = {})
|
13
13
|
result = @increment.call(key: key, value: blob(amount.to_s), amount: amount)
|
14
14
|
if row = result.first
|
15
|
-
row[value_column].to_i
|
15
|
+
row[config.value_column].to_i
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
def delete(key, options = {})
|
20
20
|
result = @delete.call(key: key)
|
21
21
|
if row = result.first
|
22
|
-
row[value_column]
|
22
|
+
row[config.value_column]
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -27,19 +27,19 @@ module Moneta
|
|
27
27
|
@backend.transaction do
|
28
28
|
pairs = yield_merge_pairs(pairs, &block) if block_given?
|
29
29
|
@table
|
30
|
-
.insert_conflict(target: key_column,
|
31
|
-
update: { value_column => ::Sequel[:excluded][value_column] })
|
32
|
-
.import([key_column, value_column], blob_pairs(pairs).to_a)
|
30
|
+
.insert_conflict(target: config.key_column,
|
31
|
+
update: { config.value_column => ::Sequel[:excluded][config.value_column] })
|
32
|
+
.import([config.key_column, config.value_column], blob_pairs(pairs).to_a)
|
33
33
|
end
|
34
34
|
|
35
35
|
self
|
36
36
|
end
|
37
37
|
|
38
38
|
def each_key
|
39
|
-
return super unless block_given? &&
|
39
|
+
return super unless block_given? && !config.each_key_server && @table.respond_to?(:use_cursor)
|
40
40
|
# With a cursor, this will Just Work.
|
41
|
-
@table.select(key_column).paged_each do |row|
|
42
|
-
yield row[key_column]
|
41
|
+
@table.select(config.key_column).paged_each do |row|
|
42
|
+
yield row[config.key_column]
|
43
43
|
end
|
44
44
|
self
|
45
45
|
end
|
@@ -48,30 +48,30 @@ module Moneta
|
|
48
48
|
|
49
49
|
def prepare_store
|
50
50
|
@store = @table
|
51
|
-
.insert_conflict(target: key_column,
|
52
|
-
update: { value_column => ::Sequel[:excluded][value_column] })
|
53
|
-
.prepare(:insert, statement_id(:store), key_column => :$key, value_column => :$value)
|
51
|
+
.insert_conflict(target: config.key_column,
|
52
|
+
update: { config.value_column => ::Sequel[:excluded][config.value_column] })
|
53
|
+
.prepare(:insert, statement_id(:store), config.key_column => :$key, config.value_column => :$value)
|
54
54
|
end
|
55
55
|
|
56
56
|
def prepare_increment
|
57
57
|
update_expr = ::Sequel[:convert_to].function(
|
58
58
|
(::Sequel[:convert_from].function(
|
59
|
-
::Sequel[
|
59
|
+
::Sequel[config.table][config.value_column],
|
60
60
|
'UTF8'
|
61
61
|
).cast(Integer) + :$amount).cast(String),
|
62
62
|
'UTF8'
|
63
63
|
)
|
64
64
|
|
65
65
|
@increment = @table
|
66
|
-
.returning(value_column)
|
67
|
-
.insert_conflict(target: key_column, update: { value_column => update_expr })
|
68
|
-
.prepare(:insert, statement_id(:increment), key_column => :$key, value_column => :$value)
|
66
|
+
.returning(config.value_column)
|
67
|
+
.insert_conflict(target: config.key_column, update: { config.value_column => update_expr })
|
68
|
+
.prepare(:insert, statement_id(:increment), config.key_column => :$key, config.value_column => :$value)
|
69
69
|
end
|
70
70
|
|
71
71
|
def prepare_delete
|
72
72
|
@delete = @table
|
73
|
-
.returning(value_column)
|
74
|
-
.where(key_column => :$key)
|
73
|
+
.returning(config.value_column)
|
74
|
+
.where(config.key_column => :$key)
|
75
75
|
.prepare(:delete, statement_id(:delete))
|
76
76
|
end
|
77
77
|
end
|