Skip to content

Commit 975f414

Browse files
committed
feat: multi-ext-versios-pgrcron
1 parent 61ff753 commit 975f414

File tree

1 file changed

+109
-19
lines changed

1 file changed

+109
-19
lines changed

nix/ext/pg_cron.nix

Lines changed: 109 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,121 @@
11
{ lib, stdenv, fetchFromGitHub, postgresql }:
22

3-
stdenv.mkDerivation rec {
4-
pname = "pg_cron";
5-
version = "1.6.4";
3+
let
4+
allVersions = {
5+
"1.3.1" = {
6+
rev = "v1.3.1";
7+
hash = "sha256-rXotNOtQNmA55ErNxGoNSKZ0pP1uxEVlDGITFHuqGG4=";
8+
postPatch = ''
9+
# Add necessary includes
10+
substituteInPlace src/pg_cron.c \
11+
--replace '#include "postgres.h"' '#include "postgres.h"
12+
#include "commands/async.h"
13+
#include "miscadmin.h"'
614
7-
buildInputs = [ postgresql ];
15+
# Update function calls to use PostgreSQL 15 APIs
16+
substituteInPlace src/pg_cron.c \
17+
--replace 'ProcessCompletedNotifies();' '/* ProcessCompletedNotifies removed */' \
18+
--replace 'pg_analyze_and_rewrite(parsetree, sql, NULL, 0,NULL);' 'pg_analyze_and_rewrite_fixedparams(parsetree, sql, NULL, 0, NULL);'
19+
'';
20+
};
21+
"1.4.2" = {
22+
rev = "v1.4.2";
23+
hash = "sha256-P0Fd10Q1p+KrExb35G6otHpc6pD61WnMll45H2jkevM=";
24+
};
25+
"1.6.4" = {
26+
rev = "v1.6.4";
27+
hash = "sha256-t1DpFkPiSfdoGG2NgNT7g1lkvSooZoRoUrix6cBID40=";
28+
};
29+
"1.5.2" = {
30+
rev = "v1.5.2";
31+
hash = "sha256-+quVWbKJy6wXpL/zwTk5FF7sYwHA7I97WhWmPO/HSZ4=";
32+
};
33+
};
34+
35+
mkPgCron = pgCronVersion: { rev, hash, postPatch ? "" }: stdenv.mkDerivation {
36+
pname = "pg_cron";
37+
version = "${pgCronVersion}-pg${lib.versions.major postgresql.version}";
38+
39+
buildInputs = [ postgresql ];
40+
inherit postPatch;
41+
42+
src = fetchFromGitHub {
43+
owner = "citusdata";
44+
repo = "pg_cron";
45+
inherit rev hash;
46+
};
47+
48+
buildPhase = ''
49+
make PG_CONFIG=${postgresql}/bin/pg_config
50+
51+
# Create version-specific SQL file
52+
cp pg_cron.sql pg_cron--${pgCronVersion}.sql
53+
54+
# Create versioned control file with modified module path
55+
sed -e "/^default_version =/d" \
56+
-e "s|^module_pathname = .*|module_pathname = '\$libdir/pg_cron'|" \
57+
pg_cron.control > pg_cron--${pgCronVersion}.control
58+
'';
859

9-
src = fetchFromGitHub {
10-
owner = "citusdata";
11-
repo = pname;
12-
rev = "v${version}";
13-
hash = "sha256-t1DpFkPiSfdoGG2NgNT7g1lkvSooZoRoUrix6cBID40=";
60+
installPhase = ''
61+
mkdir -p $out/{lib,share/postgresql/extension}
62+
63+
# Install versioned library
64+
install -Dm755 pg_cron${postgresql.dlSuffix} $out/lib/pg_cron-${pgCronVersion}${postgresql.dlSuffix}
65+
66+
# Install version-specific files
67+
install -Dm644 pg_cron--${pgCronVersion}.sql $out/share/postgresql/extension/
68+
install -Dm644 pg_cron--${pgCronVersion}.control $out/share/postgresql/extension/
69+
70+
# Install upgrade scripts
71+
find . -name 'pg_cron--*--*.sql' -exec install -Dm644 {} $out/share/postgresql/extension/ \;
72+
'';
1473
};
1574

75+
getVersions = pg:
76+
if lib.versionAtLeast pg.version "17"
77+
then { "1.6.4" = allVersions."1.6.4"; }
78+
else allVersions;
79+
80+
allVersionsForPg = lib.mapAttrs mkPgCron (getVersions postgresql);
81+
82+
in
83+
stdenv.mkDerivation {
84+
pname = "pg_cron-all";
85+
version = "multi";
86+
87+
buildInputs = lib.attrValues allVersionsForPg;
88+
89+
dontUnpack = true;
90+
dontConfigure = true;
91+
dontBuild = true;
92+
1693
installPhase = ''
1794
mkdir -p $out/{lib,share/postgresql/extension}
18-
19-
cp *${postgresql.dlSuffix} $out/lib
20-
cp *.sql $out/share/postgresql/extension
21-
cp *.control $out/share/postgresql/extension
95+
96+
# Install all versions
97+
for drv in ${lib.concatStringsSep " " (lib.attrValues allVersionsForPg)}; do
98+
ln -sv $drv/lib/* $out/lib/
99+
cp -v --no-clobber $drv/share/postgresql/extension/* $out/share/postgresql/extension/ || true
100+
done
101+
102+
# Create default symlinks
103+
latest_control=$(ls -v $out/share/postgresql/extension/pg_cron--*.control | tail -n1)
104+
latest_version=$(basename "$latest_control" | sed -E 's/pg_cron--([0-9.]+).control/\1/')
105+
106+
# Create main control file with default_version
107+
echo "default_version = '$latest_version'" > $out/share/postgresql/extension/pg_cron.control
108+
cat "$latest_control" >> $out/share/postgresql/extension/pg_cron.control
109+
110+
# Library symlink
111+
ln -sfnv pg_cron-$latest_version${postgresql.dlSuffix} $out/lib/pg_cron${postgresql.dlSuffix}
22112
'';
23113

24114
meta = with lib; {
25-
description = "Run Cron jobs through PostgreSQL";
26-
homepage = "https://github.com/citusdata/pg_cron";
27-
changelog = "https://github.com/citusdata/pg_cron/raw/v${version}/CHANGELOG.md";
28-
platforms = postgresql.meta.platforms;
29-
license = licenses.postgresql;
115+
description = "Run Cron jobs through PostgreSQL (multi-version compatible)";
116+
homepage = "https://github.com/citusdata/pg_cron";
117+
maintainers = with maintainers; [ samrose ];
118+
platforms = postgresql.meta.platforms;
119+
license = licenses.postgresql;
30120
};
31-
}
121+
}

0 commit comments

Comments
 (0)