package starmap import ( "errors" "time" ) func (kv *RemoteKv) clientOnline() error { if kv.client == nil || (kv.setKeepAlive && !kv.client.Online) { return errors.New("Client Not Online,Please Contact A Server First") } if (!kv.setKeepAlive) && (!kv.client.Online) { err := kv.reconnect() return err } return nil } func (kv *RemoteKv) Get(key string) (interface{}, error) { kv.kvmu.Lock() defer kv.kvmu.Unlock() defer kv.keepalive() if err := kv.clientOnline(); err != nil { return nil, err } data, err := kv.client.SendValueWait("Get", key, kv.TimeOut) if err != nil { return nil, err } inf, err := decode([]byte(data.Value)) if err != nil { return nil, err } var repInf *basicReply repInf = inf.(*basicReply) if repInf.Key == "ok" { inf2, err := decode(repInf.Value) if err != nil { return nil, err } return inf2, nil } return nil, errors.New(string(repInf.Value)) } func (kv *RemoteKv) Store(key string, value interface{}) error { kv.kvmu.Lock() defer kv.kvmu.Unlock() defer kv.keepalive() if err := kv.clientOnline(); err != nil { return err } encodeData, err := encode(value) if err != nil { return err } sendData, _ := encode(basicReply{key, encodeData}) data, err := kv.client.SendValueWait("Store", string(sendData), kv.TimeOut) if err != nil { return err } if data.Value == "ok" { return nil } return errors.New(data.Value) } func (kv *RemoteKv) Delete(key string) error { kv.kvmu.Lock() defer kv.kvmu.Unlock() defer kv.keepalive() if err := kv.clientOnline(); err != nil { return err } data, err := kv.client.SendValueWait("Delete", key, kv.TimeOut) if err != nil { return err } if data.Value == "ok" { return nil } return errors.New(data.Value) } func (kv *RemoteKv) keepalive() { if !kv.setKeepAlive && kv.client.Online { kv.client.ClientStop() for kv.client.Online { time.Sleep(time.Millisecond) } } }