func main() { db, err := postgres.Open("", "") if err != nil { log.Fatal(err) } m := migrate.NewMigrations() m.Add(1, "CREATE SEQUENCE hits") if err := m.Migrate(db.DB); err != nil { log.Fatal(err) } stmt, err := db.Prepare("SELECT nextval(hits)") if err != nil { log.Fatal(err) } port := os.Getenv("PORT") http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { var count int if err := stmt.QueryRow().Scan(&count); err != nil { w.WriteHeader(500) w.Write([]byte(err.Error())) return } fmt.Fprintf(w, "Hello from Go on Flynn: port=%s hits=%d", port, count) }) fmt.Println("hitcounter listening on port", port) log.Fatal(http.ListenAndServe(":"+port, nil)) }
func NewPostgresFilesystem(db *sql.DB) (Filesystem, error) { m := migrate.NewMigrations() m.Add(1, `CREATE TABLE files ( file_id oid PRIMARY KEY DEFAULT lo_create(0), name text UNIQUE NOT NULL, size bigint, type text, digest text, created_at timestamp with time zone NOT NULL DEFAULT current_timestamp );`, `CREATE FUNCTION delete_file() RETURNS TRIGGER AS $$ BEGIN PERFORM lo_unlink(OLD.file_id); RETURN NULL; END; $$ LANGUAGE plpgsql;`, `CREATE TRIGGER delete_file AFTER DELETE ON files FOR EACH ROW EXECUTE PROCEDURE delete_file();`, ) return &PostgresFilesystem{db: db}, m.Migrate(db) }