From a45b3730195692995e817579d6459edf0af87dd5 Mon Sep 17 00:00:00 2001 From: rand00 Date: Mon, 9 May 2022 21:13:32 +0200 Subject: [PATCH 1/5] Migration changing uuids from byte to hex format in db --- bin/migrations/builder_migrations.ml | 1 + bin/migrations/m20220509.ml | 48 ++++++++++++++++++++++++++++ db/representation.ml | 4 +-- 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 bin/migrations/m20220509.ml diff --git a/bin/migrations/builder_migrations.ml b/bin/migrations/builder_migrations.ml index c751981..edcb8bf 100644 --- a/bin/migrations/builder_migrations.ml +++ b/bin/migrations/builder_migrations.ml @@ -178,6 +178,7 @@ let () = actions (module M20210712c); [ f20210910 ]; actions (module M20211105); + actions (module M20220509); ]) |> Cmd.eval |> exit diff --git a/bin/migrations/m20220509.ml b/bin/migrations/m20220509.ml new file mode 100644 index 0000000..59f7983 --- /dev/null +++ b/bin/migrations/m20220509.ml @@ -0,0 +1,48 @@ +let new_version = 16L and old_version = 15L +and identifier = "2022-05-09" +and migrate_doc = "switch uuid encoding to hex" +and rollback_doc = "switch uuid encoding back to binary" + +let old_uuid_rep = + let encode uuid = Ok (Uuidm.to_bytes uuid) in + let decode s = + Uuidm.of_bytes s + |> Option.to_result ~none:"failed to decode uuid" + in + Caqti_type.custom ~encode ~decode Caqti_type.string + +let uuids_byte_encoded_q = + Caqti_request.collect ~oneshot:true + Caqti_type.unit + (Caqti_type.tup2 (Builder_db.Rep.id (`build : [`build])) old_uuid_rep) + "SELECT id, uuid FROM build" + +let uuids_hex_encoded_q = + Caqti_request.collect ~oneshot:true + Caqti_type.unit + (Caqti_type.tup2 (Builder_db.Rep.id (`build : [`build])) Builder_db.Rep.uuid) + "SELECT id, uuid FROM build" + +let migrate_q = + Caqti_request.exec ~oneshot:true + (Caqti_type.tup2 (Builder_db.Rep.id (`build : [`build])) Builder_db.Rep.uuid) + "UPDATE build SET uuid = $2 WHERE id = $1" + +let rollback_q = + Caqti_request.exec ~oneshot:true + (Caqti_type.tup2 (Builder_db.Rep.id (`build : [`build])) old_uuid_rep) + "UPDATE build SET uuid = $2 WHERE id = $1" + +let migrate _datadir (module Db : Caqti_blocking.CONNECTION) = + let open Grej.Infix in + Grej.check_version ~user_version:old_version (module Db) >>= fun () -> + Db.collect_list uuids_byte_encoded_q () >>= fun old_uuids -> + Grej.list_iter_result (Db.exec migrate_q) old_uuids >>= fun () -> + Db.exec (Grej.set_version new_version) () + +let rollback _datadir (module Db : Caqti_blocking.CONNECTION) = + let open Grej.Infix in + Grej.check_version ~user_version:new_version (module Db) >>= fun () -> + Db.collect_list uuids_hex_encoded_q () >>= fun new_uuids -> + Grej.list_iter_result (Db.exec rollback_q) new_uuids >>= fun () -> + Db.exec (Grej.set_version old_version) () diff --git a/db/representation.ml b/db/representation.ml index c95e0cb..4d94b93 100644 --- a/db/representation.ml +++ b/db/representation.ml @@ -36,9 +36,9 @@ type file = { } let uuid = - let encode uuid = Ok (Uuidm.to_bytes uuid) in + let encode uuid = Ok (Uuidm.to_string uuid) in let decode s = - Uuidm.of_bytes s + Uuidm.of_string s |> Option.to_result ~none:"failed to decode uuid" in Caqti_type.custom ~encode ~decode Caqti_type.string From bca4c80127a3cae405653854ed76720ae312a809 Mon Sep 17 00:00:00 2001 From: rand00 Date: Tue, 10 May 2022 14:50:22 +0200 Subject: [PATCH 2/5] Creating index for uuid after migration, and dropping on rollback --- bin/migrations/m20220509.ml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/bin/migrations/m20220509.ml b/bin/migrations/m20220509.ml index 59f7983..699f7f9 100644 --- a/bin/migrations/m20220509.ml +++ b/bin/migrations/m20220509.ml @@ -33,11 +33,20 @@ let rollback_q = (Caqti_type.tup2 (Builder_db.Rep.id (`build : [`build])) old_uuid_rep) "UPDATE build SET uuid = $2 WHERE id = $1" +let create_index = + Caqti_request.exec Caqti_type.unit + "CREATE INDEX idx_build_uuid ON build(uuid);" + +let drop_index = + Caqti_request.exec Caqti_type.unit + "DROP INDEX idx_build_uuid;" + let migrate _datadir (module Db : Caqti_blocking.CONNECTION) = let open Grej.Infix in Grej.check_version ~user_version:old_version (module Db) >>= fun () -> Db.collect_list uuids_byte_encoded_q () >>= fun old_uuids -> Grej.list_iter_result (Db.exec migrate_q) old_uuids >>= fun () -> + Db.exec create_index () >>= fun () -> Db.exec (Grej.set_version new_version) () let rollback _datadir (module Db : Caqti_blocking.CONNECTION) = @@ -45,4 +54,5 @@ let rollback _datadir (module Db : Caqti_blocking.CONNECTION) = Grej.check_version ~user_version:new_version (module Db) >>= fun () -> Db.collect_list uuids_hex_encoded_q () >>= fun new_uuids -> Grej.list_iter_result (Db.exec rollback_q) new_uuids >>= fun () -> + Db.exec drop_index () >>= fun () -> Db.exec (Grej.set_version old_version) () From bfc4e5e64fd80aaf5249b86bbdc9727186a58df1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reynir=20Bj=C3=B6rnsson?= Date: Mon, 16 May 2022 15:57:58 +0200 Subject: [PATCH 3/5] Update m20220509 to new caqti syntax --- bin/migrations/m20220509.ml | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/bin/migrations/m20220509.ml b/bin/migrations/m20220509.ml index 699f7f9..965ef5e 100644 --- a/bin/migrations/m20220509.ml +++ b/bin/migrations/m20220509.ml @@ -3,6 +3,8 @@ and identifier = "2022-05-09" and migrate_doc = "switch uuid encoding to hex" and rollback_doc = "switch uuid encoding back to binary" +open Grej.Infix + let old_uuid_rep = let encode uuid = Ok (Uuidm.to_bytes uuid) in let decode s = @@ -12,34 +14,32 @@ let old_uuid_rep = Caqti_type.custom ~encode ~decode Caqti_type.string let uuids_byte_encoded_q = - Caqti_request.collect ~oneshot:true - Caqti_type.unit - (Caqti_type.tup2 (Builder_db.Rep.id (`build : [`build])) old_uuid_rep) - "SELECT id, uuid FROM build" + Caqti_type.unit ->* + Caqti_type.tup2 (Builder_db.Rep.id (`build : [`build])) old_uuid_rep @@ + "SELECT id, uuid FROM build" let uuids_hex_encoded_q = - Caqti_request.collect ~oneshot:true - Caqti_type.unit - (Caqti_type.tup2 (Builder_db.Rep.id (`build : [`build])) Builder_db.Rep.uuid) - "SELECT id, uuid FROM build" + Caqti_type.unit ->* + Caqti_type.tup2 (Builder_db.Rep.id (`build : [`build])) Builder_db.Rep.uuid @@ + "SELECT id, uuid FROM build" let migrate_q = - Caqti_request.exec ~oneshot:true - (Caqti_type.tup2 (Builder_db.Rep.id (`build : [`build])) Builder_db.Rep.uuid) - "UPDATE build SET uuid = $2 WHERE id = $1" + Caqti_type.tup2 (Builder_db.Rep.id (`build : [`build])) Builder_db.Rep.uuid ->. + Caqti_type.unit @@ + "UPDATE build SET uuid = $2 WHERE id = $1" let rollback_q = - Caqti_request.exec ~oneshot:true - (Caqti_type.tup2 (Builder_db.Rep.id (`build : [`build])) old_uuid_rep) - "UPDATE build SET uuid = $2 WHERE id = $1" + Caqti_type.tup2 (Builder_db.Rep.id (`build : [`build])) old_uuid_rep ->. + Caqti_type.unit @@ + "UPDATE build SET uuid = $2 WHERE id = $1" let create_index = - Caqti_request.exec Caqti_type.unit - "CREATE INDEX idx_build_uuid ON build(uuid);" + Caqti_type.unit ->. Caqti_type.unit @@ + "CREATE INDEX idx_build_uuid ON build(uuid);" let drop_index = - Caqti_request.exec Caqti_type.unit - "DROP INDEX idx_build_uuid;" + Caqti_type.unit ->. Caqti_type.unit @@ + "DROP INDEX idx_build_uuid;" let migrate _datadir (module Db : Caqti_blocking.CONNECTION) = let open Grej.Infix in From da2aa77b53e2a89f2c32c0867369f0efcdb2a1f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reynir=20Bj=C3=B6rnsson?= Date: Tue, 17 May 2022 12:14:39 +0200 Subject: [PATCH 4/5] M20220509 changes * Do not depend on the uuid representation in Builder_db.Rep; instead copy the custom caqti type so the migration doesn't break if Builder_db.Rep changes * We don't need to recreate any indices since we don't change the schema: The uuid column was erroneously VARCHAR(36) before as well(!) --- bin/migrations/m20220509.ml | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/bin/migrations/m20220509.ml b/bin/migrations/m20220509.ml index 965ef5e..1d32490 100644 --- a/bin/migrations/m20220509.ml +++ b/bin/migrations/m20220509.ml @@ -13,6 +13,14 @@ let old_uuid_rep = in Caqti_type.custom ~encode ~decode Caqti_type.string +let new_uuid_rep = + let encode uuid = Ok (Uuidm.to_string uuid) in + let decode s = + Uuidm.of_string s + |> Option.to_result ~none:"failed to decode uuid" + in + Caqti_type.custom ~encode ~decode Caqti_type.string + let uuids_byte_encoded_q = Caqti_type.unit ->* Caqti_type.tup2 (Builder_db.Rep.id (`build : [`build])) old_uuid_rep @@ @@ -20,11 +28,11 @@ let uuids_byte_encoded_q = let uuids_hex_encoded_q = Caqti_type.unit ->* - Caqti_type.tup2 (Builder_db.Rep.id (`build : [`build])) Builder_db.Rep.uuid @@ + Caqti_type.tup2 (Builder_db.Rep.id (`build : [`build])) new_uuid_rep @@ "SELECT id, uuid FROM build" let migrate_q = - Caqti_type.tup2 (Builder_db.Rep.id (`build : [`build])) Builder_db.Rep.uuid ->. + Caqti_type.tup2 (Builder_db.Rep.id (`build : [`build])) new_uuid_rep ->. Caqti_type.unit @@ "UPDATE build SET uuid = $2 WHERE id = $1" @@ -33,20 +41,11 @@ let rollback_q = Caqti_type.unit @@ "UPDATE build SET uuid = $2 WHERE id = $1" -let create_index = - Caqti_type.unit ->. Caqti_type.unit @@ - "CREATE INDEX idx_build_uuid ON build(uuid);" - -let drop_index = - Caqti_type.unit ->. Caqti_type.unit @@ - "DROP INDEX idx_build_uuid;" - let migrate _datadir (module Db : Caqti_blocking.CONNECTION) = let open Grej.Infix in Grej.check_version ~user_version:old_version (module Db) >>= fun () -> Db.collect_list uuids_byte_encoded_q () >>= fun old_uuids -> Grej.list_iter_result (Db.exec migrate_q) old_uuids >>= fun () -> - Db.exec create_index () >>= fun () -> Db.exec (Grej.set_version new_version) () let rollback _datadir (module Db : Caqti_blocking.CONNECTION) = @@ -54,5 +53,4 @@ let rollback _datadir (module Db : Caqti_blocking.CONNECTION) = Grej.check_version ~user_version:new_version (module Db) >>= fun () -> Db.collect_list uuids_hex_encoded_q () >>= fun new_uuids -> Grej.list_iter_result (Db.exec rollback_q) new_uuids >>= fun () -> - Db.exec drop_index () >>= fun () -> Db.exec (Grej.set_version old_version) () From 397eb29d818e4bf6677e36b1e3f19dd47fec9671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reynir=20Bj=C3=B6rnsson?= Date: Tue, 17 May 2022 12:24:24 +0200 Subject: [PATCH 5/5] Update database version --- db/builder_db.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/builder_db.ml b/db/builder_db.ml index 1c44c41..26244e2 100644 --- a/db/builder_db.ml +++ b/db/builder_db.ml @@ -5,7 +5,7 @@ open Caqti_request.Infix let application_id = 1234839235l (* Please update this when making changes! *) -let current_version = 15L +let current_version = 16L type 'a id = 'a Rep.id