tarantool 0.2.5 → 0.3.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +14 -12
- data/LICENSE +4 -4
- data/README.md +15 -9
- data/Rakefile +5 -129
- data/lib/tarantool/base_record.rb +288 -0
- data/lib/tarantool/block_db.rb +135 -0
- data/lib/tarantool/callback_db.rb +47 -0
- data/lib/tarantool/core-ext.rb +12 -0
- data/lib/tarantool/em_db.rb +37 -0
- data/lib/tarantool/exceptions.rb +52 -7
- data/lib/tarantool/fiber_db.rb +152 -0
- data/lib/tarantool/light_record.rb +68 -0
- data/lib/tarantool/query.rb +127 -0
- data/lib/tarantool/record/select.rb +59 -0
- data/lib/tarantool/record.rb +93 -282
- data/lib/tarantool/request.rb +351 -52
- data/lib/tarantool/response.rb +108 -45
- data/lib/tarantool/serializers/bson.rb +2 -2
- data/lib/tarantool/serializers.rb +32 -4
- data/lib/tarantool/space_array.rb +153 -0
- data/lib/tarantool/space_hash.rb +262 -0
- data/lib/tarantool/util.rb +182 -0
- data/lib/tarantool/version.rb +3 -0
- data/lib/tarantool.rb +79 -29
- data/test/box.pid +1 -0
- data/test/helper.rb +164 -0
- data/test/run_all.rb +3 -0
- data/test/shared_query.rb +73 -0
- data/test/shared_record.rb +474 -0
- data/test/shared_space_array.rb +284 -0
- data/test/shared_space_hash.rb +239 -0
- data/test/tarant/init.lua +22 -0
- data/test/tarantool.cfg +62 -0
- data/test/tarantool.log +6 -0
- data/{spec/tarantool.cfg → test/tarantool_repl.cfg} +11 -5
- data/test/test_light_record.rb +48 -0
- data/test/test_query_block.rb +6 -0
- data/test/test_query_fiber.rb +7 -0
- data/test/test_record.rb +88 -0
- data/{spec/tarantool/composite_primary_key_spec.rb → test/test_record_composite_pk.rb} +5 -7
- data/test/test_space_array_block.rb +6 -0
- data/test/test_space_array_callback.rb +255 -0
- data/test/test_space_array_callback_nodef.rb +190 -0
- data/test/test_space_array_fiber.rb +7 -0
- data/test/test_space_hash_block.rb +6 -0
- data/test/test_space_hash_fiber.rb +7 -0
- metadata +78 -55
- data/Gemfile.lock +0 -54
- data/examples/em_simple.rb +0 -16
- data/examples/record.rb +0 -68
- data/examples/simple.rb +0 -13
- data/lib/tarantool/requests/call.rb +0 -20
- data/lib/tarantool/requests/delete.rb +0 -18
- data/lib/tarantool/requests/insert.rb +0 -19
- data/lib/tarantool/requests/ping.rb +0 -16
- data/lib/tarantool/requests/select.rb +0 -22
- data/lib/tarantool/requests/update.rb +0 -35
- data/lib/tarantool/requests.rb +0 -19
- data/lib/tarantool/serializers/integer.rb +0 -14
- data/lib/tarantool/serializers/string.rb +0 -14
- data/lib/tarantool/space.rb +0 -39
- data/spec/helpers/let.rb +0 -11
- data/spec/helpers/truncate.rb +0 -12
- data/spec/spec_helper.rb +0 -21
- data/spec/tarantool/em_spec.rb +0 -22
- data/spec/tarantool/record_spec.rb +0 -316
- data/spec/tarantool/request_spec.rb +0 -103
- data/tarantool.gemspec +0 -69
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'tarantool/em_db'
|
2
|
+
|
3
|
+
module Tarantool
|
4
|
+
class CallbackDB < EMDB
|
5
|
+
class SpaceArray < ::Tarantool::SpaceArray
|
6
|
+
alias by_pk by_pk_blk
|
7
|
+
alias all_by_key all_by_key_blk
|
8
|
+
alias first_by_key first_by_key_blk
|
9
|
+
alias all_by_keys all_by_keys_blk
|
10
|
+
alias select select_blk
|
11
|
+
alias insert insert_blk
|
12
|
+
alias replace replace_blk
|
13
|
+
alias update update_blk
|
14
|
+
alias delete delete_blk
|
15
|
+
alias invoke invoke_blk
|
16
|
+
alias call call_blk
|
17
|
+
alias ping ping_blk
|
18
|
+
end
|
19
|
+
|
20
|
+
class SpaceHash < ::Tarantool::SpaceHash
|
21
|
+
alias by_pk by_pk_blk
|
22
|
+
alias all all_blk
|
23
|
+
alias first first_blk
|
24
|
+
alias select select_blk
|
25
|
+
alias insert insert_blk
|
26
|
+
alias replace replace_blk
|
27
|
+
alias update update_blk
|
28
|
+
alias delete delete_blk
|
29
|
+
alias invoke invoke_blk
|
30
|
+
alias call call_blk
|
31
|
+
alias ping ping_blk
|
32
|
+
end
|
33
|
+
|
34
|
+
class Query < ::Tarantool::Query
|
35
|
+
alias select select_blk
|
36
|
+
alias all all_blk
|
37
|
+
alias first first_blk
|
38
|
+
alias insert insert_blk
|
39
|
+
alias replace replace_blk
|
40
|
+
alias update update_blk
|
41
|
+
alias delete delete_blk
|
42
|
+
alias invoke invoke_blk
|
43
|
+
alias call call_blk
|
44
|
+
alias ping ping_blk
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Tarantool
|
2
|
+
class EMDB < DB
|
3
|
+
def establish_connection
|
4
|
+
@connection_waiters = []
|
5
|
+
EM.schedule do
|
6
|
+
unless @closed
|
7
|
+
@connection = IProto.get_connection(@host, @port, :em_callback)
|
8
|
+
while waiter = @connection_waiters.shift
|
9
|
+
_send_request(*waiter)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def close_connection
|
16
|
+
EM.schedule do
|
17
|
+
if @connection
|
18
|
+
@connection.close
|
19
|
+
@connection = nil
|
20
|
+
end
|
21
|
+
unless @connection_waiters.empty?
|
22
|
+
while waiter = @connection_waiters.shift
|
23
|
+
waiter.last.call(::IProto::Disconnected)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def _send_request(request_type, body, cb)
|
30
|
+
if @connection
|
31
|
+
@connection.send_request(request_type, body, cb)
|
32
|
+
else
|
33
|
+
@connection_waiters << [request_type, body, cb]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/tarantool/exceptions.rb
CHANGED
@@ -1,9 +1,54 @@
|
|
1
|
-
|
1
|
+
module Tarantool
|
2
|
+
class ArgumentError < ::ArgumentError; end
|
3
|
+
class StringTooLong < ArgumentError; end
|
4
|
+
|
2
5
|
class TarantoolError < StandardError; end
|
3
|
-
class UndefinedRequestType < TarantoolError; end
|
4
|
-
class BadReturnCode < TarantoolError; end
|
5
|
-
class StringTooLong < TarantoolError; end
|
6
|
-
class ArgumentError < TarantoolError; end
|
7
|
-
class UndefinedSpace < TarantoolError; end
|
8
6
|
class ValueError < TarantoolError; end
|
9
|
-
|
7
|
+
class StatusCode < TarantoolError
|
8
|
+
attr_reader :code
|
9
|
+
def initialize(code, msg)
|
10
|
+
super(msg)
|
11
|
+
@code = code
|
12
|
+
end
|
13
|
+
def to_s
|
14
|
+
"#{super} [#{code}]"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
# try again return codes
|
18
|
+
class TryAgain < StatusCode; end
|
19
|
+
class TupleReadOnly < TryAgain; end
|
20
|
+
class TupleIsLocked < TryAgain; end
|
21
|
+
class MemoryIssue < TryAgain; end
|
22
|
+
# general error return codes
|
23
|
+
class BadReturnCode < StatusCode; end
|
24
|
+
class NonMaster < BadReturnCode; end
|
25
|
+
class IllegalParams < BadReturnCode; end
|
26
|
+
class UnsupportedCommand < BadReturnCode; end
|
27
|
+
class WrongField < BadReturnCode; end
|
28
|
+
class WrongNumber < BadReturnCode; end
|
29
|
+
class Duplicate < BadReturnCode; end # it is rather useful
|
30
|
+
class WrongVersion < BadReturnCode; end
|
31
|
+
class WalIO < BadReturnCode; end
|
32
|
+
class LuaError < BadReturnCode; end
|
33
|
+
class StoredProcedureNotDefined < BadReturnCode; end
|
34
|
+
class TupleExists < BadReturnCode; end
|
35
|
+
class TupleDoesntExists < BadReturnCode; end
|
36
|
+
CODE_TO_EXCEPTION = {
|
37
|
+
0x0401 => TupleReadOnly,
|
38
|
+
0x0601 => TupleIsLocked,
|
39
|
+
0x0701 => MemoryIssue,
|
40
|
+
0x0102 => NonMaster,
|
41
|
+
0x0202 => IllegalParams,
|
42
|
+
0x0a02 => UnsupportedCommand,
|
43
|
+
0x1e02 => WrongField,
|
44
|
+
0x1f02 => WrongNumber,
|
45
|
+
0x2002 => Duplicate,
|
46
|
+
0x2602 => WrongVersion,
|
47
|
+
0x2702 => WalIO,
|
48
|
+
0x3102 => TupleDoesntExists,
|
49
|
+
0x3202 => StoredProcedureNotDefined,
|
50
|
+
0x3302 => LuaError,
|
51
|
+
0x3702 => TupleExists,
|
52
|
+
}
|
53
|
+
CODE_TO_EXCEPTION.default = BadReturnCode
|
54
|
+
end
|
@@ -0,0 +1,152 @@
|
|
1
|
+
require 'iproto/core-ext'
|
2
|
+
require 'tarantool/em_db'
|
3
|
+
|
4
|
+
module Tarantool
|
5
|
+
class FiberDB < EMDB
|
6
|
+
module CommonSpaceFiberMethods
|
7
|
+
def all_by_pks(pks, opts={})
|
8
|
+
all_by_pks_cb(pks, ::Fiber.current, opts)
|
9
|
+
_raise_or_return ::Fiber.yield
|
10
|
+
end
|
11
|
+
|
12
|
+
def by_pk(pk)
|
13
|
+
by_pk_cb(pk, ::Fiber.current)
|
14
|
+
_raise_or_return ::Fiber.yield
|
15
|
+
end
|
16
|
+
|
17
|
+
def insert(tuple, opts={})
|
18
|
+
insert_cb(tuple, ::Fiber.current, opts)
|
19
|
+
_raise_or_return ::Fiber.yield
|
20
|
+
end
|
21
|
+
|
22
|
+
def replace(tuple, opts={})
|
23
|
+
replace_cb(tuple, ::Fiber.current, opts)
|
24
|
+
_raise_or_return ::Fiber.yield
|
25
|
+
end
|
26
|
+
|
27
|
+
def update(pk, operations, opts={})
|
28
|
+
update_cb(pk, operations, ::Fiber.current, opts)
|
29
|
+
_raise_or_return ::Fiber.yield
|
30
|
+
end
|
31
|
+
|
32
|
+
def delete(pk, opts={})
|
33
|
+
delete_cb(pk, ::Fiber.current, opts)
|
34
|
+
_raise_or_return ::Fiber.yield
|
35
|
+
end
|
36
|
+
|
37
|
+
def invoke(func_name, values = [], opts = {})
|
38
|
+
invoke_cb(func_name, values, ::Fiber.current, opts)
|
39
|
+
_raise_or_return ::Fiber.yield
|
40
|
+
end
|
41
|
+
|
42
|
+
def call(func_name, values = [], opts = {})
|
43
|
+
call_cb(func_name, values, ::Fiber.current, opts)
|
44
|
+
_raise_or_return ::Fiber.yield
|
45
|
+
end
|
46
|
+
|
47
|
+
def ping
|
48
|
+
ping_cb(::Fiber.current)
|
49
|
+
_raise_or_return ::Fiber.yield
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
class SpaceArray < ::Tarantool::SpaceArray
|
54
|
+
include CommonSpaceFiberMethods
|
55
|
+
def all_by_key(index_no, key, opts={})
|
56
|
+
all_by_key_cb(index_no, key, ::Fiber.current, opts)
|
57
|
+
_raise_or_return ::Fiber.yield
|
58
|
+
end
|
59
|
+
|
60
|
+
def first_by_key(index_no, key)
|
61
|
+
first_by_key_cb(index_no, key, ::Fiber.current)
|
62
|
+
_raise_or_return ::Fiber.yield
|
63
|
+
end
|
64
|
+
|
65
|
+
def all_by_keys(index_no, key, opts={})
|
66
|
+
all_by_keys_cb(index_no, key, ::Fiber.current, opts)
|
67
|
+
_raise_or_return ::Fiber.yield
|
68
|
+
end
|
69
|
+
|
70
|
+
def select(index_no, keys, offset=0, limit=-1)
|
71
|
+
select_cb(index_no, keys, offset, limit, ::Fiber.current)
|
72
|
+
_raise_or_return ::Fiber.yield
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class SpaceHash < ::Tarantool::SpaceHash
|
77
|
+
include CommonSpaceFiberMethods
|
78
|
+
|
79
|
+
def by_pk(key_array)
|
80
|
+
by_pk_cb(key_array, ::Fiber.current)
|
81
|
+
_raise_or_return ::Fiber.yield
|
82
|
+
end
|
83
|
+
|
84
|
+
def all(keys, opts = {})
|
85
|
+
all_cb(keys, ::Fiber.current, opts)
|
86
|
+
_raise_or_return ::Fiber.yield
|
87
|
+
end
|
88
|
+
|
89
|
+
def first(key)
|
90
|
+
first_cb(key, ::Fiber.current)
|
91
|
+
_raise_or_return ::Fiber.yield
|
92
|
+
end
|
93
|
+
|
94
|
+
def select(keys, offset=0, limit=-1)
|
95
|
+
select_cb(keys, offset, limit, ::Fiber.current)
|
96
|
+
_raise_or_return ::Fiber.yield
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
class Query < ::Tarantool::Query
|
101
|
+
def select(space_no, index_no, keys, offset, limit, opts={})
|
102
|
+
select_cb(space_no, index_no, keys, offset, limit, ::Fiber.current, opts)
|
103
|
+
_raise_or_return ::Fiber.yield
|
104
|
+
end
|
105
|
+
|
106
|
+
def all(space_no, index_no, keys, opts={})
|
107
|
+
all_cb(space_no, index_no, keys, ::Fiber.current, opts)
|
108
|
+
_raise_or_return ::Fiber.yield
|
109
|
+
end
|
110
|
+
|
111
|
+
def first(space_no, index_no, key, opts={})
|
112
|
+
first_cb(space_no, index_no, key, ::Fiber.current, opts)
|
113
|
+
_raise_or_return ::Fiber.yield
|
114
|
+
end
|
115
|
+
|
116
|
+
def insert(space_no, tuple, opts={})
|
117
|
+
insert_cb(space_no, tuple, ::Fiber.current, opts)
|
118
|
+
_raise_or_return ::Fiber.yield
|
119
|
+
end
|
120
|
+
|
121
|
+
def replace(space_no, tuple, opts={})
|
122
|
+
replace_cb(space_no, tuple, ::Fiber.current, opts)
|
123
|
+
_raise_or_return ::Fiber.yield
|
124
|
+
end
|
125
|
+
|
126
|
+
def update(space_no, pk, operation, opts={})
|
127
|
+
update_cb(space_no, pk, operation, ::Fiber.current, opts)
|
128
|
+
_raise_or_return ::Fiber.yield
|
129
|
+
end
|
130
|
+
|
131
|
+
def delete(space_no, pk, opts={})
|
132
|
+
delete_cb(space_no, pk, ::Fiber.current, opts)
|
133
|
+
_raise_or_return ::Fiber.yield
|
134
|
+
end
|
135
|
+
|
136
|
+
def invoke(func_name, values, opts={})
|
137
|
+
invoke_cb(func_name, values, ::Fiber.current, opts)
|
138
|
+
_raise_or_return ::Fiber.yield
|
139
|
+
end
|
140
|
+
|
141
|
+
def call(func_name, values, opts={})
|
142
|
+
call_cb(func_name, values, ::Fiber.current, opts)
|
143
|
+
_raise_or_return ::Fiber.yield
|
144
|
+
end
|
145
|
+
|
146
|
+
def ping
|
147
|
+
ping_cb(::Fiber.current)
|
148
|
+
_raise_or_return ::Fiber.yield
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'tarantool/base_record'
|
2
|
+
|
3
|
+
module Tarantool
|
4
|
+
class LightRecord < BaseRecord
|
5
|
+
def initialize(attributes = nil)
|
6
|
+
@__new_record = true
|
7
|
+
@attributes = self.class.default_values.dup
|
8
|
+
set_attributes(attributes) if attributes
|
9
|
+
after_init
|
10
|
+
end
|
11
|
+
|
12
|
+
def __fetched(attributes)
|
13
|
+
@__new_record = false
|
14
|
+
@attributes = attributes
|
15
|
+
after_init
|
16
|
+
self
|
17
|
+
end
|
18
|
+
|
19
|
+
# callback which runs both after initialization and after
|
20
|
+
# fetching from database
|
21
|
+
def after_init
|
22
|
+
end
|
23
|
+
|
24
|
+
def save
|
25
|
+
if @__new_record
|
26
|
+
self.class.insert(@attributes)
|
27
|
+
@__new_record = false
|
28
|
+
else
|
29
|
+
self.class.replace(@attributes)
|
30
|
+
end
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
def destroy
|
35
|
+
self.class.delete id
|
36
|
+
true
|
37
|
+
end
|
38
|
+
|
39
|
+
class << self
|
40
|
+
def generated_attribute_methods
|
41
|
+
@generated_attribute_methods ||= begin
|
42
|
+
include (mod = Module.new)
|
43
|
+
mod
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def define_field_accessor(name, type)
|
48
|
+
generated_attribute_methods.class_eval <<-"EOF", __FILE__, __LINE__ - 1
|
49
|
+
def #{name}
|
50
|
+
@attributes[:"#{name}"]
|
51
|
+
end
|
52
|
+
|
53
|
+
def #{name}=(v)
|
54
|
+
@attributes[:"#{name}"] = v
|
55
|
+
end
|
56
|
+
EOF
|
57
|
+
end
|
58
|
+
|
59
|
+
def create(attrs)
|
60
|
+
new(attrs).save
|
61
|
+
end
|
62
|
+
|
63
|
+
def from_fetched(attributes)
|
64
|
+
attributes && allocate.__fetched(attributes)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'tarantool/request'
|
2
|
+
require 'tarantool/response'
|
3
|
+
|
4
|
+
module Tarantool
|
5
|
+
class Query
|
6
|
+
include Request
|
7
|
+
def initialize(tarantool)
|
8
|
+
@tarantool = tarantool
|
9
|
+
end
|
10
|
+
|
11
|
+
def _send_request(type, body, cb)
|
12
|
+
@tarantool._send_request(type, body, cb)
|
13
|
+
end
|
14
|
+
|
15
|
+
def select_cb(space_no, index_no, keys, offset, limit, cb, opts={})
|
16
|
+
keys = [*keys]
|
17
|
+
types = opts[:types] || _detect_types(keys)
|
18
|
+
returns = opts[:returns] || TYPES_AUTO
|
19
|
+
if Hash === returns
|
20
|
+
returns, *translators = _parse_hash_definition(returns)
|
21
|
+
end
|
22
|
+
_select(space_no, index_no, offset, limit, keys, cb, returns,
|
23
|
+
types, translators)
|
24
|
+
end
|
25
|
+
|
26
|
+
def all_cb(space_no, index_no, keys, cb, opts={})
|
27
|
+
select_cb(space_no, index_no, keys,
|
28
|
+
opts[:offset] || 0, opts[:limit] || -1,
|
29
|
+
cb, opts)
|
30
|
+
end
|
31
|
+
|
32
|
+
def first_cb(space_no, index_no, key, cb, opts={})
|
33
|
+
select_cb(space_no, index_no, [key], 0, :first, cb, opts)
|
34
|
+
end
|
35
|
+
|
36
|
+
def insert_cb(space_no, tuple, cb, opts={})
|
37
|
+
types = opts[:types] || _detect_types(tuple)
|
38
|
+
_insert(space_no, BOX_ADD, tuple, types, cb, opts[:return_tuple])
|
39
|
+
end
|
40
|
+
|
41
|
+
def replace_cb(space_no, tuple, cb, opts={})
|
42
|
+
types = opts[:types] || _detect_types(tuple)
|
43
|
+
_insert(space_no, BOX_REPLACE, tuple, types, cb, opts[:return_tuple])
|
44
|
+
end
|
45
|
+
|
46
|
+
def update_cb(space_no, pk, operations, cb, opts={})
|
47
|
+
pk = [*pk]
|
48
|
+
pk_types = opts[:pk_types] || _detect_types(pk)
|
49
|
+
returns = opts[:returns] || TYPES_AUTO
|
50
|
+
if Hash === returns && opts[:return_tuple]
|
51
|
+
returns, *translators = _parse_hash_definition(returns)
|
52
|
+
end
|
53
|
+
_update(space_no, pk, operations, returns, pk_types, cb,
|
54
|
+
opts[:return_tuple], translators)
|
55
|
+
end
|
56
|
+
|
57
|
+
def delete_cb(space_no, pk, cb, opts={})
|
58
|
+
pk = [*pk]
|
59
|
+
pk_types = opts[:pk_types] || _detect_types(pk)
|
60
|
+
returns = opts[:returns] || TYPES_AUTO
|
61
|
+
if Hash === returns && opts[:return_tuple]
|
62
|
+
returns, *translators = _parse_hash_definition(returns)
|
63
|
+
end
|
64
|
+
_delete(space_no, pk, returns, pk_types, cb,
|
65
|
+
opts[:return_tuple], translators)
|
66
|
+
end
|
67
|
+
|
68
|
+
def invoke_cb(func_name, values, cb, opts={})
|
69
|
+
opts = opts.dup
|
70
|
+
values = [*values]
|
71
|
+
opts[:types] ||= _detect_types(values)
|
72
|
+
_call(func_name, values, cb, opts)
|
73
|
+
end
|
74
|
+
|
75
|
+
def call_cb(func_name, values, cb, opts={})
|
76
|
+
opts = opts.dup
|
77
|
+
values = [*values]
|
78
|
+
opts[:return_tuple] = true if opts[:return_tuple].nil?
|
79
|
+
opts[:types] ||= _detect_types(values)
|
80
|
+
opts[:returns] ||= TYPES_AUTO
|
81
|
+
if Hash === opts[:returns] && opts[:return_tuple]
|
82
|
+
opts[:returns], *opts[:translators] = _parse_hash_definition(opts[:returns])
|
83
|
+
end
|
84
|
+
_call(func_name, values, cb, opts)
|
85
|
+
end
|
86
|
+
|
87
|
+
def select_blk(space_no, index_no, keys, offset, limit, opts={}, &block)
|
88
|
+
select_cb(space_no, index_no, keys, offset, limit, block, opts)
|
89
|
+
end
|
90
|
+
|
91
|
+
def all_blk(space_no, index_no, keys, opts={}, &block)
|
92
|
+
all_cb(space_no, index_no, keys, block, opts)
|
93
|
+
end
|
94
|
+
|
95
|
+
def first_blk(space_no, index_no, key, opts={}, &block)
|
96
|
+
first_cb(space_no, index_no, key, block, opts)
|
97
|
+
end
|
98
|
+
|
99
|
+
def insert_blk(space_no, tuple, opts={}, &block)
|
100
|
+
insert_cb(space_no, tuple, block, opts)
|
101
|
+
end
|
102
|
+
|
103
|
+
def replace_blk(space_no, tuple, opts={}, &block)
|
104
|
+
replace_cb(space_no, tuple, block, opts)
|
105
|
+
end
|
106
|
+
|
107
|
+
def update_blk(space_no, pk, operation, opts={}, &block)
|
108
|
+
update_cb(space_no, pk, operation, block, opts={})
|
109
|
+
end
|
110
|
+
|
111
|
+
def delete_blk(space_no, pk, opts={}, &block)
|
112
|
+
delete_cb(space_no, pk, block, opts)
|
113
|
+
end
|
114
|
+
|
115
|
+
def invoke_blk(func_name, values, opts={}, &block)
|
116
|
+
invoke_cb(func_name, values, block, opts)
|
117
|
+
end
|
118
|
+
|
119
|
+
def call_blk(func_name, values, opts={}, &block)
|
120
|
+
call_cb(func_name, values, block, opts)
|
121
|
+
end
|
122
|
+
|
123
|
+
def ping_blk(&block)
|
124
|
+
ping_cb(block)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Tarantool
|
2
|
+
class BaseRecord
|
3
|
+
class Select
|
4
|
+
include Enumerable
|
5
|
+
|
6
|
+
attr_reader :record, :params
|
7
|
+
def initialize(record, params={})
|
8
|
+
@record = record
|
9
|
+
@params = params
|
10
|
+
end
|
11
|
+
|
12
|
+
def space_no
|
13
|
+
@record.space_no
|
14
|
+
end
|
15
|
+
|
16
|
+
def results
|
17
|
+
@results ||= begin
|
18
|
+
raise "Condition is not set" unless @params[:where]
|
19
|
+
@record.auto_space.select(
|
20
|
+
@params[:where],
|
21
|
+
@params[:offset] || 0,
|
22
|
+
@params[:limit] || -1
|
23
|
+
)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def each
|
28
|
+
return to_enum unless block_given?
|
29
|
+
results.each{|a| yield a}
|
30
|
+
end
|
31
|
+
|
32
|
+
def call(*args)
|
33
|
+
@record.call(*args)
|
34
|
+
end
|
35
|
+
|
36
|
+
def limit(limit)
|
37
|
+
self.class.new(@record, @params.merge(limit: limit))
|
38
|
+
end
|
39
|
+
|
40
|
+
def offset(offset)
|
41
|
+
self.class.new(@record, @params.merge(offset: offset))
|
42
|
+
end
|
43
|
+
|
44
|
+
def where(params)
|
45
|
+
self.class.new(@record, @params.merge(where: params))
|
46
|
+
end
|
47
|
+
|
48
|
+
def all
|
49
|
+
results.dup
|
50
|
+
end
|
51
|
+
|
52
|
+
def first
|
53
|
+
@record.auto_space.
|
54
|
+
select(@params[:where], @params[:offset] || 0, 1).
|
55
|
+
first
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|