From b5088961cb67e2163e86cc877832da9184c0c92f Mon Sep 17 00:00:00 2001 From: jim teeuwen Date: Tue, 21 Dec 2010 10:08:14 +0100 Subject: [PATCH] Fixed broken examples. Use of defer statement to ensure closing of Database and cleanup of statement. --- Examples/makefile | 23 +++++++++++++++++ Examples/query.go | 39 +++++++++++++++++------------ Examples/reconnect.go | 46 +++++++++++++++++++--------------- Examples/statement.go | 57 ++++++++++++++++++++++++++----------------- 4 files changed, 106 insertions(+), 59 deletions(-) create mode 100644 Examples/makefile diff --git a/Examples/makefile b/Examples/makefile new file mode 100644 index 0000000..6a0f1d5 --- /dev/null +++ b/Examples/makefile @@ -0,0 +1,23 @@ +include $(GOROOT)/src/Make.inc + +EXAMPLES = query reconnect statement + +all: $(EXAMPLES) + +query: + $(GC) -o $(@).$(O) $(@).go + $(LD) -s -o $(@) $(@).$(O) + +reconnect: + $(GC) -o $(@).$(O) $(@).go + $(LD) -s -o $(@) $(@).$(O) + +statement: + $(GC) -o $(@).$(O) $(@).go + $(LD) -s -o $(@) $(@).$(O) + +clean: + rm -rf *.[568oa] $(EXAMPLES) + + + diff --git a/Examples/query.go b/Examples/query.go index 9c7d05a..1216941 100644 --- a/Examples/query.go +++ b/Examples/query.go @@ -9,39 +9,46 @@ import ( ) func main() { + var err os.Error + var res *mysql.MySQLResult + var row map[string]interface{} + var key string + var value interface{} + // Create new instance db := mysql.New() + // Enable logging db.Logging = true + // Connect to database - db.Connect("localhost", "root", "********", "gotesting") - if db.Errno != 0 { - fmt.Printf("Error #%d %s\n", db.Errno, db.Error) + if err = db.Connect("localhost", "root", "********", "gotesting"); err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) os.Exit(1) } + + defer db.Close() + // Use UTF8 - db.Query("SET NAMES utf8") - if db.Errno != 0 { - fmt.Printf("Error #%d %s\n", db.Errno, db.Error) + if _, err = db.Query("SET NAMES utf8"); err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) os.Exit(1) } + // Query database - res := db.Query("SELECT * FROM test1 LIMIT 5") - if db.Errno != 0 { - fmt.Printf("Error #%d %s\n", db.Errno, db.Error) + if res, err = db.Query("SELECT * FROM test1 LIMIT 5"); err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) os.Exit(1) } - // Display results - var row map[string]interface{} + for { - row = res.FetchMap() - if row == nil { + if row = res.FetchMap(); row == nil { break } - for key, value := range row { + + for key, value = range row { fmt.Printf("%s:%v\n", key, value) } } - // Close connection - db.Close() + } diff --git a/Examples/reconnect.go b/Examples/reconnect.go index 450deab..0a56de6 100644 --- a/Examples/reconnect.go +++ b/Examples/reconnect.go @@ -11,46 +11,52 @@ import ( ) // Reconnect function, attempts to reconnect once per second -func reconnect(db *mysql.MySQL, done chan int) { +func reconnect(db *mysql.MySQL, done chan bool) { + var err os.Error attempts := 0 + for { // Sleep for 1 second - time.Sleep(1000000000) + time.Sleep(1e9) + // Attempt to reconnect - db.Reconnect() - // If there was no error break for loop - if db.Errno == 0 { + if err = db.Reconnect(); err != nil { break - } else { - attempts++ - fmt.Printf("Reconnect attempt %d failed\n", attempts) } + + attempts++ + fmt.Fprintf(os.Stderr, "Reconnect attempt %d failed\n", attempts) } - done <- 1 + + done <- true } func main() { + var err os.Error + // Create new instance db := mysql.New() - // Enable logging - db.Logging = true + // Connect to database - db.Connect("localhost", "root", "********", "gotesting") - if db.Errno != 0 { - fmt.Printf("Error #%d %s\n", db.Errno, db.Error) + if err = db.Connect("localhost", "root", "********", "gotesting"); err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) os.Exit(1) } + + // Ensure connection is closed on exit. + defer db.Close() + + done := make(chan bool) + // Repeat query forever for { - res := db.Query("select * from test1") - // On error reconnect to the server - if res == nil { - fmt.Printf("Error #%d %s\n", db.Errno, db.Error) - done := make(chan int) + if _, err = db.Query("SELECT * FROM test1 LIMIT 5"); err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) go reconnect(db, done) <-done } + // Sleep for 0.5 seconds - time.Sleep(500000000) + time.Sleep(5e8) } } diff --git a/Examples/statement.go b/Examples/statement.go index bd4f15c..26407b4 100644 --- a/Examples/statement.go +++ b/Examples/statement.go @@ -9,51 +9,62 @@ import ( ) func main() { + var err os.Error + var res *mysql.MySQLResult + var row map[string]interface{} + var key string + var value interface{} + var stmt *mysql.MySQLStatement + // Create new instance db := mysql.New() - // Enable logging - db.Logging = true + // Connect to database - db.Connect("localhost", "root", "********", "gotesting") - if db.Errno != 0 { - fmt.Printf("Error #%d %s\n", db.Errno, db.Error) + if err = db.Connect("localhost", "root", "********", "gotesting"); err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) os.Exit(1) } + + // Ensure connection is closed on exit. + defer db.Close() + // Use UTF8 - db.Query("SET NAMES utf8") - if db.Errno != 0 { - fmt.Printf("Error #%d %s\n", db.Errno, db.Error) + if _, err = db.Query("SET NAMES utf8"); err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) os.Exit(1) } + // Initialise statement - stmt := db.InitStmt() + if stmt, err = db.InitStmt(); err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + os.Exit(1) + } + // Prepare statement - stmt.Prepare("SELECT * FROM test1 WHERE id > ? AND id < ?") - if stmt.Errno != 0 { - fmt.Printf("Error #%d %s\n", stmt.Errno, stmt.Error) + if err = stmt.Prepare("SELECT * FROM test1 WHERE id > ? AND id < ?"); err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) os.Exit(1) } + // Bind params stmt.BindParams(1, 5) + // Execute statement - res := stmt.Execute() - if stmt.Errno != 0 { - fmt.Printf("Error #%d %s\n", stmt.Errno, stmt.Error) + if res, err = stmt.Execute(); err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) os.Exit(1) } + + defer stmt.Close() + // Display results - var row map[string]interface{} for { - row = res.FetchMap() - if row == nil { + if row = res.FetchMap(); row == nil { break } - for key, value := range row { + + for key, value = range row { fmt.Printf("%s:%v\n", key, value) } } - // Close statement - stmt.Close() - // Close connection - db.Close() }