perkeep/third_party/github.com/ziutek/mymysql/examples/long_data.go

134 lines
2.7 KiB
Go

// This example reads URL from stdin and retrieve its content directly to
// database using SendLongData method
package main
import (
"os"
"fmt"
"strings"
"net/http"
"camlistore.org/third_party/github.com/ziutek/mymysql/mysql"
_ "camlistore.org/third_party/github.com/ziutek/mymysql/thrsafe"
)
func printOK() {
fmt.Println("OK")
}
func checkError(err error) {
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}
func main() {
user := "testuser"
pass := "TestPasswd9"
dbname := "test"
//proto := "unix"
//addr := "/var/run/mysqld/mysqld.sock"
proto := "tcp"
addr := "127.0.0.1:3306"
db := mysql.New(proto, "", addr, user, pass, dbname)
//db.Debug = true
fmt.Printf("Connect to %s:%s... ", proto, addr)
checkError(db.Connect())
printOK()
fmt.Print("Drop 'web' table if exists... ")
_, err := db.Start("DROP TABLE web")
if err == nil {
printOK()
} else if e, ok := err.(*mysql.Error); ok {
// Error from MySQL server
fmt.Println(e)
} else {
checkError(err)
}
fmt.Print("Create 'web' table... ")
_, err = db.Start("CREATE TABLE web (url VARCHAR(80), content LONGBLOB)")
checkError(err)
printOK()
fmt.Print("Prepare insert statement... ")
ins, err := db.Prepare("INSERT INTO web VALUES (?, ?)")
checkError(err)
printOK()
fmt.Print("Prepare select statement... ")
sel, err := db.Prepare("SELECT url, OCTET_LENGTH(content) FROM web")
checkError(err)
printOK()
var url string
fmt.Print("Bind insert parameters... ")
ins.Bind(&url, []byte(nil))
printOK()
fmt.Println()
for {
url = ""
fmt.Print("Please enter an URL (blank line terminates input): ")
fmt.Scanln(&url)
if len(url) == 0 {
break
}
if !strings.Contains(url, "://") {
url = "http://" + url
}
http_res, err := http.Get(url)
if err != nil {
fmt.Println(err)
continue
}
// Retrieve response directly into database. Use 8 kB buffer.
checkError(ins.SendLongData(1, http_res.Body, 8192))
_, err = ins.Run()
checkError(err)
}
fmt.Println()
fmt.Print("Select from 'web' table... ")
rows, res, err := sel.Exec()
checkError(err)
printOK()
// Print fields names
fmt.Println()
for _, field := range res.Fields() {
fmt.Printf("%-38s ", field.Name)
}
fmt.Println()
fmt.Println("------------------------------------------------------------")
// Print result
for _, row := range rows {
for ii, col := range row {
if col == nil {
fmt.Print("%-38s ", "NULL")
} else {
fmt.Printf("%-38s ", row.Bin(ii))
}
}
fmt.Println()
}
fmt.Println()
fmt.Print("Hit ENTER to exit ")
fmt.Scanln()
fmt.Print("Remove 'web' table... ")
_, err = db.Start("DROP TABLE web")
checkError(err)
printOK()
fmt.Print("Close connection... ")
checkError(db.Close())
printOK()
}