Skip to content

Commit b99cccb

Browse files
committed
feat: pg_cron multi-version with new pattern
1 parent da69a37 commit b99cccb

File tree

3 files changed

+129
-21
lines changed

3 files changed

+129
-21
lines changed

nix/ext/pg_cron.nix

Lines changed: 65 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,80 @@
11
{
2+
pkgs,
23
lib,
34
stdenv,
45
fetchFromGitHub,
56
postgresql,
67
}:
78

8-
stdenv.mkDerivation rec {
9+
let
910
pname = "pg_cron";
10-
version = "1.6.4";
11+
allVersions = (builtins.fromJSON (builtins.readFile ./versions.json)).${pname};
12+
supportedVersions = lib.filterAttrs (
13+
_: value: builtins.elem (lib.versions.major postgresql.version) value.postgresql
14+
) allVersions;
15+
versions = lib.naturalSort (lib.attrNames supportedVersions);
16+
latestVersion = lib.last versions;
17+
numberOfVersions = builtins.length versions;
18+
build =
19+
version: versionData:
20+
stdenv.mkDerivation rec {
21+
inherit pname version;
1122

12-
buildInputs = [ postgresql ];
23+
buildInputs = [ postgresql ];
1324

14-
src = fetchFromGitHub {
15-
owner = "citusdata";
16-
repo = pname;
17-
rev = "v${version}";
18-
hash = "sha256-t1DpFkPiSfdoGG2NgNT7g1lkvSooZoRoUrix6cBID40=";
19-
};
25+
src = fetchFromGitHub {
26+
owner = "citusdata";
27+
repo = pname;
28+
rev = versionData.rev or "v${version}";
29+
hash = versionData.hash;
30+
};
31+
32+
patches = map (p: ./. + "/${p}") (versionData.patches or [ ]);
33+
34+
installPhase = ''
35+
mkdir -p $out/{lib,share/postgresql/extension}
36+
37+
# Install shared library with version suffix
38+
mv ${pname}${postgresql.dlSuffix} $out/lib/${pname}-${version}${postgresql.dlSuffix}
39+
40+
# Create version-specific control file
41+
sed -e "/^default_version =/d" \
42+
-e "s|^module_pathname = .*|module_pathname = '\$libdir/${pname}-${version}'|" \
43+
${pname}.control > $out/share/postgresql/extension/${pname}--${version}.control
2044
21-
installPhase = ''
22-
mkdir -p $out/{lib,share/postgresql/extension}
45+
# For the latest version, create default control file and symlink and copy SQL upgrade scripts
46+
if [[ "${version}" == "${latestVersion}" ]]; then
47+
{
48+
echo "default_version = '${version}'"
49+
cat $out/share/postgresql/extension/${pname}--${version}.control
50+
} > $out/share/postgresql/extension/${pname}.control
51+
ln -sfn ${pname}-${latestVersion}${postgresql.dlSuffix} $out/lib/${pname}${postgresql.dlSuffix}
52+
cp *.sql $out/share/postgresql/extension
53+
fi
54+
'';
2355

24-
cp *${postgresql.dlSuffix} $out/lib
25-
cp *.sql $out/share/postgresql/extension
26-
cp *.control $out/share/postgresql/extension
27-
'';
56+
meta = with lib; {
57+
description = "Run Cron jobs through PostgreSQL";
58+
homepage = "https://github.com/citusdata/pg_cron";
59+
changelog = "https://github.com/citusdata/pg_cron/raw/v${version}/CHANGELOG.md";
60+
platforms = postgresql.meta.platforms;
61+
license = licenses.postgresql;
62+
};
63+
};
64+
packages = builtins.attrValues (lib.mapAttrs (name: value: build name value) supportedVersions);
65+
in
66+
pkgs.buildEnv {
67+
name = pname;
68+
paths = packages;
69+
pathsToLink = [
70+
"/lib"
71+
"/share/postgresql/extension"
72+
];
2873

29-
meta = with lib; {
30-
description = "Run Cron jobs through PostgreSQL";
31-
homepage = "https://github.com/citusdata/pg_cron";
32-
changelog = "https://github.com/citusdata/pg_cron/raw/v${version}/CHANGELOG.md";
33-
platforms = postgresql.meta.platforms;
34-
license = licenses.postgresql;
74+
passthru = {
75+
inherit versions numberOfVersions;
76+
pname = "${pname}-all";
77+
version =
78+
"multi-" + lib.concatStringsSep "-" (map (v: lib.replaceStrings [ "." ] [ "-" ] v) versions);
3579
};
3680
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
diff --git a/src/pg_cron.c b/src/pg_cron.c
2+
index e0ca973..4d51b2c 100644
3+
--- a/src/pg_cron.c
4+
+++ b/src/pg_cron.c
5+
@@ -14,6 +14,8 @@
6+
#include <sys/resource.h>
7+
8+
#include "postgres.h"
9+
+#include "commands/async.h"
10+
+#include "miscadmin.h"
11+
#include "fmgr.h"
12+
13+
/* these are always necessary for a bgworker */
14+
@@ -1908,7 +1910,7 @@ CronBackgroundWorker(Datum main_arg)
15+
/* Post-execution cleanup. */
16+
disable_timeout(STATEMENT_TIMEOUT, false);
17+
CommitTransactionCommand();
18+
- ProcessCompletedNotifies();
19+
+ /* ProcessCompletedNotifies removed */
20+
pgstat_report_activity(STATE_IDLE, command);
21+
pgstat_report_stat(true);
22+
23+
@@ -2025,7 +2027,7 @@ ExecuteSqlString(const char *sql)
24+
*/
25+
oldcontext = MemoryContextSwitchTo(parsecontext);
26+
#if PG_VERSION_NUM >= 100000
27+
- querytree_list = pg_analyze_and_rewrite(parsetree, sql, NULL, 0,NULL);
28+
+ querytree_list = pg_analyze_and_rewrite_fixedparams(parsetree, sql, NULL, 0, NULL);
29+
#else
30+
querytree_list = pg_analyze_and_rewrite(parsetree, sql, NULL, 0);
31+
#endif

nix/ext/versions.json

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,38 @@
2020
],
2121
"hash": "sha256-G0eQk2bY5CNPMeokN/nb05g03CuiplRf902YXFVQFbs="
2222
}
23+
},
24+
"pg_cron": {
25+
"1.3.1": {
26+
"postgresql": [
27+
"15"
28+
],
29+
"rev": "v1.3.1",
30+
"hash": "sha256-rXotNOtQNmA55ErNxGoNSKZ0pP1uxEVlDGITFHuqGG4=",
31+
"patches": [ "pg_cron/pg_cron-1.3.1-pg15.patch" ]
32+
},
33+
"1.4.2": {
34+
"postgresql": [
35+
"15"
36+
],
37+
"rev": "v1.4.2",
38+
"hash": "sha256-P0Fd10Q1p+KrExb35G6otHpc6pD61WnMll45H2jkevM="
39+
},
40+
"1.5.2": {
41+
"postgresql": [
42+
"15"
43+
],
44+
"rev": "v1.5.2",
45+
"hash": "sha256-+quVWbKJy6wXpL/zwTk5FF7sYwHA7I97WhWmPO/HSZ4="
46+
},
47+
"1.6.4": {
48+
"postgresql": [
49+
"15",
50+
"17",
51+
"orioledb-17"
52+
],
53+
"rev": "v1.6.4",
54+
"hash": "sha256-t1DpFkPiSfdoGG2NgNT7g1lkvSooZoRoUrix6cBID40="
55+
}
2356
}
2457
}

0 commit comments

Comments
 (0)