diff --git a/VERSION b/VERSION index a5c4c108..4e64e0e9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -xorm v0.4.2 +xorm v0.4.2.0225 diff --git a/engine.go b/engine.go index 703c612c..447853b9 100644 --- a/engine.go +++ b/engine.go @@ -1367,18 +1367,11 @@ func (engine *Engine) Import(r io.Reader) ([]sql.Result, error) { scanner.Split(semiColSpliter) - session := engine.NewSession() - defer session.Close() - err := session.newDb() - if err != nil { - return results, err - } - for scanner.Scan() { query := scanner.Text() query = strings.Trim(query, " \t") if len(query) > 0 { - result, err := session.Db.Exec(query) + result, err := engine.DB().Exec(query) results = append(results, result) if err != nil { lastError = err diff --git a/rows.go b/rows.go index c566b125..0def5575 100644 --- a/rows.go +++ b/rows.go @@ -25,11 +25,6 @@ func newRows(session *Session, bean interface{}) (*Rows, error) { rows.session = session rows.beanType = reflect.Indirect(reflect.ValueOf(bean)).Type() - err := rows.session.newDb() - if err != nil { - return nil, err - } - defer rows.session.Statement.Init() var sqlStr string @@ -47,8 +42,8 @@ func newRows(session *Session, bean interface{}) (*Rows, error) { } rows.session.Engine.logSQL(sqlStr, args) - - rows.stmt, err = rows.session.Db.Prepare(sqlStr) + var err error + rows.stmt, err = rows.session.DB().Prepare(sqlStr) if err != nil { rows.lastError = err defer rows.Close() diff --git a/session.go b/session.go index 6fa6d219..4dde9bb3 100644 --- a/session.go +++ b/session.go @@ -17,7 +17,7 @@ import ( // Struct Session keep a pointer to sql.DB and provides all execution of all // kind of database operations. type Session struct { - Db *core.DB + db *core.DB Engine *Engine Tx *core.Tx Statement Statement @@ -66,9 +66,9 @@ func (session *Session) Close() { v.Close() } - if session.Db != nil { + if session.db != nil { //session.Engine.Pool.ReleaseDB(session.Engine, session.Db) - session.Db = nil + session.db = nil session.Tx = nil session.stmtCache = nil session.Init() @@ -286,26 +286,18 @@ func (session *Session) Having(conditions string) *Session { return session } -func (session *Session) newDb() error { - if session.Db == nil { - /*db, err := session.Engine.Pool.RetrieveDB(session.Engine) - if err != nil { - return err - }*/ - session.Db = session.Engine.db +func (session *Session) DB() *core.DB { + if session.db == nil { + session.db = session.Engine.db session.stmtCache = make(map[uint32]*core.Stmt, 0) } - return nil + return session.db } // Begin a transaction func (session *Session) Begin() error { - err := session.newDb() - if err != nil { - return err - } if session.IsAutoCommit { - tx, err := session.Db.Begin() + tx, err := session.DB().Begin() if err != nil { return err } @@ -464,10 +456,6 @@ func (session *Session) exec(sqlStr string, args ...interface{}) (sql.Result, er // Exec raw sql func (session *Session) Exec(sqlStr string, args ...interface{}) (sql.Result, error) { - err := session.newDb() - if err != nil { - return nil, err - } defer session.resetStatement() if session.IsAutoClose { defer session.Close() @@ -480,10 +468,6 @@ func (session *Session) Exec(sqlStr string, args ...interface{}) (sql.Result, er func (session *Session) CreateTable(bean interface{}) error { session.Statement.RefTable = session.Engine.TableInfo(bean) - err := session.newDb() - if err != nil { - return err - } defer session.resetStatement() if session.IsAutoClose { defer session.Close() @@ -496,10 +480,6 @@ func (session *Session) CreateTable(bean interface{}) error { func (session *Session) CreateIndexes(bean interface{}) error { session.Statement.RefTable = session.Engine.TableInfo(bean) - err := session.newDb() - if err != nil { - return err - } defer session.resetStatement() if session.IsAutoClose { defer session.Close() @@ -507,7 +487,7 @@ func (session *Session) CreateIndexes(bean interface{}) error { sqls := session.Statement.genIndexSQL() for _, sqlStr := range sqls { - _, err = session.exec(sqlStr) + _, err := session.exec(sqlStr) if err != nil { return err } @@ -519,10 +499,6 @@ func (session *Session) CreateIndexes(bean interface{}) error { func (session *Session) CreateUniques(bean interface{}) error { session.Statement.RefTable = session.Engine.TableInfo(bean) - err := session.newDb() - if err != nil { - return err - } defer session.resetStatement() if session.IsAutoClose { defer session.Close() @@ -530,7 +506,7 @@ func (session *Session) CreateUniques(bean interface{}) error { sqls := session.Statement.genUniqueSQL() for _, sqlStr := range sqls { - _, err = session.exec(sqlStr) + _, err := session.exec(sqlStr) if err != nil { return err } @@ -547,10 +523,6 @@ func (session *Session) createOneTable() error { // to be deleted func (session *Session) createAll() error { - err := session.newDb() - if err != nil { - return err - } defer session.resetStatement() if session.IsAutoClose { defer session.Close() @@ -568,10 +540,6 @@ func (session *Session) createAll() error { // drop indexes func (session *Session) DropIndexes(bean interface{}) error { - err := session.newDb() - if err != nil { - return err - } defer session.resetStatement() if session.IsAutoClose { defer session.Close() @@ -579,7 +547,7 @@ func (session *Session) DropIndexes(bean interface{}) error { sqls := session.Statement.genDelIndexSQL() for _, sqlStr := range sqls { - _, err = session.exec(sqlStr) + _, err := session.exec(sqlStr) if err != nil { return err } @@ -589,11 +557,6 @@ func (session *Session) DropIndexes(bean interface{}) error { // DropTable drop a table and all indexes of the table func (session *Session) DropTable(bean interface{}) error { - err := session.newDb() - if err != nil { - return err - } - defer session.resetStatement() if session.IsAutoClose { defer session.Close() @@ -610,7 +573,7 @@ func (session *Session) DropTable(bean interface{}) error { } sqlStr := session.Statement.genDropSQL() - _, err = session.exec(sqlStr) + _, err := session.exec(sqlStr) return err } @@ -663,7 +626,7 @@ func (session *Session) cacheGet(bean interface{}, sqlStr string, args ...interf table := session.Statement.RefTable if err != nil { var res = make([]string, len(table.PrimaryKeys)) - rows, err := session.Db.Query(newsql, args...) + rows, err := session.DB().Query(newsql, args...) if err != nil { return false, err } @@ -761,7 +724,7 @@ func (session *Session) cacheFind(t reflect.Type, sqlStr string, rowsSlicePtr in cacher := session.Engine.getCacher2(table) ids, err := core.GetCacheSql(cacher, session.Statement.TableName(), newsql, args) if err != nil { - rows, err := session.Db.Query(newsql, args...) + rows, err := session.DB().Query(newsql, args...) if err != nil { return err } @@ -972,7 +935,7 @@ func (session *Session) doPrepare(sqlStr string) (stmt *core.Stmt, err error) { var has bool stmt, has = session.stmtCache[crc] if !has { - stmt, err = session.Db.Prepare(sqlStr) + stmt, err = session.DB().Prepare(sqlStr) if err != nil { return nil, err } @@ -984,11 +947,6 @@ func (session *Session) doPrepare(sqlStr string) (stmt *core.Stmt, err error) { // get retrieve one record from database, bean's non-empty fields // will be as conditions func (session *Session) Get(bean interface{}) (bool, error) { - err := session.newDb() - if err != nil { - return false, err - } - defer session.resetStatement() if session.IsAutoClose { defer session.Close() @@ -1021,6 +979,7 @@ func (session *Session) Get(bean interface{}) (bool, error) { } var rawRows *core.Rows + var err error session.queryPreprocess(&sqlStr, args...) if session.IsAutoCommit { stmt, err := session.doPrepare(sqlStr) @@ -1050,11 +1009,6 @@ func (session *Session) Get(bean interface{}) (bool, error) { // Count counts the records. bean's non-empty fields // are conditions. func (session *Session) Count(bean interface{}) (int64, error) { - err := session.newDb() - if err != nil { - return 0, err - } - defer session.resetStatement() if session.IsAutoClose { defer session.Close() @@ -1159,10 +1113,6 @@ func Atot(s string, tp reflect.Type) (interface{}, error) { // are conditions. beans could be []Struct, []*Struct, map[int64]Struct // map[int64]*Struct func (session *Session) Find(rowsSlicePtr interface{}, condiBean ...interface{}) error { - err := session.newDb() - if err != nil { - return err - } defer session.resetStatement() if session.IsAutoClose { defer session.Close() @@ -1237,6 +1187,7 @@ func (session *Session) Find(rowsSlicePtr interface{}, condiBean ...interface{}) args = session.Statement.RawParams } + var err error if session.Statement.JoinStr == "" { if cacher := session.Engine.getCacher2(table); cacher != nil && session.Statement.UseCache && @@ -1380,24 +1331,16 @@ func (session *Session) Find(rowsSlicePtr interface{}, condiBean ...interface{}) // Test if database is ok func (session *Session) Ping() error { - err := session.newDb() - if err != nil { - return err - } defer session.resetStatement() if session.IsAutoClose { defer session.Close() } - return session.Db.Ping() + return session.DB().Ping() } /* func (session *Session) isColumnExist(tableName string, col *core.Column) (bool, error) { - err := session.newDb() - if err != nil { - return false, err - } defer session.resetStatement() if session.IsAutoClose { defer session.Close() @@ -1424,10 +1367,6 @@ func (session *Session) IsTableExist(beanOrTableName interface{}) (bool, error) } func (session *Session) isTableExist(tableName string) (bool, error) { - err := session.newDb() - if err != nil { - return false, err - } defer session.resetStatement() if session.IsAutoClose { defer session.Close() @@ -1452,12 +1391,14 @@ func (session *Session) IsTableEmpty(bean interface{}) (bool, error) { } func (session *Session) isTableEmpty(tableName string) (bool, error) { - session.newDb() - - row := session.Db.QueryRow(fmt.Sprintf("select count(*) from %s", tableName)) + defer session.resetStatement() + if session.IsAutoClose { + defer session.Close() + } var total int64 - err := row.Scan(&total) + err := session.DB().QueryRow(fmt.Sprintf("select count(*) from %s", tableName)). + Scan(&total) if err != nil { return true, err } @@ -1466,10 +1407,6 @@ func (session *Session) isTableEmpty(tableName string) (bool, error) { } func (session *Session) isIndexExist(tableName, idxName string, unique bool) (bool, error) { - err := session.newDb() - if err != nil { - return false, err - } defer session.resetStatement() if session.IsAutoClose { defer session.Close() @@ -1487,6 +1424,11 @@ func (session *Session) isIndexExist(tableName, idxName string, unique bool) (bo // find if index is exist according cols func (session *Session) isIndexExist2(tableName string, cols []string, unique bool) (bool, error) { + defer session.resetStatement() + if session.IsAutoClose { + defer session.Close() + } + indexes, err := session.Engine.dialect.GetIndexes(tableName) if err != nil { return false, err @@ -1505,10 +1447,6 @@ func (session *Session) isIndexExist2(tableName string, cols []string, unique bo } func (session *Session) addColumn(colName string) error { - err := session.newDb() - if err != nil { - return err - } defer session.resetStatement() if session.IsAutoClose { defer session.Close() @@ -1516,47 +1454,35 @@ func (session *Session) addColumn(colName string) error { col := session.Statement.RefTable.GetColumn(colName) sql, args := session.Statement.genAddColumnStr(col) - _, err = session.exec(sql, args...) + _, err := session.exec(sql, args...) return err } func (session *Session) addIndex(tableName, idxName string) error { - err := session.newDb() - if err != nil { - return err - } defer session.resetStatement() if session.IsAutoClose { defer session.Close() } index := session.Statement.RefTable.Indexes[idxName] sqlStr := session.Engine.dialect.CreateIndexSql(tableName, index) - //genAddIndexStr(indexName(tableName, idxName), cols) - _, err = session.exec(sqlStr) + + _, err := session.exec(sqlStr) return err } func (session *Session) addUnique(tableName, uqeName string) error { - err := session.newDb() - if err != nil { - return err - } defer session.resetStatement() if session.IsAutoClose { defer session.Close() } index := session.Statement.RefTable.Indexes[uqeName] sqlStr := session.Engine.dialect.CreateIndexSql(tableName, index) - _, err = session.exec(sqlStr) + _, err := session.exec(sqlStr) return err } // To be deleted func (session *Session) dropAll() error { - err := session.newDb() - if err != nil { - return err - } defer session.resetStatement() if session.IsAutoClose { defer session.Close() @@ -1974,7 +1900,7 @@ func (session *Session) query(sqlStr string, paramStr ...interface{}) (resultsSl session.queryPreprocess(&sqlStr, paramStr...) if session.IsAutoCommit { - return session.innerQuery(session.Db, sqlStr, paramStr...) + return session.innerQuery(session.DB(), sqlStr, paramStr...) } return session.txQuery(session.Tx, sqlStr, paramStr...) } @@ -2013,10 +1939,6 @@ func (session *Session) innerQuery(db *core.DB, sqlStr string, params ...interfa // Exec a raw sql and return records as []map[string][]byte func (session *Session) Query(sqlStr string, paramStr ...interface{}) (resultsSlice []map[string][]byte, err error) { - err = session.newDb() - if err != nil { - return nil, err - } defer session.resetStatement() if session.IsAutoClose { defer session.Close() @@ -2032,7 +1954,7 @@ func (session *Session) query2(sqlStr string, paramStr ...interface{}) (resultsS session.queryPreprocess(&sqlStr, paramStr...) if session.IsAutoCommit { - return query2(session.Db, sqlStr, paramStr...) + return query2(session.DB(), sqlStr, paramStr...) } return txQuery2(session.Tx, sqlStr, paramStr...) } @@ -2040,11 +1962,7 @@ func (session *Session) query2(sqlStr string, paramStr ...interface{}) (resultsS // insert one or more beans func (session *Session) Insert(beans ...interface{}) (int64, error) { var affected int64 = 0 - var err error = nil - err = session.newDb() - if err != nil { - return 0, err - } + var err error defer session.resetStatement() if session.IsAutoClose { defer session.Close() @@ -2248,10 +2166,6 @@ func (session *Session) InsertMulti(rowsSlicePtr interface{}) (int64, error) { sliceValue := reflect.Indirect(reflect.ValueOf(rowsSlicePtr)) if sliceValue.Kind() == reflect.Slice { if sliceValue.Len() > 0 { - err := session.newDb() - if err != nil { - return 0, err - } defer session.resetStatement() if session.IsAutoClose { defer session.Close() @@ -3217,10 +3131,6 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { // The in parameter bean must a struct or a point to struct. The return // parameter is inserted and error func (session *Session) InsertOne(bean interface{}) (int64, error) { - err := session.newDb() - if err != nil { - return 0, err - } defer session.resetStatement() if session.IsAutoClose { defer session.Close() @@ -3315,7 +3225,7 @@ func (session *Session) cacheUpdate(sqlStr string, args ...interface{}) error { session.Engine.LogDebug("[cacheUpdate] get cache sql", newsql, args[nStart:]) ids, err := core.GetCacheSql(cacher, tableName, newsql, args[nStart:]) if err != nil { - rows, err := session.Db.Query(newsql, args[nStart:]...) + rows, err := session.DB().Query(newsql, args[nStart:]...) if err != nil { return err } @@ -3414,10 +3324,6 @@ func (session *Session) cacheUpdate(sqlStr string, args ...interface{}) error { // You should call UseBool if you have bool to use. // 2.float32 & float64 may be not inexact as conditions func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int64, error) { - err := session.newDb() - if err != nil { - return 0, err - } defer session.resetStatement() if session.IsAutoClose { defer session.Close() @@ -3439,6 +3345,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 } // -- + var err error if t.Kind() == reflect.Struct { table = session.Engine.TableInfo(bean) session.Statement.RefTable = table @@ -3680,10 +3587,6 @@ func (session *Session) cacheDelete(sqlStr string, args ...interface{}) error { // Delete records, bean's non-empty fields are conditions func (session *Session) Delete(bean interface{}) (int64, error) { - err := session.newDb() - if err != nil { - return 0, err - } defer session.resetStatement() if session.IsAutoClose { defer session.Close() diff --git a/xorm.go b/xorm.go index b5121d52..71644e6c 100644 --- a/xorm.go +++ b/xorm.go @@ -13,7 +13,7 @@ import ( ) const ( - Version string = "0.4.2" + Version string = "0.4.2.0225" ) func regDrvsNDialects() bool {