From f1ea5ee273da916895a81910ec123986c3609404 Mon Sep 17 00:00:00 2001 From: Paul Mach Date: Wed, 9 Jan 2019 19:33:46 -0500 Subject: [PATCH] fix GetApproximateSizes --- db.go | 22 ++++++++++++++++++---- db_test.go | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/db.go b/db.go index fdfc8186..5533d13c 100644 --- a/db.go +++ b/db.go @@ -543,12 +543,19 @@ func (db *DB) GetApproximateSizes(ranges []Range) []uint64 { cStartLens := make([]C.size_t, len(ranges)) cLimitLens := make([]C.size_t, len(ranges)) for i, r := range ranges { - cStarts[i] = byteToChar(r.Start) + cStarts[i] = (*C.char)(C.CBytes(r.Start)) cStartLens[i] = C.size_t(len(r.Start)) - cLimits[i] = byteToChar(r.Limit) + cLimits[i] = (*C.char)(C.CBytes(r.Limit)) cLimitLens[i] = C.size_t(len(r.Limit)) } + defer func() { + for i := range ranges { + C.free(unsafe.Pointer(cStarts[i])) + C.free(unsafe.Pointer(cLimits[i])) + } + }() + C.rocksdb_approximate_sizes( db.c, C.int(len(ranges)), @@ -577,12 +584,19 @@ func (db *DB) GetApproximateSizesCF(cf *ColumnFamilyHandle, ranges []Range) []ui cStartLens := make([]C.size_t, len(ranges)) cLimitLens := make([]C.size_t, len(ranges)) for i, r := range ranges { - cStarts[i] = byteToChar(r.Start) + cStarts[i] = (*C.char)(C.CBytes(r.Start)) cStartLens[i] = C.size_t(len(r.Start)) - cLimits[i] = byteToChar(r.Limit) + cLimits[i] = (*C.char)(C.CBytes(r.Limit)) cLimitLens[i] = C.size_t(len(r.Limit)) } + defer func() { + for i := range ranges { + C.free(unsafe.Pointer(cStarts[i])) + C.free(unsafe.Pointer(cLimits[i])) + } + }() + C.rocksdb_approximate_sizes_cf( db.c, cf.c, diff --git a/db_test.go b/db_test.go index c689b35e..b08171bd 100644 --- a/db_test.go +++ b/db_test.go @@ -172,3 +172,42 @@ func TestDBMultiGet(t *testing.T) { ensure.DeepEqual(t, values[2].Data(), givenVal2) ensure.DeepEqual(t, values[3].Data(), givenVal3) } + +func TestDBGetApproximateSizes(t *testing.T) { + db := newTestDB(t, "TestDBGetApproximateSizes", nil) + defer db.Close() + + // no ranges + sizes := db.GetApproximateSizes(nil) + ensure.DeepEqual(t, len(sizes), 0) + + // range will nil start and limit + sizes = db.GetApproximateSizes([]Range{{Start: nil, Limit: nil}}) + ensure.DeepEqual(t, sizes, []uint64{0}) + + // valid range + sizes = db.GetApproximateSizes([]Range{{Start: []byte{0x00}, Limit: []byte{0xFF}}}) + ensure.DeepEqual(t, sizes, []uint64{0}) +} + +func TestDBGetApproximateSizesCF(t *testing.T) { + db := newTestDB(t, "TestDBGetApproximateSizesCF", nil) + defer db.Close() + + o := NewDefaultOptions() + + cf, err := db.CreateColumnFamily(o, "other") + ensure.Nil(t, err) + + // no ranges + sizes := db.GetApproximateSizesCF(cf, nil) + ensure.DeepEqual(t, len(sizes), 0) + + // range will nil start and limit + sizes = db.GetApproximateSizesCF(cf, []Range{{Start: nil, Limit: nil}}) + ensure.DeepEqual(t, sizes, []uint64{0}) + + // valid range + sizes = db.GetApproximateSizesCF(cf, []Range{{Start: []byte{0x00}, Limit: []byte{0xFF}}}) + ensure.DeepEqual(t, sizes, []uint64{0}) +}