summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/lib/pq/example/listen/doc.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/lib/pq/example/listen/doc.go')
-rw-r--r--vendor/github.com/lib/pq/example/listen/doc.go98
1 files changed, 98 insertions, 0 deletions
diff --git a/vendor/github.com/lib/pq/example/listen/doc.go b/vendor/github.com/lib/pq/example/listen/doc.go
new file mode 100644
index 000000000..91e2ddbad
--- /dev/null
+++ b/vendor/github.com/lib/pq/example/listen/doc.go
@@ -0,0 +1,98 @@
+/*
+
+Package listen is a self-contained Go program which uses the LISTEN / NOTIFY
+mechanism to avoid polling the database while waiting for more work to arrive.
+
+ //
+ // You can see the program in action by defining a function similar to
+ // the following:
+ //
+ // CREATE OR REPLACE FUNCTION public.get_work()
+ // RETURNS bigint
+ // LANGUAGE sql
+ // AS $$
+ // SELECT CASE WHEN random() >= 0.2 THEN int8 '1' END
+ // $$
+ // ;
+
+ package main
+
+ import (
+ "database/sql"
+ "fmt"
+ "time"
+
+ "github.com/lib/pq"
+ )
+
+ func doWork(db *sql.DB, work int64) {
+ // work here
+ }
+
+ func getWork(db *sql.DB) {
+ for {
+ // get work from the database here
+ var work sql.NullInt64
+ err := db.QueryRow("SELECT get_work()").Scan(&work)
+ if err != nil {
+ fmt.Println("call to get_work() failed: ", err)
+ time.Sleep(10 * time.Second)
+ continue
+ }
+ if !work.Valid {
+ // no more work to do
+ fmt.Println("ran out of work")
+ return
+ }
+
+ fmt.Println("starting work on ", work.Int64)
+ go doWork(db, work.Int64)
+ }
+ }
+
+ func waitForNotification(l *pq.Listener) {
+ select {
+ case <-l.Notify:
+ fmt.Println("received notification, new work available")
+ case <-time.After(90 * time.Second):
+ go l.Ping()
+ // Check if there's more work available, just in case it takes
+ // a while for the Listener to notice connection loss and
+ // reconnect.
+ fmt.Println("received no work for 90 seconds, checking for new work")
+ }
+ }
+
+ func main() {
+ var conninfo string = ""
+
+ db, err := sql.Open("postgres", conninfo)
+ if err != nil {
+ panic(err)
+ }
+
+ reportProblem := func(ev pq.ListenerEventType, err error) {
+ if err != nil {
+ fmt.Println(err.Error())
+ }
+ }
+
+ minReconn := 10 * time.Second
+ maxReconn := time.Minute
+ listener := pq.NewListener(conninfo, minReconn, maxReconn, reportProblem)
+ err = listener.Listen("getwork")
+ if err != nil {
+ panic(err)
+ }
+
+ fmt.Println("entering main loop")
+ for {
+ // process all available work before waiting for notifications
+ getWork(db)
+ waitForNotification(listener)
+ }
+ }
+
+
+*/
+package listen