github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgRedis/dbGob.go (about)

     1  package kmgRedis
     2  import (
     3  	"github.com/bronze1man/kmg/encoding/kmgGob"
     4  	"github.com/bronze1man/kmg/typeTransform"
     5  	"reflect"
     6  	"fmt"
     7  )
     8  
     9  // 向redis中插入数据,如果已经存在数据会返回 ErrKeyExist
    10  func InsertGob(key string, obj interface{}) (err error) {
    11  	b, err := kmgGob.Marshal(obj)
    12  	if err != nil {
    13  		return
    14  	}
    15  	return Insert(key, string(b))
    16  }
    17  
    18  func MustInsertGob(key string, obj interface{}) {
    19  	err := InsertGob(key, obj)
    20  	if err != nil {
    21  		panic(err)
    22  	}
    23  }
    24  
    25  func SetGob(key string, obj interface{}) (err error) {
    26  	b, err := kmgGob.Marshal(obj)
    27  	if err != nil {
    28  		return
    29  	}
    30  	return Set(key, string(b))
    31  }
    32  
    33  func MustSetGob(key string, obj interface{}) {
    34  	err := SetGob(key, obj)
    35  	if err != nil {
    36  		panic(err)
    37  	}
    38  }
    39  
    40  func GetGobIgnoreNotExist(key string, obj interface{}) (err error) {
    41  	err = GetGob(key, obj)
    42  	if err == ErrKeyNotExist {
    43  		return nil
    44  	}
    45  	return err
    46  }
    47  
    48  func MustGetGob(key string, obj interface{}) {
    49  	err := GetGob(key, obj)
    50  	if err != nil {
    51  		panic(err)
    52  	}
    53  }
    54  
    55  // 向redis中更新数据,如果不存在数据,会返回 ErrKeyNotExist
    56  func UpdateGob(key string, obj interface{}) (err error) {
    57  	b, err := kmgGob.Marshal(obj)
    58  	if err != nil {
    59  		return
    60  	}
    61  	return Update(key, string(b))
    62  }
    63  
    64  // 如果数据不存在,会返回ErrKeyNotExist
    65  // 序列化错误,会返回 error
    66  // 网络错误也会返回 error
    67  func GetGob(key string, obj interface{}) (err error) {
    68  	value, err := Get(key)
    69  	if err != nil {
    70  		return err
    71  	}
    72  	err = kmgGob.Unmarshal([]byte(value), obj)
    73  	if err != nil {
    74  		return err
    75  	}
    76  	return nil
    77  }
    78  
    79  func RPushGob(key string, value interface{}) (err error) {
    80  	b, err := kmgGob.Marshal(value)
    81  	if err != nil {
    82  		return err
    83  	}
    84  	return RPush(key, string(b))
    85  }
    86  
    87  func LRangeAllGob(key string, list interface{}) (err error) {
    88  	sList, err := LRangeAll(key)
    89  	iList := []interface{}{}
    90  	typeTransform.MustTransform(&sList,&iList)
    91  	if err != nil {
    92  		return err
    93  	}
    94  	return ListGobUnmarshalNotExistCheck(iList, reflect.ValueOf(list))
    95  }
    96  
    97  /*
    98  带超时的设置一条数据
    99  没有传入数据,不报错,不修改obj
   100  网络错误会返回error
   101  */
   102  func MGetNotExistCheckGob(keyList []string, obj interface{}) (err error) {
   103  	if len(keyList) == 0 {
   104  		return nil
   105  	}
   106  	outList, err := gClient.MGet(keyList...).Result()
   107  	if err != nil {
   108  		return err
   109  	}
   110  	return ListGobUnmarshalNotExistCheck(outList, reflect.ValueOf(obj))
   111  }
   112  
   113  func ListGobUnmarshalNotExistCheck(outList []interface{}, obj reflect.Value) (err error) {
   114  	switch obj.Kind() {
   115  	case reflect.Ptr:
   116  		return ListGobUnmarshalNotExistCheck(outList, obj.Elem())
   117  	case reflect.Slice:
   118  		newSlice := reflect.MakeSlice(obj.Type(), len(outList), len(outList))
   119  		elemType := obj.Type().Elem()
   120  		for i, stringI := range outList {
   121  			s, ok := stringI.(string)
   122  			if !ok {
   123  				return ErrKeyNotExist
   124  			}
   125  			thisValue := newSlice.Index(i)
   126  			thisElem := reflect.New(elemType)
   127  			err = kmgGob.Unmarshal([]byte(s), thisElem.Interface())
   128  			if err != nil {
   129  				return err
   130  			}
   131  			thisValue.Set(thisElem.Elem())
   132  		}
   133  		obj.Set(newSlice)
   134  		return nil
   135  	default:
   136  		return fmt.Errorf("[mgetNotExistCheckGobUnmarshal] Unmarshal unexpect Kind %s", obj.Kind().String())
   137  	}
   138  }