From 24f47dd41d7cf4a66bacb72ca938aef677df30b4 Mon Sep 17 00:00:00 2001 From: hzmnet Date: Mon, 2 Nov 2015 18:30:05 +0800 Subject: [PATCH] Add FindMap --- session.go | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/session.go b/session.go index a1984805..b798a354 100644 --- a/session.go +++ b/session.go @@ -1368,6 +1368,117 @@ func (session *Session) Find(rowsSlicePtr interface{}, condiBean ...interface{}) return nil } + +func (session *Session) FindMap(rowsSlicePtr interface{}, condiBean ...interface{}) error { + defer session.resetStatement() + if session.IsAutoClose { + defer session.Close() + } + + sliceValue := reflect.Indirect(reflect.ValueOf(rowsSlicePtr)) + if sliceValue.Kind() != reflect.Slice && sliceValue.Kind() != reflect.Map { + return errors.New("needs a pointer to a slice or a map") + } + + sliceElementType := sliceValue.Type().Elem() + fmt.Println("sliceValue.Kind()", sliceValue.Kind(), sliceElementType) + + fmt.Println("sliceValue.Kind()") + /* + if len(condiBean) > 0 { + colNames, args := buildConditions(session.Engine, table, condiBean[0], true, true, + false, true, session.Statement.allUseBool, session.Statement.useAllCols, + session.Statement.unscoped, session.Statement.mustColumnMap) + session.Statement.ConditionStr = strings.Join(colNames, " AND ") + session.Statement.BeanArgs = args + } else { + // !oinume! Add " IS NULL" to WHERE whatever condiBean is given. + // See https://github.com/go-xorm/xorm/issues/179 + if col := table.DeletedColumn(); col != nil && !session.Statement.unscoped { // tag "deleted" is enabled + session.Statement.ConditionStr = fmt.Sprintf("(%v IS NULL or %v = '0001-01-01 00:00:00') ", + session.Engine.Quote(col.Name), session.Engine.Quote(col.Name)) + } + }*/ + fmt.Println("sliceValue.Kind()") + var sqlStr string + var args []interface{} + if session.Statement.RawSQL == "" { + var columnStr string = session.Statement.ColumnStr + if session.Statement.JoinStr == "" { + if columnStr == "" { + if session.Statement.GroupByStr != "" { + columnStr = session.Statement.Engine.Quote(strings.Replace(session.Statement.GroupByStr, ",", session.Engine.Quote(","), -1)) + } else { + columnStr = session.Statement.genColumnStr() + } + } + } else { + if columnStr == "" { + if session.Statement.GroupByStr != "" { + columnStr = session.Statement.Engine.Quote(strings.Replace(session.Statement.GroupByStr, ",", session.Engine.Quote(","), -1)) + } else { + columnStr = "*" + } + } + } + + session.Statement.attachInSql() + + sqlStr = session.Statement.genSelectSql(columnStr) + args = append(session.Statement.Params, session.Statement.BeanArgs...) + // for mssql and use limit + qs := strings.Count(sqlStr, "?") + if len(args)*2 == qs { + args = append(args, args...) + } + } else { + sqlStr = session.Statement.RawSQL + args = session.Statement.RawParams + } + fmt.Println("sliceValue.Kind()") + // var err error + /* + if session.Statement.JoinStr == "" { + if cacher := session.Engine.getCacher2(table); cacher != nil && + session.Statement.UseCache && + !session.Statement.IsDistinct && + !session.Statement.unscoped { + err = session.cacheFind(sliceElementType, sqlStr, rowsSlicePtr, args...) + if err != ErrCacheFailed { + return err + } + err = nil // !nashtsai! reset err to nil for ErrCacheFailed + session.Engine.LogWarn("Cache Find Failed") + } + } + */ + + fmt.Println("sliceValue.Kind()", sliceValue.Kind()) + if sliceValue.Kind() != reflect.Map { + fmt.Println("sliceValue.Type()", sliceValue.Index(0).Type(), reflect.TypeOf(make(map[string]interface{})).Name()) + + if sliceValue.Index(0).Type() == reflect.TypeOf(make(map[string][]byte)) { + fmt.Println("sliceValue.Type()OK") + resultsSlice, err := session.query(sqlStr, args...) + if err != nil { + fmt.Println("sliceValue.Type()err", err.Error()) + return err + } + + for _, results := range resultsSlice { + fmt.Println("sliceValue.Type()OK", results) + sliceValue.Set(reflect.Append(sliceValue, reflect.Indirect(reflect.ValueOf(results)))) + } + + } else { + fmt.Println("sliceValue.Index(0).Type() == reflect.TypeOf(make(map[string]interface{}))") + } + } else { + fmt.Println("sliceValue.Kind() != reflect.Map") + } + return nil +} + // func (session *Session) queryRows(rawStmt **sql.Stmt, rawRows **sql.Rows, sqlStr string, args ...interface{}) error { // var err error // if session.IsAutoCommit {