package f5 import ( "database/sql" "q5" ) type OldDataSet struct { rows *sql.Rows columns []string values []interface{} numOfReaded int64 closed bool } //已读取函数(调用Next成功的次数) func (this *OldDataSet) NumOfReaded() int64 { return this.numOfReaded } func (this *OldDataSet) close() { if this.rows != nil { this.rows.Close() } this.closed = true } func (this *OldDataSet) init(rows *sql.Rows) { this.rows = rows } func (this *OldDataSet) Next() bool { if this.closed { panic("OldDataSet is closed") } ret := this.rows.Next() if !ret { return ret } this.numOfReaded += 1 this.GetColumns() this.values = []interface{}{} for i := 0; i < len(this.columns); i++ { str := sql.NullString{} this.values = append(this.values, &str) } err := this.rows.Scan(this.values...) if err != nil { panic("OldDataSet Next error:" + err.Error()) } return ret } func (this *OldDataSet) GetColumns() []string { if len(this.columns) <= 0 { columns, err := this.rows.Columns() if err == nil { this.columns = columns } } return this.columns } /* 安全版:nil值视为"" */ func (this *OldDataSet) GetValues() *[]string { values := []string{} for _, val := range this.values { raw_val := val.(*sql.NullString) if raw_val.Valid { values = append(values, raw_val.String) } else { values = append(values, *q5.NewEmptyStrPtr()) } } return &values } /* 安全版:nil值视为"" */ func (this *OldDataSet) GetByName(name string) string { val := this.GetRawValueByName(name) if val == nil { return "" } else { return *val } } /* 安全版:nil值视为"" */ func (this *OldDataSet) GetByIndex(index int32) string { val := this.GetRawValueByIndex(index) if val == nil { return "" } else { return *val } } /* !!!原始版: 调用方应处理值为nil的情况 */ func (this *OldDataSet) GetRawValues() *[]string { values := []*string{} for _, val := range this.values { raw_val := val.(*sql.NullString) if raw_val.Valid { values = append(values, &raw_val.String) } else { values = append(values, nil) } } return nil } /* !!!原始版: 调用方应处理值为nil的情况 */ func (this *OldDataSet) GetRawValueByName(name string) *string { this.GetColumns() for i := 0; i < len(this.columns); i++ { if this.columns[i] == name { return this.GetRawValueByIndex(int32(i)) } } return nil } /* !!!原始版: 调用方应处理值为nil的情况 */ func (this *OldDataSet) GetRawValueByIndex(index int32) *string { this.GetColumns() sql_val := this.values[index].(*sql.NullString) if sql_val.Valid { return &sql_val.String } else { return nil } } func newOldDataSet(rows *sql.Rows) *OldDataSet { dataSet := new(OldDataSet) dataSet.init(rows) return dataSet }