diff --git a/db.go b/db.go index ac2a03ed1a227d6a5fcde8b988f8b7a4ad8d1f28..71272898b62efd0be84f464c6ebcbd8872e2c2d5 100644 --- a/db.go +++ b/db.go @@ -30,6 +30,7 @@ package db import ( + "errors" "fmt" "reflect" ) @@ -410,6 +411,23 @@ type MultiFlag bool type SqlValues []string type SqlArgs []string +// Error messages +var ( + ErrExpectingPointer = errors.New(`Expecting a pointer destination (dst interface{}).`) + ErrExpectingSlicePointer = errors.New(`Expecting a pointer to an slice (dst interface{}).`) + ErrExpectingSliceMapStruct = errors.New(`Expecting a pointer to an slice of maps or structs (dst interface{}).`) + ErrExpectingMapOrStruct = errors.New(`Expecting either a pointer to a map or a pointer to a struct.`) + ErrNoMoreRows = errors.New(`There are no more rows in this result set.`) + ErrNotConnected = errors.New(`You're currently not connected.`) + ErrMissingDatabaseName = errors.New(`Missing a database name.`) + ErrCollectionDoesNotExists = errors.New(`Collection does not exists.`) + ErrSockerOrHost = errors.New(`You can connect either to a socket or a host but not both.`) + ErrQueryLimitParam = errors.New(`A query can accept only one db.Limit() parameter.`) + ErrQuerySortParam = errors.New(`A query can accept only one db.Sort{} parameter.`) + ErrQueryOffsetParam = errors.New(`A query can accept only one db.Offset() parameter.`) + ErrMissingConditions = errors.New(`Missing selector conditions.`) +) + // Registered wrappers. var wrappers = make(map[string]Database) diff --git a/mongo/mongo.go b/mongo/mongo.go index bc959bc8d82b4be0d25df76a35a8c2a70d354136..30122876b01283f6155316f9c66d4c72c71b6dcf 100644 --- a/mongo/mongo.go +++ b/mongo/mongo.go @@ -25,8 +25,8 @@ package mongo import ( "fmt" - "menteslibres.net/gosexy/db" "labix.org/v2/mgo" + "menteslibres.net/gosexy/db" "net/url" "time" ) @@ -84,7 +84,7 @@ func (self *Source) Collection(name string) (db.Collection, error) { col.SetName = name if col.Exists() == false { - err = fmt.Errorf("Collection %s does not exists.", name) + err = db.ErrCollectionDoesNotExists } return col, err @@ -131,7 +131,7 @@ func (self *Source) Open() error { self.session, err = mgo.DialWithTimeout(connURL.String(), 5*time.Second) if err != nil { - return fmt.Errorf("Could not connect to %s: %s.", self.config.Host, err.Error()) + return err } if self.config.Database != "" { diff --git a/mongo/result.go b/mongo/result.go index 2d093b499a867a161f071e3163f2a8a2749876c0..3ba941a6c135d96c32c6294e5b5b9cce87eaad8f 100644 --- a/mongo/result.go +++ b/mongo/result.go @@ -24,10 +24,9 @@ package mongo import ( - "errors" + "labix.org/v2/mgo" "menteslibres.net/gosexy/db" "menteslibres.net/gosexy/db/util" - "labix.org/v2/mgo" ) type Result struct { @@ -61,7 +60,7 @@ func (self *Result) All(dst interface{}) error { func (self *Result) Next(dst interface{}) error { if self.iter.Next(dst) == false { - return errors.New("No more results.") + return db.ErrNoMoreRows } if self.iter.Err() != nil { diff --git a/mysql/collection.go b/mysql/collection.go index 66d8d54f45fb7220dd9672e4dfab38ba5c075123..68620251fc30d84a55bad32ec5853174016377c2 100644 --- a/mysql/collection.go +++ b/mysql/collection.go @@ -24,7 +24,6 @@ package mysql import ( - "errors" "fmt" _ "github.com/go-sql-driver/mysql" "menteslibres.net/gosexy/db" @@ -54,7 +53,7 @@ func (self *Table) Query(terms ...interface{}) (db.Result, error) { if queryChunks.Limit == "" { queryChunks.Limit = fmt.Sprintf("LIMIT %d", v) } else { - return nil, errors.New("A query can accept only one db.Limit() parameter.") + return nil, db.ErrQueryLimitParam } case db.Sort: if queryChunks.Sort == "" { @@ -73,13 +72,13 @@ func (self *Table) Query(terms ...interface{}) (db.Result, error) { } queryChunks.Sort = fmt.Sprintf("ORDER BY %s", strings.Join(sortChunks, ", ")) } else { - return nil, errors.New("A query can accept only one db.Sort{} parameter.") + return nil, db.ErrQuerySortParam } case db.Offset: if queryChunks.Offset == "" { queryChunks.Offset = fmt.Sprintf("OFFSET %d", v) } else { - return nil, errors.New("A query can accept only one db.Offset() parameter.") + return nil, db.ErrQueryOffsetParam } case db.Fields: queryChunks.Fields = append(queryChunks.Fields, v...) @@ -264,7 +263,7 @@ func (self *Table) Update(selector interface{}, update interface{}) error { selectorConds, selectorArgs := self.compileConditions(selector) if selectorConds == "" { - return errors.New("Received no conditions.") + return db.ErrMissingConditions } fields, values, err := self.FieldValues(update, toInternal) diff --git a/mysql/mysql.go b/mysql/mysql.go index 0ea251d93381457855ee5807384202e6c77fbca5..5578d917efa52a1529f8306a9ee43dec535ff8e1 100644 --- a/mysql/mysql.go +++ b/mysql/mysql.go @@ -25,7 +25,6 @@ package mysql import ( "database/sql" - "errors" "fmt" _ "github.com/go-sql-driver/mysql" "menteslibres.net/gosexy/db" @@ -113,7 +112,7 @@ func (self *Source) Name() string { // Wraps sql.DB.QueryRow func (self *Source) doQueryRow(terms ...interface{}) (*sql.Row, error) { if self.session == nil { - return nil, errors.New("You're currently not connected.") + return nil, db.ErrNotConnected } chunks := sqlCompile(terms) @@ -131,7 +130,7 @@ func (self *Source) doQueryRow(terms ...interface{}) (*sql.Row, error) { // Wraps sql.DB.Query func (self *Source) doQuery(terms ...interface{}) (*sql.Rows, error) { if self.session == nil { - return nil, fmt.Errorf("You're currently not connected.") + return nil, db.ErrNotConnected } chunks := sqlCompile(terms) @@ -149,7 +148,7 @@ func (self *Source) doQuery(terms ...interface{}) (*sql.Rows, error) { // Wraps sql.DB.Exec func (self *Source) doExec(terms ...interface{}) (sql.Result, error) { if self.session == nil { - return nil, fmt.Errorf("You're currently not connected.") + return nil, db.ErrNotConnected } chunks := sqlCompile(terms) @@ -201,11 +200,11 @@ func (self *Source) Open() error { } if self.config.Database == "" { - return fmt.Errorf("Database name is required.") + return db.ErrMissingDatabaseName } if self.config.Socket != "" && self.config.Host != "" { - return errors.New("Socket or Host are mutually exclusive.") + return db.ErrSockerOrHost } if self.config.Charset == "" { @@ -303,7 +302,7 @@ func (self *Source) Collection(name string) (db.Collection, error) { // Table exists? if table.Exists() == false { - return table, fmt.Errorf("Table %s does not exists.", name) + return table, db.ErrCollectionDoesNotExists } // Fetching table datatypes and mapping to internal gotypes. diff --git a/postgresql/collection.go b/postgresql/collection.go index 68a1e4358edf8f3f9e22536a7fc53394ec5b45c1..6539fb0f85ada81f6cddc3e69056f4bcaed9ec22 100644 --- a/postgresql/collection.go +++ b/postgresql/collection.go @@ -24,7 +24,6 @@ package postgresql import ( - "errors" "fmt" "menteslibres.net/gosexy/db" "menteslibres.net/gosexy/db/util/sqlutil" @@ -53,7 +52,7 @@ func (self *Table) Query(terms ...interface{}) (db.Result, error) { if queryChunks.Limit == "" { queryChunks.Limit = fmt.Sprintf("LIMIT %d", v) } else { - return nil, errors.New("A query can accept only one db.Limit() parameter.") + return nil, db.ErrQueryLimitParam } case db.Sort: if queryChunks.Sort == "" { @@ -72,13 +71,13 @@ func (self *Table) Query(terms ...interface{}) (db.Result, error) { } queryChunks.Sort = fmt.Sprintf("ORDER BY %s", strings.Join(sortChunks, ", ")) } else { - return nil, errors.New("A query can accept only one db.Sort{} parameter.") + return nil, db.ErrQuerySortParam } case db.Offset: if queryChunks.Offset == "" { queryChunks.Offset = fmt.Sprintf("OFFSET %d", v) } else { - return nil, errors.New("A query can accept only one db.Offset() parameter.") + return nil, db.ErrQueryOffsetParam } case db.Fields: queryChunks.Fields = append(queryChunks.Fields, v...) @@ -287,7 +286,7 @@ func (self *Table) Update(selector interface{}, update interface{}) error { selectorConds, selectorArgs := self.compileConditions(selector) if selectorConds == "" { - return errors.New("Received no conditions.") + return db.ErrMissingConditions } fields, values, err := self.FieldValues(update, toInternal) diff --git a/postgresql/postgresql.go b/postgresql/postgresql.go index 3bb9f52cd134bf765c774938b2ab45bddbaedd1b..e6137e1c203ba08213b6c6db1d005c42b870d01b 100644 --- a/postgresql/postgresql.go +++ b/postgresql/postgresql.go @@ -25,7 +25,6 @@ package postgresql import ( "database/sql" - "errors" "fmt" _ "github.com/xiam/gopostgresql" "menteslibres.net/gosexy/db" @@ -110,7 +109,7 @@ func (self *Source) Name() string { // Wraps sql.DB.QueryRow func (self *Source) doQueryRow(terms ...interface{}) (*sql.Row, error) { if self.session == nil { - return nil, fmt.Errorf("You're currently not connected.") + return nil, db.ErrNotConnected } chunks := sqlCompile(terms) @@ -132,7 +131,7 @@ func (self *Source) doQueryRow(terms ...interface{}) (*sql.Row, error) { // Wraps sql.DB.Query func (self *Source) doQuery(terms ...interface{}) (*sql.Rows, error) { if self.session == nil { - return nil, fmt.Errorf("You're currently not connected.") + return nil, db.ErrNotConnected } chunks := sqlCompile(terms) @@ -154,7 +153,7 @@ func (self *Source) doQuery(terms ...interface{}) (*sql.Rows, error) { // Wraps sql.DB.Exec func (self *Source) doExec(terms ...interface{}) (sql.Result, error) { if self.session == nil { - return nil, fmt.Errorf("You're currently not connected.") + return nil, db.ErrNotConnected } chunks := sqlCompile(terms) @@ -209,11 +208,11 @@ func (self *Source) Open() error { } if self.config.Database == "" { - return fmt.Errorf("Database name is required.") + return db.ErrMissingDatabaseName } if self.config.Socket != "" && self.config.Host != "" { - return errors.New("Socket or Host are mutually exclusive.") + return db.ErrSockerOrHost } var conn string @@ -227,7 +226,7 @@ func (self *Source) Open() error { self.session, err = sql.Open("postgres", conn) if err != nil { - return fmt.Errorf("Could not connect to %s: %s", self.config.Host, err.Error()) + return err } return nil @@ -307,7 +306,7 @@ func (self *Source) Collection(name string) (db.Collection, error) { // Table exists? if table.Exists() == false { - return table, fmt.Errorf("Table %s does not exists.", name) + return table, db.ErrCollectionDoesNotExists } // Fetching table datatypes and mapping to internal gotypes. diff --git a/sqlite/collection.go b/sqlite/collection.go index d786d67c38494fff1b4e1ba7297e1b1bdd0dacf0..62919712aa1ad059f1d60f9be0b775831470a5e2 100644 --- a/sqlite/collection.go +++ b/sqlite/collection.go @@ -24,7 +24,6 @@ package sqlite import ( - "errors" "fmt" "menteslibres.net/gosexy/db" "menteslibres.net/gosexy/db/util/sqlutil" @@ -55,7 +54,7 @@ func (self *Table) Query(terms ...interface{}) (db.Result, error) { if queryChunks.Limit == "" { queryChunks.Limit = fmt.Sprintf("LIMIT %d", v) } else { - return nil, errors.New("A query can accept only one db.Limit() parameter.") + return nil, db.ErrQueryLimitParam } case db.Sort: if queryChunks.Sort == "" { @@ -74,13 +73,13 @@ func (self *Table) Query(terms ...interface{}) (db.Result, error) { } queryChunks.Sort = fmt.Sprintf("ORDER BY %s", strings.Join(sortChunks, ", ")) } else { - return nil, errors.New("A query can accept only one db.Sort{} parameter.") + return nil, db.ErrQuerySortParam } case db.Offset: if queryChunks.Offset == "" { queryChunks.Offset = fmt.Sprintf("OFFSET %d", v) } else { - return nil, errors.New("A query can accept only one db.Offset() parameter.") + return nil, ErrQueryOffsetParam } case db.Fields: queryChunks.Fields = append(queryChunks.Fields, v...) @@ -265,7 +264,7 @@ func (self *Table) Update(selector interface{}, update interface{}) error { selectorConds, selectorArgs := self.compileConditions(selector) if selectorConds == "" { - return errors.New("Received no conditions.") + return db.ErrMissingConditions } fields, values, err := self.FieldValues(update, toInternal) diff --git a/sqlite/sqlite.go b/sqlite/sqlite.go index 961023d36305d649a4d0c0b52e1d7690c6a42438..5503507fa8952f56d9e576fec927d5e0501c5b96 100644 --- a/sqlite/sqlite.go +++ b/sqlite/sqlite.go @@ -25,7 +25,6 @@ package sqlite import ( "database/sql" - "errors" "fmt" _ "github.com/xiam/gosqlite3" "menteslibres.net/gosexy/db" @@ -115,7 +114,7 @@ func (self *Source) Name() string { func (self *Source) doQueryRow(terms ...interface{}) (*sql.Row, error) { if self.session == nil { - return nil, errors.New("You're currently not connected.") + return nil, db.ErrNotConnected } chunks := sqlCompile(terms) @@ -135,7 +134,7 @@ func (self *Source) doQueryRow(terms ...interface{}) (*sql.Row, error) { */ func (self *Source) doQuery(terms ...interface{}) (*sql.Rows, error) { if self.session == nil { - return nil, fmt.Errorf("You're currently not connected.") + return nil, db.ErrNotConnected } chunks := sqlCompile(terms) @@ -155,7 +154,7 @@ func (self *Source) doQuery(terms ...interface{}) (*sql.Rows, error) { */ func (self *Source) doExec(terms ...interface{}) (sql.Result, error) { if self.session == nil { - return nil, fmt.Errorf("You're currently not connected.") + return nil, db.ErrNotConnected } chunks := sqlCompile(terms) @@ -193,13 +192,13 @@ func (self *Source) Open() error { var err error if self.config.Database == "" { - return fmt.Errorf("Missing database path.") + return db.ErrMissingDatabaseName } self.session, err = sql.Open("sqlite3", self.config.Database) if err != nil { - return fmt.Errorf("Could not open %s: %s", self.config.Database, err.Error()) + return err } return nil @@ -282,7 +281,7 @@ func (self *Source) Collection(name string) (db.Collection, error) { // Table exists? if table.Exists() == false { - return table, fmt.Errorf("Table %s does not exists.", name) + return table, db.ErrCollectionDoesNotExists } // Fetching table datatypes and mapping to internal gotypes. diff --git a/util/main.go b/util/main.go index 276754b2beff11fd4c900cba8525ec661c596640..a815dc158e40ef6e5ad3d2504d92875669335e13 100644 --- a/util/main.go +++ b/util/main.go @@ -24,7 +24,6 @@ package util import ( - "errors" "fmt" "menteslibres.net/gosexy/db" "menteslibres.net/gosexy/to" @@ -34,12 +33,6 @@ import ( "time" ) -var ( - ErrExpectingPointer = errors.New(`Expecting a pointer destination (dst interface{}).`) - ErrExpectingSlicePointer = errors.New(`Expecting a pointer to an slice (dst interface{}).`) - ErrExpectingSliceMapStruct = errors.New(`Expecting a pointer to an slice of maps or structs (dst interface{}).`) -) - var extRelationPattern = regexp.MustCompile(`\{(.+)\}`) var columnCompareExclude = regexp.MustCompile(`[^a-zA-Z0-9]`) @@ -158,7 +151,7 @@ func Fetch(dst interface{}, item db.Item) error { dstv := reflect.ValueOf(dst) if dstv.Kind() != reflect.Ptr || dstv.IsNil() { - return fmt.Errorf("Fetch() expects a pointer.") + return db.ErrExpectingPointer } el := dstv.Elem().Type() @@ -179,7 +172,7 @@ func Fetch(dst interface{}, item db.Item) error { case reflect.Map: dstv.Elem().Set(reflect.ValueOf(item)) default: - return fmt.Errorf("Expecting a pointer to map or struct, got %s.", el.Kind()) + return db.ErrExpectingMapOrStruct } return nil @@ -311,7 +304,7 @@ func (self *C) FetchRelation(dst interface{}, relations []db.Relation, convertFn dstv := reflect.ValueOf(dst) if dstv.Kind() != reflect.Ptr || dstv.IsNil() { - return ErrExpectingPointer + return db.ErrExpectingPointer } err = fetchItemRelations(dstv.Elem(), relations, convertFn) @@ -357,18 +350,18 @@ func ValidateSliceDestination(dst interface{}) error { dstv = reflect.ValueOf(dst) if dstv.IsNil() || dstv.Kind() != reflect.Ptr { - return ErrExpectingPointer + return db.ErrExpectingPointer } if dstv.Elem().Kind() != reflect.Slice { - return ErrExpectingSlicePointer + return db.ErrExpectingSlicePointer } itemv = dstv.Elem() itemk = itemv.Type().Elem().Kind() if itemk != reflect.Struct && itemk != reflect.Map { - return ErrExpectingSliceMapStruct + return db.ErrExpectingSliceMapStruct } return nil diff --git a/util/sqlutil/main.go b/util/sqlutil/main.go index 3643c05cd5f8b25cc4cdbc2ea7d5f0a5c8761946..cd05fedde332bcc2211ed99b7374befd7c564542 100644 --- a/util/sqlutil/main.go +++ b/util/sqlutil/main.go @@ -25,8 +25,6 @@ package sqlutil import ( "database/sql" - "errors" - "fmt" "menteslibres.net/gosexy/db" "menteslibres.net/gosexy/db/util" "menteslibres.net/gosexy/to" @@ -34,10 +32,6 @@ import ( "strings" ) -var ( - ErrNoMoreRows = errors.New(`There are no more rows in this result set.`) -) - type T struct { PrimaryKey string ColumnTypes map[string]reflect.Kind @@ -86,7 +80,7 @@ func (self *T) fetchResult(itemt reflect.Type, rows *sql.Rows, columns []string) case reflect.Struct: item = reflect.New(itemt) default: - return item, fmt.Errorf("Don't know how to deal with %s, use either map or struct.", itemt.Kind()) + return item, db.ErrExpectingMapOrStruct } err = rows.Scan(scanArgs...) @@ -179,7 +173,7 @@ func (self *T) FetchRow(dst interface{}, rows *sql.Rows) error { dstv := reflect.ValueOf(dst) if dstv.IsNil() || dstv.Kind() != reflect.Ptr { - return util.ErrExpectingPointer + return db.ErrExpectingPointer } itemv := dstv.Elem() @@ -193,7 +187,7 @@ func (self *T) FetchRow(dst interface{}, rows *sql.Rows) error { next := rows.Next() if next == false { - return ErrNoMoreRows + return db.ErrNoMoreRows } item, err := self.fetchResult(itemv.Type(), rows, columns) @@ -216,15 +210,15 @@ func (self *T) FetchRows(dst interface{}, rows *sql.Rows) error { dstv := reflect.ValueOf(dst) if dstv.IsNil() || dstv.Kind() != reflect.Ptr { - return util.ErrExpectingPointer + return db.ErrExpectingPointer } if dstv.Elem().Kind() != reflect.Slice { - return util.ErrExpectingSlicePointer + return db.ErrExpectingSlicePointer } if dstv.Kind() != reflect.Ptr || dstv.Elem().Kind() != reflect.Slice || dstv.IsNil() { - return util.ErrExpectingSliceMapStruct + return db.ErrExpectingSliceMapStruct } columns, err := getRowColumns(rows) @@ -323,7 +317,7 @@ func (self *T) FieldValues(item interface{}, convertFn func(interface{}) string) } default: - return nil, nil, fmt.Errorf("Expecting Struct or Map, received %v.", itemt.Kind()) + return nil, nil, db.ErrExpectingMapOrStruct } return fields, values, nil