aboutsummaryrefslogtreecommitdiff
path: root/_example
diff options
context:
space:
mode:
authorPhilip O'Toole <philip.otoole@yahoo.com>2016-02-23 01:18:14 -0500
committerPhilip O'Toole <philip.otoole@yahoo.com>2016-02-23 01:18:14 -0500
commit3e97a4ca68500045276a2ba7051740bd53e40d06 (patch)
treed984cc8023dffd95fd37fc6ed293ba80f973592a /_example
parentMerge pull request #134 from antoine-lizee/patch-1 (diff)
parentMerge pull request #267 from ianlancetaylor/go16 (diff)
downloadgolite-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.go133
-rw-r--r--_example/hook/hook.go14
-rw-r--r--_example/mod_vtable/sqlite3_mod_vtable.cc2
-rw-r--r--_example/simple/simple.go1
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 {