1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
type writer = out_channel
let open_out = open_out
let close_out = close_out
let deflate_string ?(level = 4) str =
let i = De.bigstring_create De.io_buffer_size in
let o = De.bigstring_create De.io_buffer_size in
let w = De.Lz77.make_window ~bits:15 in
let q = De.Queue.create 0x1000 in
let r = Buffer.create 0x1000 in
let p = ref 0 in
let refill buf =
let len = min (String.length str - !p) De.io_buffer_size in
Bigstringaf.blit_from_string str ~src_off:!p buf ~dst_off:0 ~len ;
p := !p + len ;
len
in
let flush buf len =
let str = Bigstringaf.substring buf ~off:0 ~len in
Buffer.add_string r str
in
Zl.Higher.compress ~level ~dynamic:true ~w ~q ~refill ~flush i o ;
Buffer.contents r
let save ~db t =
let str = Marshal.to_string t [] in
let str = deflate_string str in
let str = Base64.encode_string str in
Printf.fprintf db "function sherlodoc_db () { return %S; }\n%!" str
let load _ = failwith "js database format is unsupported"