1
1
mirror of https://github.com/wader/fq.git synced 2024-12-24 05:41:38 +03:00
fq/format/postgres/common/pg_control.go
2023-05-03 15:28:29 +03:00

147 lines
3.1 KiB
Go

package common
import (
"fmt"
"github.com/wader/fq/pkg/scalar"
"time"
)
// typedef enum DBState
//
// {
// DB_STARTUP = 0,
// DB_SHUTDOWNED,
// DB_SHUTDOWNED_IN_RECOVERY,
// DB_SHUTDOWNING,
// DB_IN_CRASH_RECOVERY,
// DB_IN_ARCHIVE_RECOVERY,
// DB_IN_PRODUCTION
// } DBState;
var DBState = scalar.UintMap{
0: {Sym: "DB_STARTUP"},
1: {Sym: "DB_SHUTDOWNED"},
2: {Sym: "DB_SHUTDOWNED_IN_RECOVERY"},
3: {Sym: "DB_SHUTDOWNING"},
4: {Sym: "DB_IN_CRASH_RECOVERY"},
5: {Sym: "DB_IN_ARCHIVE_RECOVERY"},
6: {Sym: "DB_IN_PRODUCTION"},
}
// typedef enum WalLevel
//
// {
// WAL_LEVEL_MINIMAL = 0,
// WAL_LEVEL_REPLICA,
// WAL_LEVEL_LOGICAL
// } WalLevel;
var WalLevel = scalar.SintMap{
0: {Sym: "WAL_LEVEL_MINIMAL"},
1: {Sym: "WAL_LEVEL_REPLICA"},
2: {Sym: "WAL_LEVEL_LOGICAL"},
}
type icuVersionMapper struct{}
func (m icuVersionMapper) MapUint(s scalar.Uint) (scalar.Uint, error) {
s.ScalarActual()
a := s.Actual
major := a & 0xff
minor := (a >> 8) & 0xff
v1 := (a >> 16) & 0xff
v2 := (a >> 24) & 0xff
s.Sym = fmt.Sprintf("%d.%d.%d.%d", major, minor, v1, v2)
return s, nil
}
var IcuVersionMapper = icuVersionMapper{}
type xLogRecPtrMapper struct{}
func (m xLogRecPtrMapper) MapUint(s scalar.Uint) (scalar.Uint, error) {
v := s.Actual
s.Sym = fmt.Sprintf("%X/%X", v>>32, uint32(v))
return s, nil
}
var XLogRecPtrMapper = xLogRecPtrMapper{}
var LocPtrMapper = xLogRecPtrMapper{}
type nextFullXidMapper struct{}
func (m nextFullXidMapper) MapUint(s scalar.Uint) (scalar.Uint, error) {
v := s.Actual
s.Sym = fmt.Sprintf("%d:%d", v>>32, uint32(v))
return s, nil
}
var NextFullXidMapper = nextFullXidMapper{}
type timeMapper struct{}
func (m timeMapper) MapSint(s scalar.Sint) (scalar.Sint, error) {
ut := s.Actual
t := time.Unix(ut, 0)
s.Sym = t.UTC().Format(time.RFC1123)
return s, nil
}
var TimeMapper = timeMapper{}
// typedef enum
//
// {
// PG_UNKNOWN = 0xFFFF,
// PG_ORIGINAL = 0,
// PGPRO_STANDARD = ('P'<<8|'P'),
// PGPRO_ENTERPRISE = ('P'<<8|'E'),
// } PgEdition;
const (
PG_UNKNOWN = 0xFFFF
PG_ORIGINAL = 0
PGPRO_STANDARD = (uint32('P') << 8) | uint32('P')
PGPRO_ENTERPRISE = (uint32('P') << 8) | uint32('E')
PG_UNKNOWN_STR = "(unknown edition)"
PG_ORIGINAL_STR = "PostgreSQL"
PGPRO_STANDARD_STR = "Postgres Pro Standard"
PGPRO_ENTERPRISE_STR = "Postgres Pro Enterprise"
)
type versionMapper struct{}
func (m versionMapper) MapUint(s scalar.Uint) (scalar.Uint, error) {
v := s.Actual
v1, v2 := ParsePgProVersion(uint32(v))
switch v1 {
case PG_UNKNOWN:
s.Sym = fmt.Sprintf("%s %d", PG_UNKNOWN_STR, v2)
case PG_ORIGINAL:
s.Sym = fmt.Sprintf("%s %d", PG_ORIGINAL_STR, v2)
case PGPRO_STANDARD:
s.Sym = fmt.Sprintf("%s %d", PGPRO_STANDARD_STR, v2)
case PGPRO_ENTERPRISE:
s.Sym = fmt.Sprintf("%s %d", PGPRO_ENTERPRISE_STR, v2)
}
return s, nil
}
var VersionMapper = versionMapper{}
func ParsePgProVersion(v uint32) (pgProVersion uint32, oriVer uint32) {
pgProVersion = v >> 16
oriVer = v & 0xffff
return
}
type hexMapper struct{}
func (m hexMapper) MapUint(s scalar.Uint) (scalar.Uint, error) {
v := s.Actual
s.Sym = fmt.Sprintf("%X", v)
return s, nil
}
var HexMapper = hexMapper{}