slatedb 0.4.2-aarch64-linux-musl

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.
@@ -0,0 +1,174 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SlateDb
4
+ class Reader
5
+ class << self
6
+ # Open a read-only reader at the given path.
7
+ #
8
+ # @param path [String] The path identifier for the database
9
+ # @param url [String, nil] Optional object store URL
10
+ # @param checkpoint_id [String, nil] Optional checkpoint UUID to read at. When
11
+ # given, the reader is pinned to that checkpoint and does not follow new writes.
12
+ # @param follow_latest [Boolean, nil] When true, the reader tails the latest
13
+ # manifest without creating or maintaining its own checkpoint. This performs no
14
+ # object-store writes but provides no protection from garbage collection, so it
15
+ # is best suited to read-only or mirrored databases. Mutually exclusive with
16
+ # +checkpoint_id+. When neither is set (the default), the reader manages its own
17
+ # checkpoint and refreshes it periodically. (Requires SlateDB >= 0.15.0)
18
+ # @param manifest_poll_interval [Integer, nil] Poll interval in milliseconds
19
+ # @param checkpoint_lifetime [Integer, nil] Checkpoint lifetime in milliseconds
20
+ # @param max_memtable_bytes [Integer, nil] Maximum memtable size in bytes
21
+ # @param cache_root [String, nil] Root folder for the reader's local on-disk
22
+ # object-store cache. Setting this enables the cached object store; when it is
23
+ # not set the cache (and `max_open_file_handles`) has no effect.
24
+ # @param max_open_file_handles [Integer, nil] Maximum number of file handles to keep
25
+ # open in the reader's file-handle cache. When the limit is reached, the least
26
+ # recently used handle is closed (default: 1000). Only takes effect when
27
+ # `cache_root` is set. (Requires SlateDB >= 0.13.0)
28
+ # @param merge_operator [Symbol, String, nil] Optional merge operator ("string_concat" or "concat")
29
+ # @yield [reader] If a block is given, yields the reader and ensures it's closed
30
+ # @return [Reader] The opened reader (or block result if block given)
31
+ #
32
+ # @example Open a reader
33
+ # reader = SlateDb::Reader.open("/tmp/mydb")
34
+ # value = reader.get("key")
35
+ # reader.close
36
+ #
37
+ # @example Open with block (auto-close)
38
+ # SlateDb::Reader.open("/tmp/mydb") do |reader|
39
+ # reader.get("key")
40
+ # end # automatically closed
41
+ #
42
+ # @example Open at a specific checkpoint
43
+ # reader = SlateDb::Reader.open("/tmp/mydb", checkpoint_id: "uuid-here")
44
+ #
45
+ # @example Follow the latest state without managing a checkpoint
46
+ # reader = SlateDb::Reader.open("/tmp/mydb", follow_latest: true)
47
+ #
48
+ # @example Enable the on-disk cache and cap its open file handles
49
+ # reader = SlateDb::Reader.open("/tmp/mydb",
50
+ # cache_root: "/var/cache/slatedb",
51
+ # max_open_file_handles: 256)
52
+ #
53
+ def open(path, url: nil, checkpoint_id: nil, follow_latest: nil,
54
+ manifest_poll_interval: nil, checkpoint_lifetime: nil,
55
+ max_memtable_bytes: nil, cache_root: nil, max_open_file_handles: nil,
56
+ merge_operator: nil)
57
+ opts = {}
58
+ opts[:follow_latest] = follow_latest unless follow_latest.nil?
59
+ opts[:manifest_poll_interval] = manifest_poll_interval if manifest_poll_interval
60
+ opts[:checkpoint_lifetime] = checkpoint_lifetime if checkpoint_lifetime
61
+ opts[:max_memtable_bytes] = max_memtable_bytes if max_memtable_bytes
62
+ opts[:cache_root] = cache_root if cache_root
63
+ opts[:max_open_file_handles] = max_open_file_handles if max_open_file_handles
64
+ opts[:merge_operator] = merge_operator.to_s if merge_operator
65
+
66
+ reader = _open(path, url, checkpoint_id, opts)
67
+
68
+ if block_given?
69
+ begin
70
+ yield reader
71
+ ensure
72
+ begin
73
+ reader.close
74
+ rescue StandardError
75
+ nil
76
+ end
77
+ end
78
+ else
79
+ reader
80
+ end
81
+ end
82
+ end
83
+
84
+ # Get a value by key.
85
+ #
86
+ # @param key [String] The key to look up
87
+ # @param durability_filter [String, nil] Filter by durability level ("remote" or "memory")
88
+ # @param dirty [Boolean, nil] Whether to include uncommitted data
89
+ # @param cache_blocks [Boolean, nil] Whether to cache blocks
90
+ # @return [String, nil] The value, or nil if not found
91
+ #
92
+ def get(key, durability_filter: nil, dirty: nil, cache_blocks: nil)
93
+ opts = {}
94
+ opts[:durability_filter] = durability_filter.to_s if durability_filter
95
+ opts[:dirty] = dirty unless dirty.nil?
96
+ opts[:cache_blocks] = cache_blocks unless cache_blocks.nil?
97
+
98
+ if opts.empty?
99
+ _get(key)
100
+ else
101
+ _get_with_options(key, opts)
102
+ end
103
+ end
104
+
105
+ # Scan a range of keys.
106
+ #
107
+ # @param start_key [String] The start key (inclusive)
108
+ # @param end_key [String, nil] The end key (exclusive)
109
+ # @return [Iterator] An iterator over key-value pairs
110
+ #
111
+ def scan(start_key, end_key = nil, durability_filter: nil, dirty: nil,
112
+ read_ahead_bytes: nil, cache_blocks: nil, max_fetch_tasks: nil, &)
113
+ opts = {}
114
+ opts[:durability_filter] = durability_filter.to_s if durability_filter
115
+ opts[:dirty] = dirty unless dirty.nil?
116
+ opts[:read_ahead_bytes] = read_ahead_bytes if read_ahead_bytes
117
+ opts[:cache_blocks] = cache_blocks unless cache_blocks.nil?
118
+ opts[:max_fetch_tasks] = max_fetch_tasks if max_fetch_tasks
119
+
120
+ iter = if opts.empty?
121
+ _scan(start_key, end_key)
122
+ else
123
+ _scan_with_options(start_key, end_key, opts)
124
+ end
125
+
126
+ if block_given?
127
+ iter.each(&)
128
+ else
129
+ iter
130
+ end
131
+ end
132
+
133
+ # Scan all keys with a given prefix.
134
+ #
135
+ # @param prefix [String] The key prefix to scan
136
+ # @param durability_filter [String, nil] Filter by durability level
137
+ # @param dirty [Boolean, nil] Whether to include uncommitted data
138
+ # @param read_ahead_bytes [Integer, nil] Number of bytes to read ahead
139
+ # @param cache_blocks [Boolean, nil] Whether to cache blocks
140
+ # @param max_fetch_tasks [Integer, nil] Maximum number of fetch tasks
141
+ # @param from [String, nil] Inclusive lower bound suffix, appended to the
142
+ # prefix, to start scanning from (e.g. prefix "user:" with from "100"
143
+ # starts at "user:100"). Defaults to the start of the prefix.
144
+ # @param to [String, nil] Exclusive upper bound suffix, appended to the
145
+ # prefix, to stop scanning at. Defaults to the end of the prefix.
146
+ # @return [Iterator] An iterator over key-value pairs
147
+ #
148
+ def scan_prefix(prefix, durability_filter: nil, dirty: nil,
149
+ read_ahead_bytes: nil, cache_blocks: nil, max_fetch_tasks: nil,
150
+ from: nil, to: nil, &)
151
+ opts = {
152
+ durability_filter: durability_filter&.to_s,
153
+ dirty: dirty,
154
+ read_ahead_bytes: read_ahead_bytes,
155
+ cache_blocks: cache_blocks,
156
+ max_fetch_tasks: max_fetch_tasks,
157
+ subrange_from: from,
158
+ subrange_to: to
159
+ }.compact
160
+
161
+ iter = if opts.empty?
162
+ _scan_prefix(prefix)
163
+ else
164
+ _scan_prefix_with_options(prefix, opts)
165
+ end
166
+
167
+ if block_given?
168
+ iter.each(&)
169
+ else
170
+ iter
171
+ end
172
+ end
173
+ end
174
+ end
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SlateDb
4
+ class Snapshot
5
+ # Get a value by key from the snapshot.
6
+ #
7
+ # @param key [String] The key to look up
8
+ # @param durability_filter [String, nil] Filter by durability level
9
+ # @param dirty [Boolean, nil] Whether to include uncommitted data
10
+ # @param cache_blocks [Boolean, nil] Whether to cache blocks
11
+ # @return [String, nil] The value, or nil if not found
12
+ #
13
+ def get(key, durability_filter: nil, dirty: nil, cache_blocks: nil)
14
+ opts = {}
15
+ opts[:durability_filter] = durability_filter.to_s if durability_filter
16
+ opts[:dirty] = dirty unless dirty.nil?
17
+ opts[:cache_blocks] = cache_blocks unless cache_blocks.nil?
18
+
19
+ if opts.empty?
20
+ _get(key)
21
+ else
22
+ _get_with_options(key, opts)
23
+ end
24
+ end
25
+
26
+ # Scan a range of keys from the snapshot.
27
+ #
28
+ # @param start_key [String] The start key (inclusive)
29
+ # @param end_key [String, nil] The end key (exclusive)
30
+ # @return [Iterator] An iterator over key-value pairs
31
+ #
32
+ def scan(start_key, end_key = nil, durability_filter: nil, dirty: nil,
33
+ read_ahead_bytes: nil, cache_blocks: nil, max_fetch_tasks: nil, &)
34
+ opts = {}
35
+ opts[:durability_filter] = durability_filter.to_s if durability_filter
36
+ opts[:dirty] = dirty unless dirty.nil?
37
+ opts[:read_ahead_bytes] = read_ahead_bytes if read_ahead_bytes
38
+ opts[:cache_blocks] = cache_blocks unless cache_blocks.nil?
39
+ opts[:max_fetch_tasks] = max_fetch_tasks if max_fetch_tasks
40
+
41
+ iter = if opts.empty?
42
+ _scan(start_key, end_key)
43
+ else
44
+ _scan_with_options(start_key, end_key, opts)
45
+ end
46
+
47
+ if block_given?
48
+ iter.each(&)
49
+ else
50
+ iter
51
+ end
52
+ end
53
+
54
+ # Scan all keys with a given prefix from the snapshot.
55
+ #
56
+ # @param prefix [String] The key prefix to scan
57
+ # @param durability_filter [String, nil] Filter by durability level
58
+ # @param dirty [Boolean, nil] Whether to include uncommitted data
59
+ # @param read_ahead_bytes [Integer, nil] Number of bytes to read ahead
60
+ # @param cache_blocks [Boolean, nil] Whether to cache blocks
61
+ # @param max_fetch_tasks [Integer, nil] Maximum number of fetch tasks
62
+ # @param from [String, nil] Inclusive lower bound suffix, appended to the
63
+ # prefix, to start scanning from. Defaults to the start of the prefix.
64
+ # @param to [String, nil] Exclusive upper bound suffix, appended to the
65
+ # prefix, to stop scanning at. Defaults to the end of the prefix.
66
+ # @return [Iterator] An iterator over key-value pairs
67
+ #
68
+ def scan_prefix(prefix, durability_filter: nil, dirty: nil,
69
+ read_ahead_bytes: nil, cache_blocks: nil, max_fetch_tasks: nil,
70
+ from: nil, to: nil, &)
71
+ opts = {
72
+ durability_filter: durability_filter&.to_s,
73
+ dirty: dirty,
74
+ read_ahead_bytes: read_ahead_bytes,
75
+ cache_blocks: cache_blocks,
76
+ max_fetch_tasks: max_fetch_tasks,
77
+ subrange_from: from,
78
+ subrange_to: to
79
+ }.compact
80
+
81
+ iter = if opts.empty?
82
+ _scan_prefix(prefix)
83
+ else
84
+ _scan_prefix_with_options(prefix, opts)
85
+ end
86
+
87
+ if block_given?
88
+ iter.each(&)
89
+ else
90
+ iter
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,182 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SlateDb
4
+ class Transaction
5
+ # Get a value by key within the transaction.
6
+ #
7
+ # @param key [String] The key to look up
8
+ # @param durability_filter [String, nil] Filter by durability level
9
+ # @param dirty [Boolean, nil] Whether to include uncommitted data
10
+ # @param cache_blocks [Boolean, nil] Whether to cache blocks
11
+ # @return [String, nil] The value, or nil if not found
12
+ #
13
+ def get(key, durability_filter: nil, dirty: nil, cache_blocks: nil)
14
+ opts = {}
15
+ opts[:durability_filter] = durability_filter.to_s if durability_filter
16
+ opts[:dirty] = dirty unless dirty.nil?
17
+ opts[:cache_blocks] = cache_blocks unless cache_blocks.nil?
18
+
19
+ if opts.empty?
20
+ _get(key)
21
+ else
22
+ _get_with_options(key, opts)
23
+ end
24
+ end
25
+
26
+ # Store a key-value pair within the transaction.
27
+ #
28
+ # @param key [String] The key to store
29
+ # @param value [String] The value to store
30
+ # @param ttl [Integer, nil] Time-to-live in milliseconds
31
+ # @return [void]
32
+ #
33
+ def put(key, value, ttl: nil)
34
+ if ttl
35
+ _put_with_options(key, value, { ttl: ttl })
36
+ else
37
+ _put(key, value)
38
+ end
39
+ end
40
+
41
+ # Delete a key within the transaction.
42
+ #
43
+ # @param key [String] The key to delete
44
+ # @return [void]
45
+ #
46
+ def delete(key)
47
+ _delete(key)
48
+ end
49
+
50
+ # Merge a value within the transaction.
51
+ #
52
+ # @param key [String] The key to merge into
53
+ # @param value [String] The merge operand to apply
54
+ # @param ttl [Integer, nil] Time-to-live in milliseconds
55
+ # @return [void]
56
+ #
57
+ def merge(key, value, ttl: nil)
58
+ if ttl
59
+ _merge_with_options(key, value, { ttl: ttl })
60
+ else
61
+ _merge(key, value)
62
+ end
63
+ end
64
+
65
+ # Scan a range of keys within the transaction.
66
+ #
67
+ # @param start_key [String] The start key (inclusive)
68
+ # @param end_key [String, nil] The end key (exclusive)
69
+ # @return [Iterator] An iterator over key-value pairs
70
+ #
71
+ def scan(start_key, end_key = nil, durability_filter: nil, dirty: nil,
72
+ read_ahead_bytes: nil, cache_blocks: nil, max_fetch_tasks: nil, &)
73
+ opts = {}
74
+ opts[:durability_filter] = durability_filter.to_s if durability_filter
75
+ opts[:dirty] = dirty unless dirty.nil?
76
+ opts[:read_ahead_bytes] = read_ahead_bytes if read_ahead_bytes
77
+ opts[:cache_blocks] = cache_blocks unless cache_blocks.nil?
78
+ opts[:max_fetch_tasks] = max_fetch_tasks if max_fetch_tasks
79
+
80
+ iter = if opts.empty?
81
+ _scan(start_key, end_key)
82
+ else
83
+ _scan_with_options(start_key, end_key, opts)
84
+ end
85
+
86
+ if block_given?
87
+ iter.each(&)
88
+ else
89
+ iter
90
+ end
91
+ end
92
+
93
+ # Scan all keys with a given prefix within the transaction.
94
+ #
95
+ # @param prefix [String] The key prefix to scan
96
+ # @param durability_filter [String, nil] Filter by durability level
97
+ # @param dirty [Boolean, nil] Whether to include uncommitted data
98
+ # @param read_ahead_bytes [Integer, nil] Number of bytes to read ahead
99
+ # @param cache_blocks [Boolean, nil] Whether to cache blocks
100
+ # @param max_fetch_tasks [Integer, nil] Maximum number of fetch tasks
101
+ # @param from [String, nil] Inclusive lower bound suffix, appended to the
102
+ # prefix, to start scanning from. Defaults to the start of the prefix.
103
+ # @param to [String, nil] Exclusive upper bound suffix, appended to the
104
+ # prefix, to stop scanning at. Defaults to the end of the prefix.
105
+ # @return [Iterator] An iterator over key-value pairs
106
+ #
107
+ def scan_prefix(prefix, durability_filter: nil, dirty: nil,
108
+ read_ahead_bytes: nil, cache_blocks: nil, max_fetch_tasks: nil,
109
+ from: nil, to: nil, &)
110
+ opts = {
111
+ durability_filter: durability_filter&.to_s,
112
+ dirty: dirty,
113
+ read_ahead_bytes: read_ahead_bytes,
114
+ cache_blocks: cache_blocks,
115
+ max_fetch_tasks: max_fetch_tasks,
116
+ subrange_from: from,
117
+ subrange_to: to
118
+ }.compact
119
+
120
+ iter = if opts.empty?
121
+ _scan_prefix(prefix)
122
+ else
123
+ _scan_prefix_with_options(prefix, opts)
124
+ end
125
+
126
+ if block_given?
127
+ iter.each(&)
128
+ else
129
+ iter
130
+ end
131
+ end
132
+
133
+ # Mark keys as read for conflict detection.
134
+ #
135
+ # This explicitly tracks reads for conflict checking in serializable isolation,
136
+ # allowing selective read-write conflict detection even when keys weren't
137
+ # actually read via get().
138
+ #
139
+ # @param keys [Array<String>] The keys to mark as read
140
+ # @return [void]
141
+ #
142
+ # @example Mark keys for conflict detection
143
+ # db.transaction(isolation: :serializable) do |txn|
144
+ # txn.mark_read(["key1", "key2"])
145
+ # # These keys will now be checked for conflicts on commit
146
+ # txn.put("key3", "value")
147
+ # end
148
+ #
149
+ def mark_read(keys)
150
+ _mark_read(Array(keys))
151
+ end
152
+
153
+ # Commit the transaction.
154
+ #
155
+ # @param await_durable [Boolean, nil] Whether to wait for durability (default: true)
156
+ # @param seqnum [Integer, nil] User-supplied sequence number for the commit.
157
+ # When provided (and non-zero), it is used instead of the internally
158
+ # generated sequence number and must be strictly greater than the current
159
+ # maximum sequence number. (Requires SlateDB >= 0.13.0)
160
+ # @return [void]
161
+ #
162
+ # @example Commit a transaction
163
+ # txn = db.begin_transaction
164
+ # txn.put("key", "value")
165
+ # txn.commit
166
+ #
167
+ # @example Commit with an explicit sequence number
168
+ # txn.commit(seqnum: 99)
169
+ #
170
+ def commit(await_durable: nil, seqnum: nil)
171
+ opts = {}
172
+ opts[:await_durable] = await_durable unless await_durable.nil?
173
+ opts[:seqnum] = seqnum if seqnum
174
+
175
+ if opts.empty?
176
+ _commit
177
+ else
178
+ _commit_with_options(opts)
179
+ end
180
+ end
181
+ end
182
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SlateDb
4
+ VERSION = "0.4.2"
5
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SlateDb
4
+ class WriteBatch
5
+ # Add a put operation to the batch.
6
+ #
7
+ # @param key [String] The key to store
8
+ # @param value [String] The value to store
9
+ # @param ttl [Integer, nil] Time-to-live in milliseconds
10
+ # @return [self] Returns self for method chaining
11
+ #
12
+ # @example
13
+ # batch.put("key", "value")
14
+ # batch.put("key2", "value2", ttl: 60_000)
15
+ #
16
+ def put(key, value, ttl: nil)
17
+ if ttl
18
+ _put_with_options(key, value, { ttl: ttl })
19
+ else
20
+ _put(key, value)
21
+ end
22
+ self
23
+ end
24
+
25
+ # Add a delete operation to the batch.
26
+ #
27
+ # @param key [String] The key to delete
28
+ # @return [self] Returns self for method chaining
29
+ #
30
+ # @example
31
+ # batch.delete("key")
32
+ #
33
+ def delete(key)
34
+ _delete(key)
35
+ self
36
+ end
37
+
38
+ # Add a merge operation to the batch.
39
+ #
40
+ # @param key [String] The key to merge into
41
+ # @param value [String] The merge operand to apply
42
+ # @param ttl [Integer, nil] Time-to-live in milliseconds
43
+ # @return [self] Returns self for method chaining
44
+ #
45
+ # @example
46
+ # batch.merge("key", "part1")
47
+ # batch.merge("key", "part2", ttl: 30_000)
48
+ #
49
+ def merge(key, value, ttl: nil)
50
+ if ttl
51
+ _merge_with_options(key, value, { ttl: ttl })
52
+ else
53
+ _merge(key, value)
54
+ end
55
+ self
56
+ end
57
+ end
58
+ end
data/lib/slatedb.rb ADDED
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "slatedb/version"
4
+
5
+ # Load the native extension
6
+ begin
7
+ RUBY_VERSION =~ /(\d+\.\d+)/
8
+ require "slatedb/#{Regexp.last_match(1)}/slatedb"
9
+ rescue LoadError
10
+ require "slatedb/slatedb"
11
+ end
12
+
13
+ # Load Ruby class extensions
14
+ require_relative "slatedb/database"
15
+ require_relative "slatedb/iterator"
16
+ require_relative "slatedb/write_batch"
17
+ require_relative "slatedb/transaction"
18
+ require_relative "slatedb/snapshot"
19
+ require_relative "slatedb/reader"
20
+ require_relative "slatedb/admin"
21
+ require_relative "slatedb/metrics"
metadata ADDED
@@ -0,0 +1,121 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: slatedb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.2
5
+ platform: aarch64-linux-musl
6
+ authors:
7
+ - SlateDB Contributors
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2026-08-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '13.4'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '13.4'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake-compiler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.13'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.13'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.86'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.86'
69
+ description: A cloud-native embedded key-value store built on object storage
70
+ email:
71
+ - slatedb@example.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - LICENSE
77
+ - README.md
78
+ - lib/slatedb.rb
79
+ - lib/slatedb/3.3/slatedb.so
80
+ - lib/slatedb/3.4/slatedb.so
81
+ - lib/slatedb/4.0/slatedb.so
82
+ - lib/slatedb/admin.rb
83
+ - lib/slatedb/database.rb
84
+ - lib/slatedb/iterator.rb
85
+ - lib/slatedb/metrics.rb
86
+ - lib/slatedb/reader.rb
87
+ - lib/slatedb/snapshot.rb
88
+ - lib/slatedb/transaction.rb
89
+ - lib/slatedb/version.rb
90
+ - lib/slatedb/write_batch.rb
91
+ homepage: https://github.com/catkins/slatedb-rb
92
+ licenses:
93
+ - Apache-2.0
94
+ metadata:
95
+ homepage_uri: https://github.com/catkins/slatedb-rb
96
+ source_code_uri: https://github.com/catkins/slatedb-rb
97
+ changelog_uri: https://github.com/catkins/slatedb-rb/blob/main/CHANGELOG.md
98
+ rubygems_mfa_required: 'true'
99
+ post_install_message:
100
+ rdoc_options: []
101
+ require_paths:
102
+ - lib
103
+ required_ruby_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '3.3'
108
+ - - "<"
109
+ - !ruby/object:Gem::Version
110
+ version: 4.1.dev
111
+ required_rubygems_version: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: 3.3.22
116
+ requirements: []
117
+ rubygems_version: 3.5.23
118
+ signing_key:
119
+ specification_version: 4
120
+ summary: Ruby bindings for SlateDB
121
+ test_files: []