[Groonga-commit] groonga/grngo at d2fc42d [master] Separate the implementation of GetValue().

Zurück zum Archiv-Index

susumu.yata null+****@clear*****
Tue Jul 28 12:27:16 JST 2015


susumu.yata	2015-07-28 12:27:16 +0900 (Tue, 28 Jul 2015)

  New Revision: d2fc42dc9e093748da00c2d422e0ab76f8036d5a
  https://github.com/groonga/grngo/commit/d2fc42dc9e093748da00c2d422e0ab76f8036d5a

  Message:
    Separate the implementation of GetValue().

  Modified files:
    grngo.go

  Modified: grngo.go (+145 -136)
===================================================================
--- grngo.go    2015-07-27 16:57:51 +0900 (50d2a1b)
+++ grngo.go    2015-07-28 12:27:16 +0900 (0a31962)
@@ -1040,6 +1040,149 @@ func (column *Column) SetValue(id uint32, value interface{}) error {
 	return nil
 }
 
+// parseScalar parses a scalar value.
+func (column *Column) parseScalar(ptr unsafe.Pointer) (interface{}, error) {
+	switch column.c.value_type {
+	case C.GRN_DB_BOOL:
+		cValue := *(*C.grn_bool)(ptr)
+		return cValue == C.GRN_TRUE, nil
+	case C.GRN_DB_INT8:
+		return int64(*(*C.int8_t)(ptr)), nil
+	case C.GRN_DB_INT16:
+		return int64(*(*C.int16_t)(ptr)), nil
+	case C.GRN_DB_INT32:
+		return int64(*(*C.int32_t)(ptr)), nil
+	case C.GRN_DB_INT64:
+		return int64(*(*C.int64_t)(ptr)), nil
+	case C.GRN_DB_UINT8:
+		return int64(*(*C.uint8_t)(ptr)), nil
+	case C.GRN_DB_UINT16:
+		return int64(*(*C.uint16_t)(ptr)), nil
+	case C.GRN_DB_UINT32:
+		return int64(*(*C.uint32_t)(ptr)), nil
+	case C.GRN_DB_UINT64:
+		return int64(*(*C.uint64_t)(ptr)), nil
+	case C.GRN_DB_FLOAT:
+		return float64(*(*C.double)(ptr)), nil
+	case C.GRN_DB_TIME:
+		return int64(*(*C.int64_t)(ptr)), nil
+	case C.GRN_DB_SHORT_TEXT, C.GRN_DB_TEXT, C.GRN_DB_LONG_TEXT:
+		cValue := *(*C.grngo_text)(ptr)
+		return C.GoBytes(unsafe.Pointer(cValue.ptr), C.int(cValue.size)), nil
+	case C.GRN_DB_TOKYO_GEO_POINT, C.GRN_DB_WGS84_GEO_POINT:
+		cValue := *(*C.grn_geo_point)(ptr)
+		return GeoPoint{int32(cValue.latitude), int32(cValue.longitude)}, nil
+	default:
+		return nil, fmt.Errorf("unsupported value type")
+	}
+}
+
+// parseVector parses a vector value.
+func (column *Column) parseVector(ptr unsafe.Pointer) (interface{}, error) {
+	cVector := *(*C.grngo_vector)(ptr)
+	header := reflect.SliceHeader{
+		Data: uintptr(unsafe.Pointer(cVector.ptr)),
+		Len:  int(cVector.size),
+		Cap:  int(cVector.size),
+	}
+	switch column.c.value_type {
+	case C.GRN_DB_BOOL:
+		cValue := *(*[]C.grn_bool)(unsafe.Pointer(&header))
+		value := make([]bool, len(cValue))
+		for i := 0; i < len(value); i++ {
+			value[i] = cValue[i] == C.GRN_TRUE
+		}
+		return value, nil
+	case C.GRN_DB_INT8:
+		cValue := *(*[]C.int8_t)(unsafe.Pointer(&header))
+		value := make([]int64, len(cValue))
+		for i := 0; i < len(value); i++ {
+			value[i] = int64(cValue[i])
+		}
+		return value, nil
+	case C.GRN_DB_INT16:
+		cValue := *(*[]C.int16_t)(unsafe.Pointer(&header))
+		value := make([]int64, len(cValue))
+		for i := 0; i < len(value); i++ {
+			value[i] = int64(cValue[i])
+		}
+		return value, nil
+	case C.GRN_DB_INT32:
+		cValue := *(*[]C.int32_t)(unsafe.Pointer(&header))
+		value := make([]int64, len(cValue))
+		for i := 0; i < len(value); i++ {
+			value[i] = int64(cValue[i])
+		}
+		return value, nil
+	case C.GRN_DB_INT64:
+		cValue := *(*[]C.int64_t)(unsafe.Pointer(&header))
+		value := make([]int64, len(cValue))
+		for i := 0; i < len(value); i++ {
+			value[i] = int64(cValue[i])
+		}
+		return value, nil
+	case C.GRN_DB_UINT8:
+		cValue := *(*[]C.uint8_t)(unsafe.Pointer(&header))
+		value := make([]int64, len(cValue))
+		for i := 0; i < len(value); i++ {
+			value[i] = int64(cValue[i])
+		}
+		return value, nil
+	case C.GRN_DB_UINT16:
+		cValue := *(*[]C.uint16_t)(unsafe.Pointer(&header))
+		value := make([]int64, len(cValue))
+		for i := 0; i < len(value); i++ {
+			value[i] = int64(cValue[i])
+		}
+		return value, nil
+	case C.GRN_DB_UINT32:
+		cValue := *(*[]C.uint32_t)(unsafe.Pointer(&header))
+		value := make([]int64, len(cValue))
+		for i := 0; i < len(value); i++ {
+			value[i] = int64(cValue[i])
+		}
+		return value, nil
+	case C.GRN_DB_UINT64:
+		cValue := *(*[]C.uint64_t)(unsafe.Pointer(&header))
+		value := make([]int64, len(cValue))
+		for i := 0; i < len(value); i++ {
+			value[i] = int64(cValue[i])
+		}
+		return value, nil
+	case C.GRN_DB_FLOAT:
+		cValue := *(*[]C.double)(unsafe.Pointer(&header))
+		value := make([]float64, len(cValue))
+		for i := 0; i < len(value); i++ {
+			value[i] = float64(cValue[i])
+		}
+		return value, nil
+	case C.GRN_DB_TIME:
+		cValue := *(*[]C.int64_t)(unsafe.Pointer(&header))
+		value := make([]int64, len(cValue))
+		for i := 0; i < len(value); i++ {
+			value[i] = int64(cValue[i])
+		}
+		return value, nil
+	case C.GRN_DB_SHORT_TEXT, C.GRN_DB_TEXT, C.GRN_DB_LONG_TEXT:
+		cValue := *(*[]C.grngo_text)(unsafe.Pointer(&header))
+		value := make([][]byte, len(cValue))
+		for i := 0; i < len(value); i++ {
+			value[i] = C.GoBytes(unsafe.Pointer(cValue[i].ptr), C.int(cValue[i].size))
+		}
+		return value, nil
+	case C.GRN_DB_TOKYO_GEO_POINT, C.GRN_DB_WGS84_GEO_POINT:
+		cValue := *(*[]C.grn_geo_point)(unsafe.Pointer(&header))
+		value := make([]GeoPoint, len(cValue))
+		for i := 0; i < len(value); i++ {
+			value[i].Latitude = int32(cValue[i].latitude)
+			value[i].Longitude = int32(cValue[i].longitude)
+		}
+		return value, nil
+	default:
+		return nil, fmt.Errorf("unsupported value type")
+	}
+}
+
 // GetValue gets a value.
 func (column *Column) GetValue(id uint32) (interface{}, error) {
 	if column.c.dimension > 1 {
@@ -1051,142 +1194,8 @@ func (column *Column) GetValue(id uint32) (interface{}, error) {
 		return nil, newGrnError("grngo_get()", rc, column.table.db)
 	}
 	if column.c.dimension == 0 {
-		switch column.c.value_type {
-		case C.GRN_DB_BOOL:
-			cValue := *(*C.grn_bool)(ptr)
-			return cValue == C.GRN_TRUE, nil
-		case C.GRN_DB_INT8:
-			return int64(*(*C.int8_t)(ptr)), nil
-		case C.GRN_DB_INT16:
-			return int64(*(*C.int16_t)(ptr)), nil
-		case C.GRN_DB_INT32:
-			return int64(*(*C.int32_t)(ptr)), nil
-		case C.GRN_DB_INT64:
-			return int64(*(*C.int64_t)(ptr)), nil
-		case C.GRN_DB_UINT8:
-			return int64(*(*C.uint8_t)(ptr)), nil
-		case C.GRN_DB_UINT16:
-			return int64(*(*C.uint16_t)(ptr)), nil
-		case C.GRN_DB_UINT32:
-			return int64(*(*C.uint32_t)(ptr)), nil
-		case C.GRN_DB_UINT64:
-			return int64(*(*C.uint64_t)(ptr)), nil
-		case C.GRN_DB_FLOAT:
-			return float64(*(*C.double)(ptr)), nil
-		case C.GRN_DB_TIME:
-			return int64(*(*C.int64_t)(ptr)), nil
-		case C.GRN_DB_SHORT_TEXT, C.GRN_DB_TEXT, C.GRN_DB_LONG_TEXT:
-			cValue := *(*C.grngo_text)(ptr)
-			return C.GoBytes(unsafe.Pointer(cValue.ptr), C.int(cValue.size)), nil
-		case C.GRN_DB_TOKYO_GEO_POINT, C.GRN_DB_WGS84_GEO_POINT:
-			cValue := *(*C.grn_geo_point)(ptr)
-			return GeoPoint{int32(cValue.latitude), int32(cValue.longitude)}, nil
-		default:
-			return nil, fmt.Errorf("unsupported value type")
-		}
+		return column.parseScalar(ptr)
 	} else {
-		cVector := *(*C.grngo_vector)(ptr)
-		header := reflect.SliceHeader{
-			Data: uintptr(unsafe.Pointer(cVector.ptr)),
-			Len:  int(cVector.size),
-			Cap:  int(cVector.size),
-		}
-		switch column.c.value_type {
-		case C.GRN_DB_BOOL:
-			cValue := *(*[]C.grn_bool)(unsafe.Pointer(&header))
-			value := make([]bool, len(cValue))
-			for i := 0; i < len(value); i++ {
-				value[i] = cValue[i] == C.GRN_TRUE
-			}
-			return value, nil
-		case C.GRN_DB_INT8:
-			cValue := *(*[]C.int8_t)(unsafe.Pointer(&header))
-			value := make([]int64, len(cValue))
-			for i := 0; i < len(value); i++ {
-				value[i] = int64(cValue[i])
-			}
-			return value, nil
-		case C.GRN_DB_INT16:
-			cValue := *(*[]C.int16_t)(unsafe.Pointer(&header))
-			value := make([]int64, len(cValue))
-			for i := 0; i < len(value); i++ {
-				value[i] = int64(cValue[i])
-			}
-			return value, nil
-		case C.GRN_DB_INT32:
-			cValue := *(*[]C.int32_t)(unsafe.Pointer(&header))
-			value := make([]int64, len(cValue))
-			for i := 0; i < len(value); i++ {
-				value[i] = int64(cValue[i])
-			}
-			return value, nil
-		case C.GRN_DB_INT64:
-			cValue := *(*[]C.int64_t)(unsafe.Pointer(&header))
-			value := make([]int64, len(cValue))
-			for i := 0; i < len(value); i++ {
-				value[i] = int64(cValue[i])
-			}
-			return value, nil
-		case C.GRN_DB_UINT8:
-			cValue := *(*[]C.uint8_t)(unsafe.Pointer(&header))
-			value := make([]int64, len(cValue))
-			for i := 0; i < len(value); i++ {
-				value[i] = int64(cValue[i])
-			}
-			return value, nil
-		case C.GRN_DB_UINT16:
-			cValue := *(*[]C.uint16_t)(unsafe.Pointer(&header))
-			value := make([]int64, len(cValue))
-			for i := 0; i < len(value); i++ {
-				value[i] = int64(cValue[i])
-			}
-			return value, nil
-		case C.GRN_DB_UINT32:
-			cValue := *(*[]C.uint32_t)(unsafe.Pointer(&header))
-			value := make([]int64, len(cValue))
-			for i := 0; i < len(value); i++ {
-				value[i] = int64(cValue[i])
-			}
-			return value, nil
-		case C.GRN_DB_UINT64:
-			cValue := *(*[]C.uint64_t)(unsafe.Pointer(&header))
-			value := make([]int64, len(cValue))
-			for i := 0; i < len(value); i++ {
-				value[i] = int64(cValue[i])
-			}
-			return value, nil
-		case C.GRN_DB_FLOAT:
-			cValue := *(*[]C.double)(unsafe.Pointer(&header))
-			value := make([]float64, len(cValue))
-			for i := 0; i < len(value); i++ {
-				value[i] = float64(cValue[i])
-			}
-			return value, nil
-		case C.GRN_DB_TIME:
-			cValue := *(*[]C.int64_t)(unsafe.Pointer(&header))
-			value := make([]int64, len(cValue))
-			for i := 0; i < len(value); i++ {
-				value[i] = int64(cValue[i])
-			}
-			return value, nil
-		case C.GRN_DB_SHORT_TEXT, C.GRN_DB_TEXT, C.GRN_DB_LONG_TEXT:
-			cValue := *(*[]C.grngo_text)(unsafe.Pointer(&header))
-			value := make([][]byte, len(cValue))
-			for i := 0; i < len(value); i++ {
-				value[i] = C.GoBytes(unsafe.Pointer(cValue[i].ptr), C.int(cValue[i].size))
-			}
-			return value, nil
-		case C.GRN_DB_TOKYO_GEO_POINT, C.GRN_DB_WGS84_GEO_POINT:
-			cValue := *(*[]C.grn_geo_point)(unsafe.Pointer(&header))
-			value := make([]GeoPoint, len(cValue))
-			for i := 0; i < len(value); i++ {
-				value[i].Latitude = int32(cValue[i].latitude)
-				value[i].Longitude = int32(cValue[i].longitude)
-			}
-			return value, nil
-		default:
-			return nil, fmt.Errorf("unsupported value type")
-		}
+		return column.parseVector(ptr)
 	}
-	return nil, fmt.Errorf("unknown error")
 }
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Zurück zum Archiv-Index