Skip to content

Commit 79dcada

Browse files
committed
wip: stage pg_partman multi-version changes
1 parent 2762e23 commit 79dcada

File tree

3 files changed

+101
-22
lines changed

3 files changed

+101
-22
lines changed

nix/ext/pg_partman.nix

Lines changed: 90 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,106 @@
11
{
2+
pkgs,
23
lib,
34
stdenv,
45
fetchFromGitHub,
56
postgresql,
7+
makeWrapper,
8+
switch-ext-version,
69
}:
710

8-
stdenv.mkDerivation rec {
11+
let
912
pname = "pg_partman";
10-
version = "5.2.4";
13+
build =
14+
version: hash:
15+
stdenv.mkDerivation rec {
16+
inherit pname version;
1117

12-
buildInputs = [ postgresql ];
18+
buildInputs = [ postgresql ];
19+
20+
src = fetchFromGitHub {
21+
owner = "pgpartman";
22+
repo = pname;
23+
rev = "refs/tags/v${version}";
24+
inherit hash;
25+
};
26+
27+
installPhase = ''
28+
mkdir -p $out/{lib,share/postgresql/extension}
29+
30+
# Install versioned library
31+
install -Dm755 src/*${postgresql.dlSuffix} $out/lib/${pname}-${version}${postgresql.dlSuffix}
32+
33+
# Only install SQL files for the latest version
34+
if [[ "${version}" == "${latestVersion}" ]]; then
35+
# Install all SQL files from sql/ directory
36+
cp -r sql/* $out/share/postgresql/extension/
37+
38+
# Install upgrade scripts
39+
cp updates/* $out/share/postgresql/extension/
40+
fi
41+
42+
# Create versioned control file with modified module path
43+
sed -e "/^default_version =/d" \
44+
-e "s|^module_pathname = .*|module_pathname = '\$libdir/${pname}'|" \
45+
${pname}.control > $out/share/postgresql/extension/${pname}--${version}.control
46+
'';
47+
48+
meta = with lib; {
49+
description = "Partition management extension for PostgreSQL";
50+
homepage = "https://github.com/pgpartman/pg_partman";
51+
changelog = "https://github.com/pgpartman/pg_partman/blob/v${version}/CHANGELOG.md";
52+
platforms = postgresql.meta.platforms;
53+
license = licenses.postgresql;
54+
};
55+
};
56+
allVersions = (builtins.fromJSON (builtins.readFile ./versions.json)).pg_partman;
57+
supportedVersions = lib.filterAttrs (
58+
_: value: builtins.elem (lib.versions.major postgresql.version) value.postgresql
59+
) allVersions;
60+
versions = lib.naturalSort (lib.attrNames supportedVersions);
61+
latestVersion = lib.last versions;
62+
numberOfVersions = builtins.length versions;
63+
packages = builtins.attrValues (
64+
lib.mapAttrs (name: value: build name value.hash) supportedVersions
65+
);
66+
in
67+
pkgs.buildEnv {
68+
name = pname;
69+
paths = packages;
70+
nativeBuildInputs = [ makeWrapper ];
71+
72+
pathsToLink = [
73+
"/lib"
74+
"/share/postgresql/extension"
75+
];
76+
77+
postBuild = ''
78+
{
79+
echo "default_version = '${latestVersion}'"
80+
cat $out/share/postgresql/extension/${pname}--${latestVersion}.control
81+
} > $out/share/postgresql/extension/${pname}.control
82+
ln -sfn ${pname}-${latestVersion}${postgresql.dlSuffix} $out/lib/${pname}${postgresql.dlSuffix}
1383
14-
src = fetchFromGitHub {
15-
owner = "pgpartman";
16-
repo = pname;
17-
rev = "refs/tags/v${version}";
18-
sha256 = "sha256-GrVOJ5ywZMyqyDroYDLdKkXDdIJSDGhDfveO/ZvrmYs=";
19-
};
2084
21-
installPhase = ''
22-
mkdir -p $out/{lib,share/postgresql/extension}
85+
# checks
86+
(set -x
87+
test "$(ls -A $out/lib/${pname}*${postgresql.dlSuffix} | wc -l)" = "${
88+
toString (numberOfVersions + 1)
89+
}"
90+
)
2391
24-
cp src/*${postgresql.dlSuffix} $out/lib
25-
cp updates/* $out/share/postgresql/extension
26-
cp -r sql/* $out/share/postgresql/extension
27-
cp *.control $out/share/postgresql/extension
92+
makeWrapper ${lib.getExe switch-ext-version} $out/bin/switch_pg_partman_version \
93+
--prefix EXT_WRAPPER : "$out" --prefix EXT_NAME : "${pname}"
2894
'';
2995

30-
meta = with lib; {
31-
description = "Partition management extension for PostgreSQL";
32-
homepage = "https://github.com/pgpartman/pg_partman";
33-
changelog = "https://github.com/pgpartman/pg_partman/blob/v${version}/CHANGELOG.md";
34-
platforms = postgresql.meta.platforms;
35-
license = licenses.postgresql;
36-
broken = versionOlder postgresql.version "14";
96+
passthru = {
97+
inherit versions numberOfVersions switch-ext-version;
98+
pname = "${pname}-all";
99+
hasBackgroundWorker = true;
100+
defaultSettings = {
101+
shared_preload_libraries = [ "pg_partman_bgw" ];
102+
};
103+
version =
104+
"multi-" + lib.concatStringsSep "-" (map (v: lib.replaceStrings [ "." ] [ "-" ] v) versions);
37105
};
38106
}

nix/ext/versions.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,16 @@
320320
],
321321
"hash": "sha256-Cpi2iASi1QJoED0Qs1dANqg/BNZTsz5S+pw8iYyW03Y="
322322
}
323+
},
324+
"pg_partman": {
325+
"5.2.4": {
326+
"postgresql": [
327+
"15",
328+
"17",
329+
"orioledb-17"
330+
],
331+
"hash": "sha256-i/o+JZEXnJRO17kfdTw87aca28+I8pvuFZsPMA/kf+w="
332+
}
323333
},
324334
"pgmq": {
325335
"1.4.4": {

nix/packages/postgres.nix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
../ext/pg_graphql
3737
../ext/pg_stat_monitor.nix
3838
../ext/pg_jsonschema
39+
../ext/pg_partman.nix
3940
../ext/pgvector.nix
4041
../ext/vault.nix
4142
../ext/hypopg.nix

0 commit comments

Comments
 (0)