73 lines
1.2 KiB
Go
73 lines
1.2 KiB
Go
package _sample
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"git.fabbe.io/pglisten.git"
|
|
"os/exec"
|
|
)
|
|
|
|
var (
|
|
host string
|
|
dbname string
|
|
password string
|
|
user string
|
|
channel string
|
|
err error
|
|
)
|
|
|
|
func parseflags() {
|
|
flag.StringVar(&host, "host", "localhost", "host or IP")
|
|
flag.StringVar(&dbname, "dbname", "postgres", "")
|
|
flag.StringVar(&password, "password", "supersecret", "")
|
|
flag.StringVar(&user, "user", "postgres", "")
|
|
flag.StringVar(&channel, "channel", "events", "")
|
|
|
|
flag.Parse()
|
|
}
|
|
|
|
func handleevent(m pglisten.Message) bool {
|
|
if m.Table != "" && m.Op != "" {
|
|
println(fmt.Sprintf("%s on table %s", m.Op, m.Table))
|
|
}
|
|
|
|
switch m.Table {
|
|
case "sometable":
|
|
for k, v := range m.Payload {
|
|
if k == "id" {
|
|
if str, ok := v.(string); ok {
|
|
go func() {
|
|
cmd := exec.Command("touch", "/tmp/"+str)
|
|
cmd.Run()
|
|
}()
|
|
}
|
|
}
|
|
}
|
|
|
|
default:
|
|
fmt.Println(m.Payload)
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func main() {
|
|
parseflags()
|
|
|
|
conninfo := fmt.Sprintf(
|
|
"host=%s dbname=%s user=%s password=%s sslmode=disable",
|
|
host, dbname, user, password)
|
|
|
|
db, err = sql.Open("postgres", conninfo)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
err = db.Ping()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
pglisten.On(conninfo, channel, handleevent)
|
|
}
|