Explorar el Código

修改TIME,DATA,INT,BEGIN等方法的bug

cyj hace 9 meses
padre
commit
9a896442ae
Se han modificado 5 ficheros con 111 adiciones y 89 borrados
  1. 3 0
      .vs/ProjectSettings.json
  2. BIN
      .vs/slnx.sqlite
  3. 6 4
      xugu/xugu_conn.go
  4. 98 76
      xugu/xugu_rows.go
  5. 4 9
      xugu/xugu_tranx.go

+ 3 - 0
.vs/ProjectSettings.json

@@ -0,0 +1,3 @@
+{
+  "CurrentProjectSetting": null
+}

BIN
.vs/slnx.sqlite


+ 6 - 4
xugu/xugu_conn.go

@@ -50,7 +50,11 @@ type dsnConfig struct {
 }
 
 func (xgConn *xuguConn) Begin() (driver.Tx, error) {
-	
+
+	_, err := xgConn.exec("Begin;", nil)
+	if err != nil {
+		return nil, err
+	}
 	return &xuguTx{tconn: xgConn}, nil
 
 }
@@ -71,7 +75,6 @@ func (xgConn *xuguConn) Close() error {
 func (xgConn *xuguConn) Query(sql string,
 	args []driver.Value) (driver.Rows, error) {
 
-
 	xgConn.mu.Lock()
 	defer xgConn.mu.Unlock()
 
@@ -159,7 +162,6 @@ func (xgConn *xuguConn) Ping(ctx context.Context) error {
 
 func (xgConn *xuguConn) Prepare(sql string) (driver.Stmt, error) {
 
-
 	xgConn.mu.Lock()
 	defer xgConn.mu.Unlock()
 
@@ -254,7 +256,7 @@ func xuguUnPrepare(pConn *xuguConn, prepareName string) error {
 
 func (xgConn *xuguConn) Exec(sql string,
 	args []driver.Value) (driver.Result, error) {
-	
+
 	xgConn.mu.Lock()
 	defer xgConn.mu.Unlock()
 

+ 98 - 76
xugu/xugu_rows.go

@@ -20,7 +20,6 @@ type xuguRows struct {
 
 func (row *xuguRows) Next(dest []driver.Value) error {
 
-
 	if row.results.rowIdx >= len(row.results.Values[0]) {
 		//return errors.New("The result set has been released")
 		return io.EOF
@@ -31,87 +30,111 @@ func (row *xuguRows) Next(dest []driver.Value) error {
 
 		coluType := row.results.Fields[j].FieldType
 		//fmt.Println("  --coluType: ", coluType, row.results.Fields[j].typeDatabaseName())
+		if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
+			dest[j] = nil
+		} else {
+			switch coluType {
+
+			case fieldType_BINARY,
+				fieldType_CLOB,
+				fieldType_BLOB:
+				fmt.Println(row.results.Values[j][row.results.rowIdx].Col_Data)
+				dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
+
+			case fieldType_INTERVAL_Y, fieldType_INTERVAL_M, fieldType_INTERVAL_D,
+				fieldType_INTERVAL_H, fieldType_INTERVAL_S,
+				fieldType_INTERVAL_MI:
+				dest[j] = binary.BigEndian.Uint32(row.results.Values[j][row.results.rowIdx].Col_Data)
 
-		switch coluType {
-
-		case fieldType_BINARY,
-			fieldType_CLOB,
-			fieldType_BLOB:
-			dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
-
-		case fieldType_INTERVAL_Y, fieldType_INTERVAL_M, fieldType_INTERVAL_D,
-			fieldType_INTERVAL_H, fieldType_INTERVAL_S,
-			fieldType_INTERVAL_MI:
-			dest[j] = binary.BigEndian.Uint32(row.results.Values[j][row.results.rowIdx].Col_Data)
-
-		case fieldType_TIME,
-			fieldType_TIME_TZ, fieldType_DATE:
-			tv, _ := time.Parse("15:04:05", string(row.results.Values[j][row.results.rowIdx].Col_Data))
-			dest[j] = tv
-
-		case fieldType_DATETIME,
-			fieldType_DATETIME_TZ:
-
-			if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
-				dest[j] = nil
-			} else {
-				//timeTmp := binary.LittleEndian.Uint64(reverseBytes(row.results.Values[j][row.results.rowIdx].Col_Data)
-				timeTmp := binary.BigEndian.Uint64(row.results.Values[j][row.results.rowIdx].Col_Data)
+			case fieldType_TIME,
+				fieldType_TIME_TZ:
+				timeTmp := int32(binary.BigEndian.Uint32(row.results.Values[j][row.results.rowIdx].Col_Data))
+				//tv, _ := time.Parse("2006-01-02 15:04:05", string(reverseBytes(row.results.Values[j][row.results.rowIdx].Col_Data)))
+				tv := time.Date(0, 1, 1, 0, 0, 0, 0, time.UTC).Add((time.Millisecond * time.Duration(timeTmp)))
+				utcTime := tv.UTC()
+				dest[j] = utcTime
+			case fieldType_DATE:
 
+				timeTmp := int32(binary.BigEndian.Uint32(row.results.Values[j][row.results.rowIdx].Col_Data))
 				//tv, _ := time.Parse("2006-01-02 15:04:05", string(reverseBytes(row.results.Values[j][row.results.rowIdx].Col_Data)))
-				tv := time.Unix(0, int64(timeTmp)*1000000)
+				tv := time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC).Add((time.Hour * 24 * time.Duration(timeTmp)))
 				utcTime := tv.UTC()
 				dest[j] = utcTime
-			}
+				// fmt.Println(string(row.results.Values[j][row.results.rowIdx].Col_Data))
+				// tv, _ := time.Parse("15:04:05", string(row.results.Values[j][row.results.rowIdx].Col_Data))
+				// dest[j] = tv
+
+			case fieldType_DATETIME,
+				fieldType_DATETIME_TZ:
+
+				if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
+					dest[j] = nil
+				} else {
+					//timeTmp := binary.LittleEndian.Uint64(reverseBytes(row.results.Values[j][row.results.rowIdx].Col_Data)
+					timeTmp := binary.BigEndian.Uint64(row.results.Values[j][row.results.rowIdx].Col_Data)
+					//tv, _ := time.Parse("2006-01-02 15:04:05", string(reverseBytes(row.results.Values[j][row.results.rowIdx].Col_Data)))
+					tv := time.Unix(0, int64(timeTmp)*1000000)
+					utcTime := tv.UTC()
+					dest[j] = utcTime
+				}
+
+			case fieldType_R4:
+				if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
+					dest[j] = nil
+				} else {
+					dest[j] = math.Float32frombits(binary.BigEndian.Uint32(row.results.Values[j][row.results.rowIdx].Col_Data))
+				}
+
+			case fieldType_R8:
+				if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
+					dest[j] = nil
+				} else {
+					dest[j] = math.Float64frombits(binary.BigEndian.Uint64(row.results.Values[j][row.results.rowIdx].Col_Data))
+				}
+			case fieldType_NUM:
+				dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
+			case fieldType_I1:
+				if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
+					dest[j] = nil
+				} else {
+					dest[j] = int8(row.results.Values[j][row.results.rowIdx].Col_Data[0])
+				}
+			case fieldType_I2:
+				if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
+					dest[j] = nil
+				} else {
+					dest[j] = int16(binary.BigEndian.Uint16(row.results.Values[j][row.results.rowIdx].Col_Data))
+				}
+			case fieldType_I4:
+				if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
+					dest[j] = nil
+				} else {
+					dest[j] = int32(binary.BigEndian.Uint32(row.results.Values[j][row.results.rowIdx].Col_Data))
+				}
+			case fieldType_I8:
+				if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
+					dest[j] = nil
+				} else {
+					dest[j] = int64(binary.BigEndian.Uint64(row.results.Values[j][row.results.rowIdx].Col_Data))
+					//dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
+				}
+			case fieldType_CHAR, fieldType_NCHAR:
+				if row.results.Values[j][row.results.rowIdx].Col_Data == nil {
+					dest[j] = string("")
+				} else if row.results.Values[j][row.results.rowIdx].Col_Data[0] == 0x00 {
+					dest[j] = string("")
+				} else {
+					dest[j] = string(row.results.Values[j][row.results.rowIdx].Col_Data)
+				}
+			default:
+
+				//填入一行的数据
+				//TODO这里长度改为一行长度
+				dest[j] = make([]byte, len(row.results.Values))
+				// Values[字段][0]
+				dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
 
-		case fieldType_R4:
-			dest[j] = math.Float32frombits(binary.BigEndian.Uint32(row.results.Values[j][row.results.rowIdx].Col_Data))
-		case fieldType_R8:
-
-			dest[j] = math.Float64frombits(binary.BigEndian.Uint64(row.results.Values[j][row.results.rowIdx].Col_Data))
-		case fieldType_NUM:
-			dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
-		case fieldType_I1:
-			if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
-				dest[j] = nil
-			} else {
-				dest[j] = int8(row.results.Values[j][row.results.rowIdx].Col_Data[0])
-			}
-		case fieldType_I2:
-			if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
-				dest[j] = nil
-			} else {
-				dest[j] = int16(binary.BigEndian.Uint16(row.results.Values[j][row.results.rowIdx].Col_Data))
-			}
-		case fieldType_I4:
-			if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
-				dest[j] = nil
-			} else {
-				dest[j] = binary.BigEndian.Uint32(row.results.Values[j][row.results.rowIdx].Col_Data)
 			}
-		case fieldType_I8:
-			if len(row.results.Values[j][row.results.rowIdx].Col_Data) == 0 {
-				dest[j] = nil
-			} else {
-				dest[j] = int64(binary.BigEndian.Uint64(row.results.Values[j][row.results.rowIdx].Col_Data))
-				//dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
-			}
-		case fieldType_CHAR, fieldType_NCHAR:
-			if row.results.Values[j][row.results.rowIdx].Col_Data == nil {
-				dest[j] = string("")
-			} else if row.results.Values[j][row.results.rowIdx].Col_Data[0] == 0x00 {
-				dest[j] = string("")
-			} else {
-				dest[j] = string(row.results.Values[j][row.results.rowIdx].Col_Data)
-			}
-		default:
-
-			//填入一行的数据
-			//TODO这里长度改为一行长度
-			dest[j] = make([]byte, len(row.results.Values))
-			// Values[字段][0]
-			dest[j] = row.results.Values[j][row.results.rowIdx].Col_Data
-
 		}
 	}
 	row.results.rowIdx++
@@ -122,7 +145,6 @@ func (row *xuguRows) Next(dest []driver.Value) error {
 // Columns返回列的名字集,它的个数是从slice的长度中推断出来的。
 // 如果不知道特定的列名,应该为该条目返回一个空的字符串
 func (row *xuguRows) Columns() []string {
-	
 
 	var columns []string
 

+ 4 - 9
xugu/xugu_tranx.go

@@ -11,11 +11,9 @@ func (tx *xuguTx) Commit() error {
 	defer tx.tconn.mu.Unlock()
 
 	if tx.tconn == nil {
-		return errors.New("Invalid connection")
+		return errors.New("invalid connection")
 	}
 	_, err := tx.tconn.exec("commit;", nil)
-
-	_, err = tx.tconn.exec("set auto_commit on;", nil)
 	if err != nil {
 		return err
 	}
@@ -25,17 +23,14 @@ func (tx *xuguTx) Commit() error {
 func (tx *xuguTx) Rollback() error {
 	tx.tconn.mu.Lock()
 	defer tx.tconn.mu.Unlock()
-	
+
 	if tx.tconn == nil {
-		return errors.New("Invalid connection")
+		return errors.New("invalid connection")
 	}
 	_, err := tx.tconn.exec("rollback;", nil)
 	if err != nil {
 		return err
 	}
-	_, err = tx.tconn.exec("set auto_commit on;", nil)
-	if err != nil {
-		return err
-	}
+
 	return err
 }