@@ -86,12 +86,6 @@ let create_table db table =
8686 (key TEXT, value BYTEA, PRIMARY KEY(key))" table
8787 in exec db query [] >> Lwt. return ()
8888
89- let insert db table key value =
90- let query = sprintf " INSERT INTO %s VALUES ( $1 , $2 )
91- ON CONFLICT ( key ) DO UPDATE SET value = $2 " table
92- (* TODO: compatibility with < 9.5*)
93- in exec db query [key; marshal value] >> Lwt. return ()
94-
9589
9690type store = string
9791
@@ -103,17 +97,23 @@ type 'a t = {
10397let open_store store = use_pool @@ fun db ->
10498 create_table db store >> Lwt. return store
10599
106- let make_persistent ~store ~name ~default = use_pool @@ fun db ->
107- insert db store name default >> Lwt. return {store = store; name = name}
100+ let make_persistent_worker ~store ~name ~default db =
101+ let query = sprintf " INSERT INTO %s VALUES ( $1 , $2 )
102+ ON CONFLICT ( key ) DO NOTHING" store in
103+ (* TODO: compatibility with < 9.5*)
104+ exec db query [name; marshal default] >> Lwt. return {store; name}
105+
106+ let make_persistent ~store ~name ~default =
107+ use_pool @@ fun db -> make_persistent_worker ~store ~name ~default db
108108
109109let make_persistent_lazy_lwt ~store ~name ~default = use_pool @@ fun db ->
110- let query = sprintf " SELECT value FROM %s WHERE key = $1 " store in
110+ let query = sprintf " SELECT 1 FROM %s WHERE key = $1 " store in
111111 lwt result = exec db query [name] in
112112 match result with
113113 | [] ->
114114 lwt default = default () in
115- make_persistent ~store ~name ~default
116- | xs -> Lwt. return {store = store; name = name}
115+ make_persistent_worker ~store ~name ~default db
116+ | _ -> Lwt. return {store = store; name = name}
117117
118118let make_persistent_lazy ~store ~name ~default =
119119 let default () = Lwt. wrap default in
@@ -139,7 +139,10 @@ let find table key = use_pool @@ fun db ->
139139 Lwt. map (unmarshal @. one) (exec db query [key])
140140
141141let add table key value = use_pool @@ fun db ->
142- insert db table key value
142+ let query = sprintf " INSERT INTO %s VALUES ( $1 , $2 )
143+ ON CONFLICT ( key ) DO UPDATE SET value = $2 " table
144+ (* TODO: compatibility with < 9.5*)
145+ in exec db query [key; marshal value] >> Lwt. return ()
143146
144147let replace_if_exists table key value = use_pool @@ fun db ->
145148 let query = sprintf " UPDATE %s SET value = $2 WHERE key = $1 RETURNING 0" table in
0 commit comments