diff options
author | Philip O'Toole <philip.otoole@yahoo.com> | 2016-02-23 01:18:14 -0500 |
---|---|---|
committer | Philip O'Toole <philip.otoole@yahoo.com> | 2016-02-23 01:18:14 -0500 |
commit | 3e97a4ca68500045276a2ba7051740bd53e40d06 (patch) | |
tree | d984cc8023dffd95fd37fc6ed293ba80f973592a /_example | |
parent | Merge pull request #134 from antoine-lizee/patch-1 (diff) | |
parent | Merge pull request #267 from ianlancetaylor/go16 (diff) | |
download | golite-3e97a4ca68500045276a2ba7051740bd53e40d06.tar.gz golite-3e97a4ca68500045276a2ba7051740bd53e40d06.tar.xz |
Merge pull request #1 from mattn/master
Bring master up-to-date
Diffstat (limited to '_example')
-rw-r--r-- | _example/custom_func/main.go | 133 | ||||
-rw-r--r-- | _example/hook/hook.go | 14 | ||||
-rw-r--r-- | _example/mod_vtable/sqlite3_mod_vtable.cc | 2 | ||||
-rw-r--r-- | _example/simple/simple.go | 1 |
4 files changed, 141 insertions, 9 deletions
diff --git a/_example/custom_func/main.go b/_example/custom_func/main.go new file mode 100644 index 0000000..85657e6 --- /dev/null +++ b/_example/custom_func/main.go @@ -0,0 +1,133 @@ +package main + +import ( + "database/sql" + "fmt" + "log" + "math" + "math/rand" + + sqlite "github.com/mattn/go-sqlite3" +) + +// Computes x^y +func pow(x, y int64) int64 { + return int64(math.Pow(float64(x), float64(y))) +} + +// Computes the bitwise exclusive-or of all its arguments +func xor(xs ...int64) int64 { + var ret int64 + for _, x := range xs { + ret ^= x + } + return ret +} + +// Returns a random number. It's actually deterministic here because +// we don't seed the RNG, but it's an example of a non-pure function +// from SQLite's POV. +func getrand() int64 { + return rand.Int63() +} + +// Computes the standard deviation of a GROUPed BY set of values +type stddev struct { + xs []int64 + // Running average calculation + sum int64 + n int64 +} + +func newStddev() *stddev { return &stddev{} } + +func (s *stddev) Step(x int64) { + s.xs = append(s.xs, x) + s.sum += x + s.n++ +} + +func (s *stddev) Done() float64 { + mean := float64(s.sum) / float64(s.n) + var sqDiff []float64 + for _, x := range s.xs { + sqDiff = append(sqDiff, math.Pow(float64(x)-mean, 2)) + } + var dev float64 + for _, x := range sqDiff { + dev += x + } + dev /= float64(len(sqDiff)) + return math.Sqrt(dev) +} + +func main() { + sql.Register("sqlite3_custom", &sqlite.SQLiteDriver{ + ConnectHook: func(conn *sqlite.SQLiteConn) error { + if err := conn.RegisterFunc("pow", pow, true); err != nil { + return err + } + if err := conn.RegisterFunc("xor", xor, true); err != nil { + return err + } + if err := conn.RegisterFunc("rand", getrand, false); err != nil { + return err + } + if err := conn.RegisterAggregator("stddev", newStddev, true); err != nil { + return err + } + return nil + }, + }) + + db, err := sql.Open("sqlite3_custom", ":memory:") + if err != nil { + log.Fatal("Failed to open database:", err) + } + defer db.Close() + + var i int64 + err = db.QueryRow("SELECT pow(2,3)").Scan(&i) + if err != nil { + log.Fatal("POW query error:", err) + } + fmt.Println("pow(2,3) =", i) // 8 + + err = db.QueryRow("SELECT xor(1,2,3,4,5,6)").Scan(&i) + if err != nil { + log.Fatal("XOR query error:", err) + } + fmt.Println("xor(1,2,3,4,5) =", i) // 7 + + err = db.QueryRow("SELECT rand()").Scan(&i) + if err != nil { + log.Fatal("RAND query error:", err) + } + fmt.Println("rand() =", i) // pseudorandom + + _, err = db.Exec("create table foo (department integer, profits integer)") + if err != nil { + log.Fatal("Failed to create table:", err) + } + _, err = db.Exec("insert into foo values (1, 10), (1, 20), (1, 45), (2, 42), (2, 115)") + if err != nil { + log.Fatal("Failed to insert records:", err) + } + + rows, err := db.Query("select department, stddev(profits) from foo group by department") + if err != nil { + log.Fatal("STDDEV query error:", err) + } + defer rows.Close() + for rows.Next() { + var dept int64 + var dev float64 + if err := rows.Scan(&dept, &dev); err != nil { + log.Fatal(err) + } + fmt.Printf("dept=%d stddev=%f\n", dept, dev) + } + if err := rows.Err(); err != nil { + log.Fatal(err) + } +} diff --git a/_example/hook/hook.go b/_example/hook/hook.go index 59f8cd4..3059f9e 100644 --- a/_example/hook/hook.go +++ b/_example/hook/hook.go @@ -10,12 +10,12 @@ import ( func main() { sqlite3conn := []*sqlite3.SQLiteConn{} sql.Register("sqlite3_with_hook_example", - &sqlite3.SQLiteDriver{ - ConnectHook: func(conn *sqlite3.SQLiteConn) error { - sqlite3conn = append(sqlite3conn, conn) - return nil - }, - }) + &sqlite3.SQLiteDriver{ + ConnectHook: func(conn *sqlite3.SQLiteConn) error { + sqlite3conn = append(sqlite3conn, conn) + return nil + }, + }) os.Remove("./foo.db") os.Remove("./bar.db") @@ -54,7 +54,7 @@ func main() { log.Fatal(err) } - bk.Step(-1) + _, err = bk.Step(-1) if err != nil { log.Fatal(err) } diff --git a/_example/mod_vtable/sqlite3_mod_vtable.cc b/_example/mod_vtable/sqlite3_mod_vtable.cc index 4caf484..5bd4e66 100644 --- a/_example/mod_vtable/sqlite3_mod_vtable.cc +++ b/_example/mod_vtable/sqlite3_mod_vtable.cc @@ -1,6 +1,6 @@ #include <string> #include <sstream> -#include <sqlite3.h> +#include <sqlite3-binding.h> #include <sqlite3ext.h> #include <curl/curl.h> #include "picojson.h" diff --git a/_example/simple/simple.go b/_example/simple/simple.go index a45c22b..6ab8d25 100644 --- a/_example/simple/simple.go +++ b/_example/simple/simple.go @@ -55,7 +55,6 @@ func main() { rows.Scan(&id, &name) fmt.Println(id, name) } - rows.Close() stmt, err = db.Prepare("select name from foo where id = ?") if err != nil { |