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