1
1
{ lib , stdenv , fetchFromGitHub , postgresql } :
2
2
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"'
6
14
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
+ '' ;
8
59
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
+ '' ;
14
73
} ;
15
74
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
+
16
93
installPhase = ''
17
94
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 }
22
112
'' ;
23
113
24
114
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 ;
30
120
} ;
31
- }
121
+ }
0 commit comments