Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- // functionally same as `main.go`, with different trigger definition
- import (
- "database/sql"
- "fmt"
- sqlite "github.com/mattn/go-sqlite3"
- "log"
- "os"
- )
- func foobar(y int64) string {
- if 0 != y%2 {
- return "as if, not even"
- }
- return ""
- }
- func main() {
- sql.Register("sqlite3_custom", &sqlite.SQLiteDriver{
- ConnectHook: func(conn *sqlite.SQLiteConn) error {
- if err := conn.RegisterFunc("validate", foobar, false); 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 string
- err = db.QueryRow("SELECT validate(3)").Scan(&i)
- if err != nil {
- log.Fatal("POW query error:", err)
- }
- fmt.Println("validate(3) =", i) // 0
- err = db.QueryRow("SELECT validate(442)").Scan(&i)
- if err != nil {
- log.Fatal("POW query error:", err)
- }
- fmt.Println("validate(442) =", i) // 0
- _, err = db.Exec("create table foo (department integer, profits integer)")
- if err != nil {
- log.Fatal("Failed to create table:", err)
- }
- mkTrigger := `
- CREATE TRIGGER insert_trigger
- BEFORE INSERT ON foo
- BEGIN
- SELECT CASE
- WHEN ( (SELECT validate(NEW.department) as error_string) != '')
- THEN RAISE(ABORT, "invalid department" )
- END;
- END;
- `
- _, err = db.Exec(mkTrigger)
- if err != nil {
- log.Printf("error creating trigger %q: %s", err, mkTrigger)
- os.Exit(1)
- return
- }
- log.Println("inserting 1st")
- _, err = db.Exec("insert into foo values (10, 10)")
- if err != nil {
- log.Println("Failed to insert first:", err)
- }
- log.Println("inserting 2nd")
- _, err = db.Exec("insert into foo values (11, 10)")
- if err != nil {
- log.Println("Failed to insert 2nd:", err)
- }
- }
Add Comment
Please, Sign In to add comment