|
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