created a new encoder for every write

This commit is contained in:
Radu Ioan Fericean
2012-02-29 20:56:57 +02:00
parent a16a75d8e8
commit 623c634848
5 changed files with 29 additions and 39 deletions

View File

@@ -18,8 +18,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
package main
import (
"bytes"
//"encoding/gob"
"encoding/json"
"flag"
"github.com/rif/cgrates/timespans"
@@ -41,27 +39,6 @@ var (
ubfile = flag.String("ubfile", "ub.json", "User budgets file")
)
func testGob(key string, aps []*timespans.ActivationPeriod) {
var buf bytes.Buffer
enc := json.NewEncoder(&buf)
dec := json.NewDecoder(&buf)
enc.Encode(aps)
result := buf.String()
aps1 := make([]*timespans.ActivationPeriod, 0)
buf.Reset()
buf.WriteString(result)
err := dec.Decode(&aps1)
log.Print("Err: ", err)
buf.Reset()
enc.Encode(aps1)
result1 := buf.String()
log.Print("Equal? ", result == result1, len(result), len(result1))
}
func writeToStorage(storage timespans.StorageGetter,
callDescriptors []*timespans.CallDescriptor,
destinations []*timespans.Destination,
@@ -70,7 +47,6 @@ func writeToStorage(storage timespans.StorageGetter,
for _, cd := range callDescriptors {
storage.SetActivationPeriods(cd.GetKey(), cd.ActivationPeriods)
log.Printf("Storing activation periods for %q", cd.GetKey())
testGob(cd.GetKey(), cd.ActivationPeriods)
}
for _, d := range destinations {
storage.SetDestination(d)

View File

@@ -22,6 +22,24 @@ import (
//"log"
)
func TestApStoreRestore(t *testing.T) {
func TestApRestoreKyoto(t *testing.T) {
getter, _ := NewKyotoStorage("test.kch")
defer getter.Close()
cd := &CallDescriptor{CstmId: "vdf", Subject: "rif", DestinationPrefix: "0257", storageGetter: getter}
cd.SearchStorageForPrefix()
if len(cd.ActivationPeriods) != 2 {
t.Error("Error restoring activation periods: ", cd.ActivationPeriods)
}
}
func TestApRestoreRedis(t *testing.T) {
getter, _ := NewRedisStorage("tcp:127.0.0.1:6379", 10)
defer getter.Close()
cd := &CallDescriptor{CstmId: "vdf", Subject: "rif", DestinationPrefix: "0257", storageGetter: getter}
cd.SearchStorageForPrefix()
if len(cd.ActivationPeriods) != 2 {
t.Error("Error restoring activation periods: ", cd.ActivationPeriods)
}
}

View File

@@ -28,7 +28,6 @@ import (
type KyotoStorage struct {
db *kc.DB
buf bytes.Buffer
enc *gob.Encoder
dec *gob.Decoder
mux sync.Mutex // we need norma lock because we reset the buf variable
}
@@ -36,7 +35,6 @@ type KyotoStorage struct {
func NewKyotoStorage(filaName string) (*KyotoStorage, error) {
ndb, err := kc.Open(filaName, kc.WRITE)
ks := &KyotoStorage{db: ndb}
ks.enc = gob.NewEncoder(&ks.buf)
ks.dec = gob.NewDecoder(&ks.buf)
return ks, err
}
@@ -49,9 +47,10 @@ func (ks *KyotoStorage) SetActivationPeriods(key string, aps []*ActivationPeriod
ks.mux.Lock()
defer ks.mux.Unlock()
ks.buf.Reset()
ks.enc.Encode(aps)
return ks.db.Set(key, ks.buf.String())
var writeBuf bytes.Buffer
encoder := gob.NewEncoder(&writeBuf)
encoder.Encode(aps)
return ks.db.Set(key, writeBuf.String())
}
func (ks *KyotoStorage) GetActivationPeriods(key string) (aps []*ActivationPeriod, err error) {

View File

@@ -21,7 +21,7 @@ import (
"bytes"
"encoding/gob"
"github.com/simonz05/godis"
"log"
// "log"
"sync"
)
@@ -29,7 +29,6 @@ type RedisStorage struct {
dbNb int
db *godis.Client
buf bytes.Buffer
enc *gob.Encoder
dec *gob.Decoder
mux sync.Mutex
}
@@ -38,7 +37,6 @@ func NewRedisStorage(address string, db int) (*RedisStorage, error) {
ndb := godis.New(address, db, "")
rs := &RedisStorage{db: ndb, dbNb: db}
rs.enc = gob.NewEncoder(&rs.buf)
rs.dec = gob.NewDecoder(&rs.buf)
return rs, nil
}
@@ -51,10 +49,10 @@ func (rs *RedisStorage) SetActivationPeriods(key string, aps []*ActivationPeriod
//.db.Select(rs.dbNb)
rs.mux.Lock()
defer rs.mux.Unlock()
rs.buf.Reset()
rs.enc.Encode(aps)
return rs.db.Set(key, rs.buf.Bytes())
var writeBuf bytes.Buffer
encoder := gob.NewEncoder(&writeBuf)
encoder.Encode(aps)
return rs.db.Set(key, writeBuf.Bytes())
}
func (rs *RedisStorage) GetActivationPeriods(key string) (aps []*ActivationPeriod, err error) {
@@ -66,8 +64,7 @@ func (rs *RedisStorage) GetActivationPeriods(key string) (aps []*ActivationPerio
rs.buf.Reset()
rs.buf.Write(elem.Bytes())
e := rs.dec.Decode(&aps)
log.Print(e)
rs.dec.Decode(&aps)
return
}

Binary file not shown.