statelydb 0.1.1 → 0.1.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5716a868b12a20de48e33bddf16396bac216172edc29ee5302eb3477380c7943
4
- data.tar.gz: 98ca1b24cd5bdaa79409de8bf36e10bc573bc6c0b80bf8194bb08eeddc91cf0a
3
+ metadata.gz: b4c1af818c57771a88c10b8f489b0a073816dab122d462b54a0238cf593b7c11
4
+ data.tar.gz: 388b5a8cb32e8f9e18f0dd6195b230877bf20d6c91adf959cbd1e2a04a40db3a
5
5
  SHA512:
6
- metadata.gz: 13a52d97a5ac5c309a3249dcbd1f5cb15392edc40c87a65a34064be54dfc44e5d6dd5ed6bff63fd4793f6e85297dbff92660fdc50a490d994c4af41e4ed9159c
7
- data.tar.gz: cb8ce77af551b2c015c06ab75114517fe05376c26f1d8b228dde017b25da3685d7d8ee551bc140b50dc15fe06982618d485aab43dc88e7f63ebd47bdbd04769c
6
+ metadata.gz: 766faff6f9a61e837b38d1e02f94adde711829efa68495952cf0ed934a16d61db2f4aa1cf371bbd8775ececea60baa45dd427a6497e2a729a7f5da43c7460085
7
+ data.tar.gz: 8430e4a08b529353175e44a62677f8739deb85e9c934d414d0a87d6b29e0071d13446289efb20189d511bc33c0fed7e317ad455cc6027ee79a06a747f5865dcd
data/lib/error.rb CHANGED
@@ -56,7 +56,7 @@ module StatelyDB
56
56
  end
57
57
  end
58
58
 
59
- new(error.message, code: GRPC::Codes::StatusCodes::Unknown, stately_code: "Unknown", cause: error)
59
+ new(error.message, code: GRPC::Core::StatusCodes::UNKNOWN, stately_code: "Unknown", cause: error)
60
60
  end
61
61
  end
62
62
  end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StatelyCode
4
+ # StoreRequestLimitExceeded indicates that an attempt to modify a Store has
5
+ # been temporarily rejected due to exceeding global modification limits.
6
+ # StatelyDB has been notified about this error and will take necessary
7
+ # actions to correct it. In the event that the issue has not been resolved,
8
+ # please contact support.
9
+ #
10
+ # - Retryable? Yes.
11
+ STORE_REQUEST_LIMIT_EXCEEDED = "StoreRequestLimitExceeded"
12
+
13
+ # StoreThroughputExceeded indicates that the underlying Store does not have
14
+ # resources to complete the request. This may indicate a request rate is too
15
+ # high to a specific Group or that a sudden burst of traffic has exceeded a
16
+ # Store's provisioned capacity.
17
+ #
18
+ # - Retryable? Yes.
19
+ # With an exponential backoff.
20
+ STORE_THROUGHPUT_EXCEEDED = "StoreThroughputExceeded"
21
+
22
+ # ConditionalCheckFailed indicates that conditions provided to perform an
23
+ # operation were not met. For example, a condition to write an item only if
24
+ # it does not already exist. In the future StatelyDB may provide more
25
+ # information about the failed condition; if this feature is a blocker,
26
+ # please contact support.
27
+ #
28
+ # - Retryable? No.
29
+ # Typically a conditional check failure is not retryable
30
+ # unless the conditions for the operation are changed.
31
+ CONDITIONAL_CHECK_FAILED = "ConditionalCheckFailed"
32
+
33
+ # NonRecoverableTransaction indicates that conditions required for the
34
+ # transaction to succeed are not possible to meet with the current state of
35
+ # the system. This can occur when an Item has more than one key-path, and is
36
+ # written with a "must not exist" condition (e.g. with ID Generation on one
37
+ # of the keys) but another keys already maps to an existing item in the
38
+ # store. Permitting such a write would result in conflicting state; two
39
+ # independent records with aliases pointing to the same item.
40
+ #
41
+ # - Retryable? No.
42
+ NON_RECOVERABLE_TRANSACTION = "NonRecoverableTransaction"
43
+
44
+ # ConcurrentModification indicates the current transaction was aborted
45
+ # because of a non-serializable interaction with another transaction was
46
+ # detected, a stale read was detected, or because attempts to resolve an
47
+ # otherwise serializable interaction have exceeded the maximum number of
48
+ # internal resolution retries. Examples:
49
+ #
50
+ # 1. TransactionA and TransactionB are opened concurrently. TransactionA
51
+ # reads ItemX, puts ItemY. Before transactionA can commit, transactionB
52
+ # writes ItemX and commits. When transactionA tries to commit, it will fail
53
+ # with ConcurrentModification because the read of ItemX in transactionA is
54
+ # no longer valid. That is, the data in ItemX which leads to the decision to
55
+ # put ItemY may have changed, and thus a conflict is detected.
56
+ #
57
+ # 2. TransactionA is opened which writes ItemA with an initialValue field (a
58
+ # field used for ID assignment) -- the generated ID is returned to the
59
+ # client. transactionB also performs a on an item which resolves to the same
60
+ # initialValue, transactionB is committed first. Since transactionA may have
61
+ # acted on the generatedID (e.g. written in a different record), it will be
62
+ # aborted because the ID is no longer valid for the item it was intended
63
+ # for.
64
+ #
65
+ # 3. A read or list operation detected that underlying data has changed
66
+ # since the transaction began.
67
+ #
68
+ # - Retryable? Yes.
69
+ # This error is immediately retryable.
70
+ CONCURRENT_MODIFICATION = "ConcurrentModification"
71
+
72
+ # StoreInUse indicates that the underlying Store is currently in being
73
+ # updated and cannot be modified until the operation in progress has
74
+ # completed.
75
+ #
76
+ # - Retryable? Yes.
77
+ # This can be retried with backoff.
78
+ STORE_IN_USE = "StoreInUse"
79
+ end
data/lib/statelydb.rb CHANGED
@@ -240,8 +240,11 @@ module StatelyDB
240
240
  rescue Exception => e
241
241
  txn.abort
242
242
 
243
+ # All gRPC errors inherit from GRPC::BadStatus. We wrap these in a StatelyDB::Error.
244
+ raise StatelyDB::Error.from(e) if e.is_a? GRPC::BadStatus
245
+
243
246
  # Calling raise with no parameters re-raises the original exception
244
- raise StatelyDB::Error.from(e)
247
+ raise
245
248
  end
246
249
 
247
250
  private
@@ -239,7 +239,7 @@ module StatelyDB
239
239
  # for the items will be returned while inside the transaction block.
240
240
  #
241
241
  # @param items [StatelyDB::Item, Array<StatelyDB::Item>] the items to store
242
- # @return [Array<String>] the key paths of the items
242
+ # @return [Array<StatelyDB::UUID, String, Integer, nil>] the ids of the items
243
243
  #
244
244
  # @example
245
245
  # results = client.data.transaction do |txn|
@@ -261,7 +261,17 @@ module StatelyDB
261
261
  )
262
262
 
263
263
  resp = request_response(req).put_ack
264
- resp.generated_ids.map(&:value)
264
+ resp.generated_ids.map do |generated_id|
265
+ case generated_id.value
266
+ when :bytes
267
+ StatelyDB::UUID.valid_uuid?(generated_id.bytes) ? StatelyDB::UUID.parse(generated_id.bytes) : generated_id.bytes
268
+ when :uint
269
+ generated_id.uint
270
+ else # rubocop:disable Style/EmptyElse
271
+ # An empty identifier is sent in the transaction Put response if an initialValue is not set
272
+ nil
273
+ end
274
+ end
265
275
  end
266
276
 
267
277
  # Delete one or more Items from a StatelyDB Store at the given key_paths. Results are not returned until the transaction is
data/lib/uuid.rb CHANGED
@@ -48,6 +48,12 @@ module StatelyDB
48
48
  to_s <=> other.to_s
49
49
  end
50
50
 
51
+ # Returns true if the UUID is empty.
52
+ # @return [Boolean]
53
+ def empty?
54
+ @byte_string.empty?
55
+ end
56
+
51
57
  # Parses a base16 string (eg: "f4a8a24a-129d-411f-91d2-6d19d0eaa096") into a UUID object.
52
58
  # The string can be the following:
53
59
  # 1. Encoded as Encoding::ASCII_8BIT (also aliased as Encoding::BINARY) and be 16 bytes long.
@@ -56,7 +62,9 @@ module StatelyDB
56
62
  # base16-formatted UUID string.
57
63
  # @return [StatelyDB::UUID]
58
64
  def self.parse(byte_string)
59
- if byte_string.encoding == Encoding::BINARY && byte_string.bytesize == 16
65
+ return byte_string if byte_string.is_a?(StatelyDB::UUID)
66
+
67
+ if valid_uuid?(byte_string)
60
68
  return new(byte_string)
61
69
  elsif byte_string.match(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i)
62
70
  return new([byte_string.delete("-")].pack("H*"))
@@ -64,5 +72,12 @@ module StatelyDB
64
72
 
65
73
  raise "Invalid UUID"
66
74
  end
75
+
76
+ # Not all bytes values in StatelyDB are UUIDs. This method checks if a byte string is a valid UUID.
77
+ # @param [String] byte_string A binary-encoded string (eg: Encoding::ASCII_8BIT encoding)
78
+ # @return [Boolean]
79
+ def self.valid_uuid?(byte_string)
80
+ byte_string.encoding == Encoding::BINARY && byte_string.bytesize == 16
81
+ end
67
82
  end
68
83
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: statelydb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stately Cloud, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-08-28 00:00:00.000000000 Z
11
+ date: 2024-09-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async
@@ -79,6 +79,7 @@ files:
79
79
  - lib/common/net/conn.rb
80
80
  - lib/error.rb
81
81
  - lib/key_path.rb
82
+ - lib/stately_codes.rb
82
83
  - lib/statelydb.rb
83
84
  - lib/token.rb
84
85
  - lib/transaction/queue.rb