diff --git a/ansible/vars.yml b/ansible/vars.yml index f394fcf1e..e3c0186f0 100644 --- a/ansible/vars.yml +++ b/ansible/vars.yml @@ -10,9 +10,9 @@ postgres_major: # Full version strings for each major version postgres_release: - postgresorioledb-17: "17.5.1.065-orioledb" - postgres17: "17.6.1.044" - postgres15: "15.14.1.044" + postgresorioledb-17: "17.5.1.066-orioledb" + postgres17: "17.6.1.045" + postgres15: "15.14.1.045" # Non Postgres Extensions pgbouncer_release: 1.19.0 diff --git a/nix/ext/tests/default.nix b/nix/ext/tests/default.nix index e1401c004..e99278e4e 100644 --- a/nix/ext/tests/default.nix +++ b/nix/ext/tests/default.nix @@ -224,6 +224,7 @@ builtins.listToAttrs ( "pgaudit" "pg_tle" "vector" + "wal2json" "wrappers" ] ) diff --git a/nix/ext/versions.json b/nix/ext/versions.json index 0d2cc30db..a6b9a47dc 100644 --- a/nix/ext/versions.json +++ b/nix/ext/versions.json @@ -757,5 +757,14 @@ ], "hash": "sha256-crxj5R9jblIv0h8lpqddAoYe2UqgUlnvbOajKTzVces=" } + }, + "wal2json": { + "2.6": { + "postgresql": [ + "15", + "17" + ], + "hash": "sha256-+QoACPCKiFfuT2lJfSUmgfzC5MXf75KpSoc2PzPxKyM=" + } } } diff --git a/nix/ext/wal2json.nix b/nix/ext/wal2json.nix index deba7f1c6..f66e689d4 100644 --- a/nix/ext/wal2json.nix +++ b/nix/ext/wal2json.nix @@ -1,35 +1,106 @@ { + pkgs, lib, stdenv, fetchFromGitHub, postgresql, + makeWrapper, }: -stdenv.mkDerivation rec { +let pname = "wal2json"; - version = "2_6"; + build = + version: rev: hash: + stdenv.mkDerivation rec { + inherit version pname; - src = fetchFromGitHub { - owner = "eulerto"; - repo = "wal2json"; - rev = "wal2json_${builtins.replaceStrings [ "." ] [ "_" ] version}"; - hash = "sha256-+QoACPCKiFfuT2lJfSUmgfzC5MXf75KpSoc2PzPxKyM="; - }; + src = fetchFromGitHub { + owner = "eulerto"; + repo = "wal2json"; + rev = "wal2json_${builtins.replaceStrings [ "." ] [ "_" ] version}"; + inherit hash; + }; + + buildInputs = [ postgresql ]; + + makeFlags = [ "USE_PGXS=1" ]; + + installPhase = '' + runHook preInstall + + mkdir -p $out/share/postgresql/extension + + # Install versioned library + install -Dm755 ${pname}${postgresql.dlSuffix} $out/lib/${pname}-${version}${postgresql.dlSuffix} + if [[ "${version}" == "${latestVersion}" ]]; then + cp sql/*.sql $out/share/postgresql/extension/ + fi + + touch $out/share/postgresql/extension/${pname}--${version}.control + touch $out/share/postgresql/extension/${pname}--${version}.sql + + runHook postInstall + ''; + + meta = with lib; { + description = "PostgreSQL JSON output plugin for changeset extraction"; + homepage = "https://github.com/eulerto/wal2json"; + changelog = "https://github.com/eulerto/wal2json/releases/"; + platforms = postgresql.meta.platforms; + license = licenses.bsd3; + }; + }; + allVersions = (builtins.fromJSON (builtins.readFile ./versions.json)).wal2json; + supportedVersions = lib.filterAttrs ( + _: value: builtins.elem (lib.versions.major postgresql.version) value.postgresql + ) allVersions; + versions = lib.naturalSort (lib.attrNames supportedVersions); + latestVersion = lib.last versions; + numberOfVersions = builtins.length versions; + packages = builtins.attrValues ( + lib.mapAttrs (name: value: build name value.rev value.hash) supportedVersions + ); +in +pkgs.buildEnv { + name = pname; + paths = packages; + nativeBuildInputs = [ makeWrapper ]; + pathsToLink = [ + "/lib" + "/share/postgresql/extension" + ]; + postBuild = '' + ln -sfn ${pname}-${latestVersion}${postgresql.dlSuffix} $out/lib/${pname}${postgresql.dlSuffix} - buildInputs = [ postgresql ]; + { + echo "default_version = '${latestVersion}'" + } > $out/share/postgresql/extension/${pname}.control - makeFlags = [ "USE_PGXS=1" ]; + # Create empty upgrade files between consecutive versions + # plpgsql_check ships without upgrade scripts - extensions are backward-compatible + previous_version="" + for ver in ${lib.concatStringsSep " " versions}; do + if [[ -n "$previous_version" ]]; then + touch $out/share/postgresql/extension/${pname}--''${previous_version}--''${ver}.sql + fi + previous_version=$ver + done - installPhase = '' - install -D -t $out/lib *${postgresql.dlSuffix} - install -D -t $out/share/postgresql/extension sql/*.sql + # checks + (set -x + test "$(ls -A $out/lib/${pname}*${postgresql.dlSuffix} | wc -l)" = "${ + toString (numberOfVersions + 1) + }" + ) ''; - meta = with lib; { - description = "PostgreSQL JSON output plugin for changeset extraction"; - homepage = "https://github.com/eulerto/wal2json"; - changelog = "https://github.com/eulerto/wal2json/releases/tag/wal2json_${version}"; - platforms = postgresql.meta.platforms; - license = licenses.bsd3; + passthru = { + inherit versions numberOfVersions; + pname = "${pname}-all"; + version = + "multi-" + lib.concatStringsSep "-" (map (v: lib.replaceStrings [ "." ] [ "-" ] v) versions); + defaultSettings = { + wal_level = "logical"; + }; }; } diff --git a/nix/tests/expected/wal2json.out b/nix/tests/expected/wal2json.out index 6edc359ee..aaec200f2 100644 --- a/nix/tests/expected/wal2json.out +++ b/nix/tests/expected/wal2json.out @@ -19,16 +19,17 @@ from 'reg_test', null, null, - 'include-pk', '1', + 'include-pk', 'true', 'include-transaction', 'false', 'include-timestamp', 'false', - 'include-type-oids', 'false', + 'include-type-oids', 'true', 'format-version', '2', - 'actions', 'insert,update,delete' + 'actions', 'insert,update,delete', + 'add-tables', 'v.foo' ) x; - data --------------------------------------------------------------------------------------------------------------------------------------- - {"action":"I","schema":"v","table":"foo","columns":[{"name":"id","type":"integer","value":1}],"pk":[{"name":"id","type":"integer"}]} + data +---------------------------------------------------------------------------------------------------------------------------------------------------------------- + {"action":"I","schema":"v","table":"foo","columns":[{"name":"id","type":"integer","typeoid":23,"value":1}],"pk":[{"name":"id","type":"integer","typeoid":23}]} (1 row) select diff --git a/nix/tests/expected/z_15_ext_interface.out b/nix/tests/expected/z_15_ext_interface.out index 86982dfb9..f2b5672aa 100644 --- a/nix/tests/expected/z_15_ext_interface.out +++ b/nix/tests/expected/z_15_ext_interface.out @@ -32,7 +32,8 @@ order by pg_cron pgjwt tsm_system_time -(3 rows) + wal2json +(4 rows) /* diff --git a/nix/tests/expected/z_17_ext_interface.out b/nix/tests/expected/z_17_ext_interface.out index 2c660db8b..57f68aa1c 100644 --- a/nix/tests/expected/z_17_ext_interface.out +++ b/nix/tests/expected/z_17_ext_interface.out @@ -26,7 +26,8 @@ order by pgjwt postgis_tiger_geocoder tsm_system_time -(4 rows) + wal2json +(5 rows) /* diff --git a/nix/tests/expected/z_orioledb-17_ext_interface.out b/nix/tests/expected/z_orioledb-17_ext_interface.out index 2c660db8b..57f68aa1c 100644 --- a/nix/tests/expected/z_orioledb-17_ext_interface.out +++ b/nix/tests/expected/z_orioledb-17_ext_interface.out @@ -26,7 +26,8 @@ order by pgjwt postgis_tiger_geocoder tsm_system_time -(4 rows) + wal2json +(5 rows) /* diff --git a/nix/tests/sql/wal2json.sql b/nix/tests/sql/wal2json.sql index 6ec4a6de9..81785a7a0 100644 --- a/nix/tests/sql/wal2json.sql +++ b/nix/tests/sql/wal2json.sql @@ -18,12 +18,13 @@ from 'reg_test', null, null, - 'include-pk', '1', + 'include-pk', 'true', 'include-transaction', 'false', 'include-timestamp', 'false', - 'include-type-oids', 'false', + 'include-type-oids', 'true', 'format-version', '2', - 'actions', 'insert,update,delete' + 'actions', 'insert,update,delete', + 'add-tables', 'v.foo' ) x; select