|
3 | 3 | stdenv,
|
4 | 4 | fetchFromGitHub,
|
5 | 5 | postgresql,
|
| 6 | + buildEnv, |
| 7 | + makeWrapper, |
| 8 | + switch-ext-version, |
6 | 9 | }:
|
7 |
| - |
8 | 10 | let
|
9 | 11 | pname = "pg_cron";
|
10 | 12 | allVersions = (builtins.fromJSON (builtins.readFile ../versions.json)).${pname};
|
|
32 | 34 |
|
33 | 35 | buildPhase = ''
|
34 | 36 | make PG_CONFIG=${postgresql}/bin/pg_config
|
35 |
| -
|
36 |
| - # Create version-specific SQL file |
37 |
| - cp pg_cron.sql pg_cron--${version}.sql |
38 |
| -
|
39 |
| - # Create versioned control file with modified module path |
40 |
| - sed -e "/^default_version =/d" \ |
41 |
| - -e "s|^module_pathname = .*|module_pathname = '\$libdir/pg_cron'|" \ |
42 |
| - pg_cron.control > pg_cron--${version}.control |
43 | 37 | '';
|
44 | 38 |
|
45 | 39 | installPhase = ''
|
|
48 | 42 | # Install versioned library
|
49 | 43 | install -Dm755 ${pname}${postgresql.dlSuffix} $out/lib/${pname}-${version}${postgresql.dlSuffix}
|
50 | 44 |
|
51 |
| - # Install version-specific files |
52 |
| - install -Dm644 ${pname}--${version}.sql $out/share/postgresql/extension/ |
53 |
| - install -Dm644 ${pname}--${version}.control $out/share/postgresql/extension/ |
54 |
| -
|
55 |
| - # Install upgrade scripts |
56 |
| - find . -name 'pg_cron--*--*.sql' -exec install -Dm644 {} $out/share/postgresql/extension/ \; |
57 | 45 |
|
58 |
| - # For the latest version, create default control file and symlink |
59 | 46 | if [[ "${version}" == "${latestVersion}" ]]; then
|
60 |
| - { |
61 |
| - echo "default_version = '${version}'" |
62 |
| - cat $out/share/postgresql/extension/${pname}--${version}.control |
63 |
| - } > $out/share/postgresql/extension/${pname}.control |
64 |
| - ln -sfn ${pname}-${version}${postgresql.dlSuffix} $out/lib/${pname}${postgresql.dlSuffix} |
| 47 | + cp ${pname}.sql $out/share/postgresql/extension/${pname}--1.0.0.sql |
| 48 | + # Install upgrade scripts |
| 49 | + find . -name 'pg_cron--*--*.sql' -exec install -Dm644 {} $out/share/postgresql/extension/ \; |
| 50 | + mv $out/share/postgresql/extension/pg_cron--1.0--1.1.sql $out/share/postgresql/extension/pg_cron--1.0.0--1.1.0.sql |
| 51 | + mv $out/share/postgresql/extension/pg_cron--1.1--1.2.sql $out/share/postgresql/extension/pg_cron--1.1.0--1.2.0.sql |
| 52 | + mv $out/share/postgresql/extension/pg_cron--1.2--1.3.sql $out/share/postgresql/extension/pg_cron--1.2.0--1.3.1.sql |
| 53 | + mv $out/share/postgresql/extension/pg_cron--1.3--1.4.sql $out/share/postgresql/extension/pg_cron--1.3.1--1.4.2.sql |
| 54 | + mv $out/share/postgresql/extension/pg_cron--1.4--1.4-1.sql $out/share/postgresql/extension/pg_cron--1.4.0--1.4.1.sql |
| 55 | + mv $out/share/postgresql/extension/pg_cron--1.4-1--1.5.sql $out/share/postgresql/extension/pg_cron--1.4.2--1.5.2.sql |
| 56 | + mv $out/share/postgresql/extension/pg_cron--1.5--1.6.sql $out/share/postgresql/extension/pg_cron--1.5.2--1.6.4.sql |
65 | 57 | fi
|
| 58 | +
|
| 59 | + # Create versioned control file with modified module path |
| 60 | + sed -e "/^default_version =/d" \ |
| 61 | + -e "/^schema =/d" \ |
| 62 | + -e "s|^module_pathname = .*|module_pathname = '\$libdir/${pname}'|" \ |
| 63 | + ${pname}.control > $out/share/postgresql/extension/${pname}--${version}.control |
66 | 64 | '';
|
67 | 65 |
|
68 | 66 | meta = with lib; {
|
|
75 | 73 | };
|
76 | 74 | packages = builtins.attrValues (lib.mapAttrs (name: value: build name value) supportedVersions);
|
77 | 75 | in
|
78 |
| -stdenv.mkDerivation { |
79 |
| - pname = "${pname}-all"; |
80 |
| - version = |
81 |
| - "multi-" + lib.concatStringsSep "-" (map (v: lib.replaceStrings [ "." ] [ "-" ] v) versions); |
82 |
| - |
83 |
| - buildInputs = packages; |
84 |
| - |
85 |
| - dontUnpack = true; |
86 |
| - dontConfigure = true; |
87 |
| - dontBuild = true; |
88 |
| - |
89 |
| - installPhase = '' |
90 |
| - mkdir -p $out/{lib,share/postgresql/extension,bin} |
91 |
| -
|
92 |
| - # Install all versions |
93 |
| - for drv in ${lib.concatStringsSep " " packages}; do |
94 |
| - ln -sv $drv/lib/* $out/lib/ |
95 |
| - cp -v --no-clobber $drv/share/postgresql/extension/* $out/share/postgresql/extension/ || true |
96 |
| - done |
97 |
| -
|
98 |
| - # Find latest version |
99 |
| - latest_control=$(ls -v $out/share/postgresql/extension/${pname}--*.control | tail -n1) |
100 |
| - latest_version=$(basename "$latest_control" | sed -E 's/${pname}--([0-9.]+).control/\1/') |
101 |
| -
|
102 |
| - # Create main control file only if it doesn't exist |
103 |
| - if [ ! -f "$out/share/postgresql/extension/${pname}.control" ]; then |
104 |
| - # Create main control file with default_version |
105 |
| - echo "default_version = '$latest_version'" > $out/share/postgresql/extension/${pname}.control |
106 |
| - cat "$latest_control" >> $out/share/postgresql/extension/${pname}.control |
107 |
| - fi |
108 |
| -
|
109 |
| - # Library symlink - only if it doesn't exist |
110 |
| - if [ ! -f "$out/lib/${pname}${postgresql.dlSuffix}" ]; then |
111 |
| - ln -sfnv ${pname}-$latest_version${postgresql.dlSuffix} $out/lib/${pname}${postgresql.dlSuffix} |
112 |
| - fi |
113 |
| -
|
114 |
| - # Create version switcher script |
115 |
| - cat > $out/bin/switch_pg_cron_version <<'EOF' |
116 |
| - #!/bin/sh |
117 |
| - set -e |
118 |
| -
|
119 |
| - if [ $# -ne 1 ]; then |
120 |
| - echo "Usage: $0 <version>" |
121 |
| - echo "Example: $0 1.4.2" |
122 |
| - exit 1 |
123 |
| - fi |
124 |
| -
|
125 |
| - VERSION=$1 |
126 |
| - NIX_PROFILE="/var/lib/postgresql/.nix-profile" |
127 |
| -
|
128 |
| - # Follow the complete chain of symlinks to find the multi-version directory |
129 |
| - CURRENT_LINK="$NIX_PROFILE/lib/pg_cron-$VERSION${postgresql.dlSuffix}" |
130 |
| - echo "Starting with link: $CURRENT_LINK" |
131 |
| -
|
132 |
| - # Follow first two symlinks to get to the multi-version directory |
133 |
| - for i in 1 2; do |
134 |
| - if [ -L "$CURRENT_LINK" ]; then |
135 |
| - NEXT_LINK=$(readlink "$CURRENT_LINK") |
136 |
| - echo "Following link: $NEXT_LINK" |
137 |
| - if echo "$NEXT_LINK" | grep -q '^/'; then |
138 |
| - CURRENT_LINK="$NEXT_LINK" |
139 |
| - else |
140 |
| - CURRENT_LINK="$(dirname "$CURRENT_LINK")/$NEXT_LINK" |
141 |
| - fi |
142 |
| - echo "Current link is now: $CURRENT_LINK" |
143 |
| - fi |
144 |
| - done |
145 |
| -
|
146 |
| - # The multi-version directory should be the parent of the current link |
147 |
| - MULTI_VERSION_DIR=$(dirname "$CURRENT_LINK") |
148 |
| - echo "Found multi-version directory: $MULTI_VERSION_DIR" |
149 |
| - LIB_DIR="$MULTI_VERSION_DIR" |
150 |
| - EXTENSION_DIR="$NIX_PROFILE/share/postgresql/extension" |
151 |
| -
|
152 |
| - echo "Looking for file: $LIB_DIR/pg_cron-$VERSION${postgresql.dlSuffix}" |
153 |
| - ls -la "$LIB_DIR" || true |
154 |
| -
|
155 |
| - # Check if version exists |
156 |
| - if [ ! -f "$LIB_DIR/pg_cron-$VERSION${postgresql.dlSuffix}" ]; then |
157 |
| - echo "Error: Version $VERSION not found" |
158 |
| - exit 1 |
159 |
| - fi |
160 |
| -
|
161 |
| - # Update library symlink |
162 |
| - ln -sfnv "pg_cron-$VERSION${postgresql.dlSuffix}" "$LIB_DIR/pg_cron${postgresql.dlSuffix}" |
163 |
| -
|
164 |
| - # Update control file |
165 |
| - echo "default_version = '$VERSION'" > "$EXTENSION_DIR/pg_cron.control" |
166 |
| - cat "$EXTENSION_DIR/pg_cron--$VERSION.control" >> "$EXTENSION_DIR/pg_cron.control" |
167 |
| -
|
168 |
| - echo "Successfully switched pg_cron to version $VERSION" |
169 |
| - EOF |
170 |
| -
|
171 |
| - chmod +x $out/bin/switch_pg_cron_version |
| 76 | +buildEnv { |
| 77 | + name = pname; |
| 78 | + paths = packages; |
| 79 | + nativeBuildInputs = [ makeWrapper ]; |
| 80 | + |
| 81 | + pathsToLink = [ |
| 82 | + "/lib" |
| 83 | + "/share/postgresql/extension" |
| 84 | + ]; |
| 85 | + |
| 86 | + postBuild = '' |
| 87 | + { |
| 88 | + echo "default_version = '${latestVersion}'" |
| 89 | + cat $out/share/postgresql/extension/${pname}--${latestVersion}.control |
| 90 | + } > $out/share/postgresql/extension/${pname}.control |
| 91 | + ln -sfn ${pname}-${latestVersion}${postgresql.dlSuffix} $out/lib/${pname}${postgresql.dlSuffix} |
| 92 | +
|
| 93 | + # checks |
| 94 | + (set -x |
| 95 | + test "$(ls -A $out/lib/${pname}*${postgresql.dlSuffix} | wc -l)" = "${ |
| 96 | + toString (numberOfVersions + 1) |
| 97 | + }" |
| 98 | + ) |
| 99 | +
|
| 100 | + makeWrapper ${lib.getExe switch-ext-version} $out/bin/switch_pg_cron_version \ |
| 101 | + --prefix EXT_WRAPPER : "$out" --prefix EXT_NAME : "${pname}" |
172 | 102 | '';
|
173 | 103 |
|
174 |
| - passthru = { |
175 |
| - inherit versions numberOfVersions; |
176 |
| - }; |
177 |
| - |
178 | 104 | meta = with lib; {
|
179 | 105 | description = "Run Cron jobs through PostgreSQL (multi-version compatible)";
|
180 | 106 | homepage = "https://github.com/citusdata/pg_cron";
|
181 | 107 | platforms = postgresql.meta.platforms;
|
182 | 108 | license = licenses.postgresql;
|
183 | 109 | };
|
| 110 | + |
| 111 | + passthru = { |
| 112 | + inherit versions numberOfVersions switch-ext-version; |
| 113 | + pname = "${pname}-all"; |
| 114 | + version = |
| 115 | + "multi-" + lib.concatStringsSep "-" (map (v: lib.replaceStrings [ "." ] [ "-" ] v) versions); |
| 116 | + }; |
184 | 117 | }
|
0 commit comments