1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
|
package postgres
import (
"embed"
"github.com/wader/fq/format"
"github.com/wader/fq/format/postgres/common"
"github.com/wader/fq/format/postgres/flavours/pgpro10"
"github.com/wader/fq/format/postgres/flavours/pgpro11"
"github.com/wader/fq/format/postgres/flavours/pgpro12"
"github.com/wader/fq/format/postgres/flavours/pgpro13"
"github.com/wader/fq/format/postgres/flavours/pgpro14"
"github.com/wader/fq/format/postgres/flavours/pgproee10"
"github.com/wader/fq/format/postgres/flavours/pgproee11"
"github.com/wader/fq/format/postgres/flavours/pgproee12"
"github.com/wader/fq/format/postgres/flavours/pgproee13"
"github.com/wader/fq/format/postgres/flavours/pgproee14"
"github.com/wader/fq/format/postgres/flavours/pgproee15"
"github.com/wader/fq/format/postgres/flavours/postgres10"
"github.com/wader/fq/format/postgres/flavours/postgres11"
"github.com/wader/fq/format/postgres/flavours/postgres12"
"github.com/wader/fq/format/postgres/flavours/postgres13"
"github.com/wader/fq/format/postgres/flavours/postgres14"
"github.com/wader/fq/pkg/decode"
"github.com/wader/fq/pkg/interp"
)
//go:embed pg_control.md
var pgControlFS embed.FS
func init() {
interp.RegisterFormat(format.Pg_Control, &decode.Format{
Description: "PostgreSQL control file",
DecodeFn: decodePgControl,
DefaultInArg: format.Pg_Control_In{
Flavour: "",
},
})
interp.RegisterFS(pgControlFS)
}
const (
PG_CONTROL_VERSION_10 = 1002
PG_CONTROL_VERSION_11 = 1100
PGPRO_CONTROL_VERSION_11 = 1200
PG_CONTROL_VERSION_12 = 1201
//PG_CONTROL_VERSION_13 = 1300
PG_CONTROL_VERSION_14 = 1300
//PG_CONTROL_VERSION_15 = 1300
)
const (
PG_FLAVOUR_POSTGRES10 = "postgres10"
PG_FLAVOUR_POSTGRES11 = "postgres11"
PG_FLAVOUR_POSTGRES12 = "postgres12"
PG_FLAVOUR_POSTGRES13 = "postgres13"
PG_FLAVOUR_POSTGRES14 = "postgres14"
PG_FLAVOUR_POSTGRES15 = "postgres15"
PG_FLAVOUR_PGPRO10 = "pgpro10"
PG_FLAVOUR_PGPRO11 = "pgpro11"
PG_FLAVOUR_PGPRO12 = "pgpro12"
PG_FLAVOUR_PGPRO13 = "pgpro13"
PG_FLAVOUR_PGPRO14 = "pgpro14"
PG_FLAVOUR_PGPRO15 = "pgpro15"
PG_FLAVOUR_PGPROEE10 = "pgproee10"
PG_FLAVOUR_PGPROEE11 = "pgproee11"
PG_FLAVOUR_PGPROEE12 = "pgproee12"
PG_FLAVOUR_PGPROEE13 = "pgproee13"
PG_FLAVOUR_PGPROEE14 = "pgproee14"
PG_FLAVOUR_PGPROEE15 = "pgproee15"
)
func decodePgControl(d *decode.D) any {
d.Endian = decode.LittleEndian
var pgIn format.Pg_Control_In
if !d.ArgAs(&pgIn) {
d.Fatalf("no flavour specified")
}
switch pgIn.Flavour {
case PG_FLAVOUR_POSTGRES10:
return postgres10.DecodePgControl(d)
case PG_FLAVOUR_POSTGRES11:
return postgres11.DecodePgControl(d)
case PG_FLAVOUR_POSTGRES12:
return postgres12.DecodePgControl(d)
case PG_FLAVOUR_POSTGRES13:
return postgres13.DecodePgControl(d)
case PG_FLAVOUR_POSTGRES14, PG_FLAVOUR_POSTGRES15, PG_FLAVOUR_PGPRO15:
return postgres14.DecodePgControl(d)
case PG_FLAVOUR_PGPRO10:
return pgpro10.DecodePgControl(d)
case PG_FLAVOUR_PGPRO11:
return pgpro11.DecodePgControl(d)
case PG_FLAVOUR_PGPRO12:
return pgpro12.DecodePgControl(d)
case PG_FLAVOUR_PGPRO13:
return pgpro13.DecodePgControl(d)
case PG_FLAVOUR_PGPRO14:
return pgpro14.DecodePgControl(d)
case PG_FLAVOUR_PGPROEE10:
return pgproee10.DecodePgControl(d)
case PG_FLAVOUR_PGPROEE11:
return pgproee11.DecodePgControl(d)
case PG_FLAVOUR_PGPROEE12:
return pgproee12.DecodePgControl(d)
case PG_FLAVOUR_PGPROEE13:
return pgproee13.DecodePgControl(d)
case PG_FLAVOUR_PGPROEE14:
return pgproee14.DecodePgControl(d)
case PG_FLAVOUR_PGPROEE15:
return pgproee15.DecodePgControl(d)
default:
break
}
return probeForDecode(d)
}
func probeForDecode(d *decode.D) any {
/* 0 | 8 */ // uint64 system_identifier;
/* 8 | 4 */ // uint32 pg_control_version;
d.U64()
pgControlVersion := d.U32()
d.SeekAbs(0)
pgProVersion, oriVersion := common.ParsePgProVersion(uint32(pgControlVersion))
if pgProVersion == common.PG_ORIGINAL {
switch oriVersion {
case PG_CONTROL_VERSION_10:
return postgres10.DecodePgControl(d)
case PG_CONTROL_VERSION_11:
return postgres11.DecodePgControl(d)
case PG_CONTROL_VERSION_12:
return postgres12.DecodePgControl(d)
case PG_CONTROL_VERSION_14:
return postgres14.DecodePgControl(d)
}
}
if pgProVersion == common.PGPRO_STANDARD {
switch oriVersion {
case PG_CONTROL_VERSION_10:
return pgpro10.DecodePgControl(d)
case PG_CONTROL_VERSION_11:
return pgpro11.DecodePgControl(d)
case PG_CONTROL_VERSION_12:
return pgpro12.DecodePgControl(d)
case PG_CONTROL_VERSION_14:
return pgpro14.DecodePgControl(d)
}
}
if pgProVersion == common.PGPRO_ENTERPRISE {
switch oriVersion {
case PG_CONTROL_VERSION_10:
return pgproee10.DecodePgControl(d)
case PGPRO_CONTROL_VERSION_11:
return pgproee11.DecodePgControl(d)
case PG_CONTROL_VERSION_12:
return pgproee12.DecodePgControl(d)
case PG_CONTROL_VERSION_14:
return pgproee14.DecodePgControl(d)
}
}
d.Fatalf("unsupported PG_CONTROL_VERSION = %d", pgControlVersion)
return nil
}
|