Commit 4f347f1e authored by gwenn's avatar gwenn

Introduce Must helper method (like in template standard package).

parent 0830587d
...@@ -51,8 +51,9 @@ type Column struct { ...@@ -51,8 +51,9 @@ type Column struct {
} }
// Executes pragma 'table_info' // Executes pragma 'table_info'
// TODO How to specify a database-name?
func (c *Conn) Columns(table string) ([]Column, os.Error) { func (c *Conn) Columns(table string) ([]Column, os.Error) {
s, err := c.Prepare(Mprintf("pragma table_info(%Q)", table)) s, err := c.Prepare(Mprintf("PRAGMA table_info(%Q)", table))
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -79,8 +80,9 @@ type ForeignKey struct { ...@@ -79,8 +80,9 @@ type ForeignKey struct {
} }
// Executes pragma 'foreign_key_list' // Executes pragma 'foreign_key_list'
// TODO How to specify a database-name?
func (c *Conn) ForeignKeys(table string) (map[int]*ForeignKey, os.Error) { func (c *Conn) ForeignKeys(table string) (map[int]*ForeignKey, os.Error) {
s, err := c.Prepare(Mprintf("pragma foreign_key_list(%Q)", table)) s, err := c.Prepare(Mprintf("PRAGMA foreign_key_list(%Q)", table))
if err != nil { if err != nil {
return nil, err return nil, err
} }
......
...@@ -504,6 +504,7 @@ func (s *Stmt) ColumnName(index int) string { ...@@ -504,6 +504,7 @@ func (s *Stmt) ColumnName(index int) string {
} }
// The leftmost column is number 0. // The leftmost column is number 0.
// After a type conversion, the value returned by sqlite3_column_type() is undefined.
// Calls sqlite3_column_type // Calls sqlite3_column_type
// http://sqlite.org/c3ref/column_blob.html // http://sqlite.org/c3ref/column_blob.html
func (s *Stmt) columnType(index int) C.int { func (s *Stmt) columnType(index int) C.int {
...@@ -608,7 +609,6 @@ func (s *Stmt) ScanColumn(index int, value interface{}, nullable bool) (bool, os ...@@ -608,7 +609,6 @@ func (s *Stmt) ScanColumn(index int, value interface{}, nullable bool) (bool, os
*value = C.GoStringN((*C.char)(unsafe.Pointer(p)), n) *value = C.GoStringN((*C.char)(unsafe.Pointer(p)), n)
} }
case *int: case *int:
// After a type conversion, the value returned by sqlite3_column_type() is undefined.
if nullable && s.columnType(index) == C.SQLITE_NULL { if nullable && s.columnType(index) == C.SQLITE_NULL {
*value = 0 *value = 0
isNull = true isNull = true
...@@ -682,6 +682,15 @@ func (c *Conn) Close() os.Error { ...@@ -682,6 +682,15 @@ func (c *Conn) Close() os.Error {
return nil return nil
} }
// Must is a helper that wraps a call to a function returning (bool, os.Error)
// and panics if the error is non-nil.
func Must(b bool, err os.Error) bool {
if err != nil {
panic(err)
}
return b
}
func btocint(b bool) C.int { func btocint(b bool) C.int {
if b { if b {
return 1 return 1
......
...@@ -74,15 +74,9 @@ func TestOpen(t *testing.T) { ...@@ -74,15 +74,9 @@ func TestOpen(t *testing.T) {
func TestEnableFKey(t *testing.T) { func TestEnableFKey(t *testing.T) {
db := open(t) db := open(t)
defer db.Close() defer db.Close()
b, err := db.IsFKeyEnabled() b := Must(db.IsFKeyEnabled())
if err != nil {
t.Fatalf("Error while checking if FK are enabled: %s", err)
}
if !b { if !b {
b, err = db.EnableFKey(true) b = Must(db.EnableFKey(true))
if err != nil {
t.Fatalf("Error while enabling FK: %s", err)
}
if !b { if !b {
t.Error("cannot enabled FK") t.Error("cannot enabled FK")
} }
...@@ -112,17 +106,11 @@ func TestTransaction(t *testing.T) { ...@@ -112,17 +106,11 @@ func TestTransaction(t *testing.T) {
func TestExists(t *testing.T) { func TestExists(t *testing.T) {
db := open(t) db := open(t)
defer db.Close() defer db.Close()
b, err := db.Exists("SELECT 1 where 1 = 0") b := Must(db.Exists("SELECT 1 where 1 = 0"))
if err != nil {
t.Fatalf("Error: %s", err)
}
if b { if b {
t.Error("No row expected") t.Error("No row expected")
} }
b, err = db.Exists("SELECT 1 where 1 = 1") b = Must(db.Exists("SELECT 1 where 1 = 1"))
if err != nil {
t.Fatalf("Error: %s", err)
}
if !b { if !b {
t.Error("One row expected") t.Error("One row expected")
} }
...@@ -164,10 +152,7 @@ func TestInsert(t *testing.T) { ...@@ -164,10 +152,7 @@ func TestInsert(t *testing.T) {
t.Errorf("column count error: %d <> 1", columnCount) t.Errorf("column count error: %d <> 1", columnCount)
} }
if ok, err := cs.Next(); !ok { if ok := Must(cs.Next()); !ok {
if err != nil {
t.Fatalf("error preparing count: %s", err)
}
t.Fatal("no result for count") t.Fatal("no result for count")
} }
var i int var i int
...@@ -215,7 +200,7 @@ func TestInsertWithStatement(t *testing.T) { ...@@ -215,7 +200,7 @@ func TestInsertWithStatement(t *testing.T) {
cs, _ := db.Prepare("SELECT COUNT(*) FROM test") cs, _ := db.Prepare("SELECT COUNT(*) FROM test")
defer cs.Finalize() defer cs.Finalize()
if ok, _ := cs.Next(); !ok { if ok := Must(cs.Next()); !ok {
t.Fatal("no result for count") t.Fatal("no result for count")
} }
var i int var i int
...@@ -237,7 +222,7 @@ func TestInsertWithStatement(t *testing.T) { ...@@ -237,7 +222,7 @@ func TestInsertWithStatement(t *testing.T) {
t.Errorf("column name error: %s <> 'int_num'", secondColumnName) t.Errorf("column name error: %s <> 'int_num'", secondColumnName)
} }
if ok, _ := rs.Next(); ok { if ok := Must(rs.Next()); ok {
var fnum float64 var fnum float64
var inum int64 var inum int64
var sstr string var sstr string
...@@ -252,7 +237,7 @@ func TestInsertWithStatement(t *testing.T) { ...@@ -252,7 +237,7 @@ func TestInsertWithStatement(t *testing.T) {
t.Errorf("Expected 'hello' <> %s\n", sstr) t.Errorf("Expected 'hello' <> %s\n", sstr)
} }
} }
if ok, _ := rs.Next(); ok { if ok := Must(rs.Next()); ok {
var fnum float64 var fnum float64
var inum int64 var inum int64
var sstr string var sstr string
...@@ -406,33 +391,24 @@ func TestScanColumn(t *testing.T) { ...@@ -406,33 +391,24 @@ func TestScanColumn(t *testing.T) {
t.Fatalf("prepare error: %s", err) t.Fatalf("prepare error: %s", err)
} }
defer s.Finalize() defer s.Finalize()
if ok, err := s.Next(); !ok { if ok := Must(s.Next()); !ok {
if err != nil { t.Fatal("no result")
t.Fatalf("error preparing count: %s", err)
}
t.Fatal("no result for count")
} }
var i1, i2, i3 int var i1, i2, i3 int
null, err := s.ScanColumn(0, &i1, true) null := Must(s.ScanColumn(0, &i1, true))
if err != nil { if null {
t.Errorf("scan error: %s\n", err)
} else if null {
t.Errorf("Expected not null value") t.Errorf("Expected not null value")
} else if i1 != 1 { } else if i1 != 1 {
t.Errorf("Expected 1 <> %d\n", i1) t.Errorf("Expected 1 <> %d\n", i1)
} }
null, err = s.ScanColumn(1, &i2, true) null = Must(s.ScanColumn(1, &i2, true))
if err != nil { if !null {
t.Errorf("scan error: %s\n", err)
} else if !null {
t.Errorf("Expected null value") t.Errorf("Expected null value")
} else if i2 != 0 { } else if i2 != 0 {
t.Errorf("Expected 0 <> %d\n", i2) t.Errorf("Expected 0 <> %d\n", i2)
} }
null, err = s.ScanColumn(2, &i3, true) null = Must(s.ScanColumn(2, &i3, true))
if err != nil { if null {
t.Errorf("scan error: %s\n", err)
} else if null {
t.Errorf("Expected not null value") t.Errorf("Expected not null value")
} else if i3 != 0 { } else if i3 != 0 {
t.Errorf("Expected 0 <> %d\n", i3) t.Errorf("Expected 0 <> %d\n", i3)
...@@ -448,33 +424,24 @@ func TestNamedScanColumn(t *testing.T) { ...@@ -448,33 +424,24 @@ func TestNamedScanColumn(t *testing.T) {
t.Fatalf("prepare error: %s", err) t.Fatalf("prepare error: %s", err)
} }
defer s.Finalize() defer s.Finalize()
if ok, err := s.Next(); !ok { if ok := Must(s.Next()); !ok {
if err != nil { t.Fatal("no result")
t.Fatalf("error preparing count: %s", err)
}
t.Fatal("no result for count")
} }
var i1, i2, i3 int var i1, i2, i3 int
null, err := s.NamedScanColumn("i1", &i1, true) null := Must(s.NamedScanColumn("i1", &i1, true))
if err != nil { if null {
t.Errorf("scan error: %s\n", err)
} else if null {
t.Errorf("Expected not null value") t.Errorf("Expected not null value")
} else if i1 != 1 { } else if i1 != 1 {
t.Errorf("Expected 1 <> %d\n", i1) t.Errorf("Expected 1 <> %d\n", i1)
} }
null, err = s.NamedScanColumn("i2", &i2, true) null = Must(s.NamedScanColumn("i2", &i2, true))
if err != nil { if !null {
t.Errorf("scan error: %s\n", err)
} else if !null {
t.Errorf("Expected null value") t.Errorf("Expected null value")
} else if i2 != 0 { } else if i2 != 0 {
t.Errorf("Expected 0 <> %d\n", i2) t.Errorf("Expected 0 <> %d\n", i2)
} }
null, err = s.NamedScanColumn("i3", &i3, true) null = Must(s.NamedScanColumn("i3", &i3, true))
if err != nil { if null {
t.Errorf("scan error: %s\n", err)
} else if null {
t.Errorf("Expected not null value") t.Errorf("Expected not null value")
} else if i3 != 0 { } else if i3 != 0 {
t.Errorf("Expected 0 <> %d\n", i3) t.Errorf("Expected 0 <> %d\n", i3)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment