35
35
(integer? v) :key-integer
36
36
(instance? java.time.Instant v) :inst
37
37
(instance? java.util.Date v) :date
38
- (coll? v) :coll
39
38
(string? v) :string ))
40
39
41
40
; ; map of logical tag -> string used as formatTag in the Bytes record.
46
45
:nil " nl" ; ; TODO: Could use Tag/NONE instead
47
46
:inst " in"
48
47
:date " da"
49
- :coll " co"
50
48
:string " st" })
51
49
52
50
(def true-str " #t" )
204
202
:else
205
203
(primitive-for v)))
206
204
207
- (defn ^Database$Bytes db-key
208
- " Converts k from a Clojure type to a Database$Bytes representation to be used in
209
- cursor functions."
210
- [k]
211
- (cond
212
- (integer? k)
213
- (database-bytes (str k) " ki" ) ; integer keys are stored as strings with 'ki' format tag
214
- :else
215
- (primitive-for k)))
216
-
217
- (defn read-bytes-with-format-tag [^ReadCursor cursor]
218
- (let [bytes-obj (.readBytesObject cursor nil )
219
- str (String. (.value bytes-obj))
220
- fmt-tag (some-> bytes-obj .formatTag String.)]
221
- (cond
222
-
223
- (= fmt-tag (fmt-tag-value :keyword ))
224
- (keyword str)
225
-
226
- (= fmt-tag (fmt-tag-value :boolean ))
227
- (= str true -str)
228
-
229
- (= fmt-tag (fmt-tag-value :key-integer ))
230
- (Integer/parseInt str)
231
-
232
- (= fmt-tag (fmt-tag-value :inst ))
233
- (java.time.Instant/parse str)
234
-
235
- (= fmt-tag (fmt-tag-value :date ))
236
- (java.util.Date/from
237
- (java.time.Instant/parse str))
238
-
239
- (= fmt-tag (fmt-tag-value :nil ))
240
- nil
241
-
242
- :else
243
- str)))
244
-
245
205
(def ^:dynamic *debug?* false )
246
206
247
207
(defn ^WriteCursor coll->ArrayListCursor!
320
280
(let [hash-code (db-key-hash db v)
321
281
cursor (.putCursor whm hash-code)]
322
282
(.writeIfEmpty cursor (v->slot! cursor v))))
323
- (.-cursor whm)))
283
+ (.-cursor whm)))
284
+
285
+ (defn read-bytes-with-format-tag
286
+ " Reads a `BYTES` value (as a string) at `cursor` and converts it to a Clojure type.
287
+ Checks the `formatTag` at cursor to determine the type encoded in the bytes object and
288
+ converts the value to the respective Clojure type (eg. keyword, boolean, instant, date).
289
+ Supported types are in the global constant `fmt-tag-value`.
290
+ If there is no format tag (or it is unknown), returns the value as a string."
291
+ [^ReadCursor cursor]
292
+ (let [bytes-obj (.readBytesObject cursor nil )
293
+ str (String. (.value bytes-obj))
294
+ fmt-tag (some-> bytes-obj .formatTag String.)]
295
+ (cond
296
+
297
+ (= fmt-tag (fmt-tag-value :keyword ))
298
+ (keyword str)
299
+
300
+ (= fmt-tag (fmt-tag-value :boolean ))
301
+ (= str true -str)
302
+
303
+ (= fmt-tag (fmt-tag-value :key-integer ))
304
+ (Integer/parseInt str)
305
+
306
+ (= fmt-tag (fmt-tag-value :inst ))
307
+ (java.time.Instant/parse str)
308
+
309
+ (= fmt-tag (fmt-tag-value :date ))
310
+ (java.util.Date/from
311
+ (java.time.Instant/parse str))
312
+
313
+ (= fmt-tag (fmt-tag-value :nil ))
314
+ nil
315
+
316
+ :else
317
+ str)))
0 commit comments