// Copyright (c) 2019 AT&T Intellectual Property. // Copyright (c) 2019 Nokia. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package sdl import ( "github.com/go-redis/redis" "os" "reflect" ) type SdlInstance struct { nameSpace string nsPrefix string client *redis.Client } func Create(nameSpace string) *SdlInstance { hostname := os.Getenv("DBAAS_SERVICE_HOST") if hostname == "" { hostname = "localhost" } port := os.Getenv("DBAAS_SERVICE_PORT") if port == "" { port = "6379" } redisAddress := hostname + ":" + port client := redis.NewClient(&redis.Options{ Addr: redisAddress, Password: "", // no password set DB: 0, // use default DB }) s := SdlInstance{ nameSpace: nameSpace, nsPrefix: "{" + nameSpace + "},", client: client, } return &s } func (s *SdlInstance) setNamespaceToKeys(pairs ...interface{}) []interface{} { var retVal []interface{} for i, v := range pairs { if i%2 == 0 { reflectType := reflect.TypeOf(v) switch reflectType.Kind() { case reflect.Slice: x := reflect.ValueOf(v) for i2 := 0; i2 < x.Len(); i2++ { if i2%2 == 0 { retVal = append(retVal, s.nsPrefix+x.Index(i2).Interface().(string)) } else { retVal = append(retVal, x.Index(i2).Interface()) } } case reflect.Array: x := reflect.ValueOf(v) for i2 := 0; i2 < x.Len(); i2++ { if i2%2 == 0 { retVal = append(retVal, s.nsPrefix+x.Index(i2).Interface().(string)) } else { retVal = append(retVal, x.Index(i2).Interface()) } } default: retVal = append(retVal, s.nsPrefix+v.(string)) } } else { retVal = append(retVal, v) } } return retVal } func (s *SdlInstance) Set(pairs ...interface{}) error { keyAndData := s.setNamespaceToKeys(pairs...) err := s.client.MSet(keyAndData...).Err() return err } func (s *SdlInstance) Get(keys []string) (map[string]interface{}, error) { var keysWithNs []string for _, v := range keys { keysWithNs = append(keysWithNs, s.nsPrefix+v) } val, err := s.client.MGet(keysWithNs...).Result() m := make(map[string]interface{}) if err != nil { return m, err } for i, v := range val { m[keys[i]] = v } return m, err } func (s *SdlInstance) SetIf(key string, oldData, newData interface{}) { panic("SetIf not implemented\n") } func (s *SdlInstance) SetIfiNotExists(key string, data interface{}) { panic("SetIfiNotExists not implemented\n") } func (s *SdlInstance) Remove(keys ...string) { panic("Remove not implemented\n") } func (s *SdlInstance) RemoveIf(key string, data interface{}) { panic("RemoveIf not implemented\n") } func (s *SdlInstance) GetAll() []string { panic("GetAll not implemented\n") } func (s *SdlInstance) RemoveAll() { panic("RemoveAll not implemented\n") }