Skip to content

Commit e9f5f9f

Browse files
Merge pull request #370 from teo-tsirpanis/capi-handle
Refactor handle management.
2 parents 5580c9d + a6ce392 commit e9f5f9f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+1318
-976
lines changed

.github/workflows/tiledb-go.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ jobs:
3737
strategy:
3838
matrix:
3939
# Will be checking following versions
40-
go: ["1.22", "1.23"]
40+
go: ["1.22", "1.23", "1.24"]
4141
steps:
4242

4343
# Checks out repository
@@ -74,7 +74,7 @@ jobs:
7474
strategy:
7575
matrix:
7676
# Will be checking following versions
77-
go: ["1.22", "1.23"]
77+
go: ["1.22", "1.23", "1.24"]
7878
steps:
7979
# Checks out repository
8080
- uses: actions/checkout@v4
@@ -113,7 +113,7 @@ jobs:
113113
strategy:
114114
matrix:
115115
# Will be checking following versions
116-
go: ["1.22", "1.23"]
116+
go: ["1.22", "1.23", "1.24"]
117117
steps:
118118
# Checks out repository
119119
- uses: actions/checkout@v4

array.go

Lines changed: 70 additions & 66 deletions
Large diffs are not rendered by default.

array_experimental.go

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,41 @@ import (
1313
"unsafe"
1414
)
1515

16+
type consolidationPlanHandle struct{ *capiHandle }
17+
18+
func freeCapiConsolidationPlan(c unsafe.Pointer) {
19+
C.tiledb_consolidation_plan_free((**C.tiledb_consolidation_plan_t)(unsafe.Pointer(&c)))
20+
}
21+
22+
func newConsolidationPlanHandle(ptr *C.tiledb_consolidation_plan_t) consolidationPlanHandle {
23+
return consolidationPlanHandle{newCapiHandle(unsafe.Pointer(ptr), freeCapiConsolidationPlan)}
24+
}
25+
26+
func (x consolidationPlanHandle) Get() *C.tiledb_consolidation_plan_t {
27+
return (*C.tiledb_consolidation_plan_t)(x.capiHandle.Get())
28+
}
29+
1630
// ConsolidationPlan is a consolidation plan for array
1731
type ConsolidationPlan struct {
18-
tiledbConsolidationPlan *C.tiledb_consolidation_plan_t
32+
tiledbConsolidationPlan consolidationPlanHandle
1933
context *Context
2034
}
2135

36+
func newConsolidationPlanFromHandle(context *Context, handle consolidationPlanHandle) *ConsolidationPlan {
37+
return &ConsolidationPlan{tiledbConsolidationPlan: handle, context: context}
38+
}
39+
2240
// GetConsolidationPlan creates a consolidation plan for the already opened array.
2341
// The plan and the array will share the same tiledb context
2442
func GetConsolidationPlan(arr *Array, fragmentSize uint64) (*ConsolidationPlan, error) {
25-
cp := &ConsolidationPlan{
26-
context: arr.context,
27-
}
28-
29-
ret := C.tiledb_consolidation_plan_create_with_mbr(cp.context.tiledbContext, arr.tiledbArray, C.uint64_t(fragmentSize), &cp.tiledbConsolidationPlan)
43+
var consolidationPlanPtr *C.tiledb_consolidation_plan_t
44+
ret := C.tiledb_consolidation_plan_create_with_mbr(arr.context.tiledbContext.Get(), arr.tiledbArray.Get(), C.uint64_t(fragmentSize), &consolidationPlanPtr)
3045
runtime.KeepAlive(arr)
3146
if ret != C.TILEDB_OK {
32-
return nil, fmt.Errorf("error getting consolidation plan for array: %w", cp.context.LastError())
47+
return nil, fmt.Errorf("error getting consolidation plan for array: %w", arr.context.LastError())
3348
}
34-
freeOnGC(cp)
3549

36-
return cp, nil
50+
return newConsolidationPlanFromHandle(arr.context, newConsolidationPlanHandle(consolidationPlanPtr)), nil
3751
}
3852

3953
// Free releases the internal TileDB core data that was allocated on the C heap.
@@ -42,16 +56,14 @@ func GetConsolidationPlan(arr *Array, fragmentSize uint64) (*ConsolidationPlan,
4256
// can safely be called many times on the same object; if it has already
4357
// been freed, it will not be freed again.
4458
func (cp *ConsolidationPlan) Free() {
45-
if cp.tiledbConsolidationPlan != nil {
46-
C.tiledb_consolidation_plan_free(&cp.tiledbConsolidationPlan)
47-
}
59+
cp.tiledbConsolidationPlan.Free()
4860
}
4961

5062
// NumNodes returns the number of nodes for the plan
5163
func (cp *ConsolidationPlan) NumNodes() (uint64, error) {
5264
var numNodes C.uint64_t
5365

54-
ret := C.tiledb_consolidation_plan_get_num_nodes(cp.context.tiledbContext, cp.tiledbConsolidationPlan, &numNodes)
66+
ret := C.tiledb_consolidation_plan_get_num_nodes(cp.context.tiledbContext.Get(), cp.tiledbConsolidationPlan.Get(), &numNodes)
5567
runtime.KeepAlive(cp)
5668
if ret != C.TILEDB_OK {
5769
return 0, fmt.Errorf("error getting consolidation plan num nodes: %w", cp.context.LastError())
@@ -64,7 +76,7 @@ func (cp *ConsolidationPlan) NumNodes() (uint64, error) {
6476
func (cp *ConsolidationPlan) NumFragments(nodeIndex uint64) (uint64, error) {
6577
var numFragments C.uint64_t
6678

67-
ret := C.tiledb_consolidation_plan_get_num_fragments(cp.context.tiledbContext, cp.tiledbConsolidationPlan, C.uint64_t(nodeIndex), &numFragments)
79+
ret := C.tiledb_consolidation_plan_get_num_fragments(cp.context.tiledbContext.Get(), cp.tiledbConsolidationPlan.Get(), C.uint64_t(nodeIndex), &numFragments)
6880
runtime.KeepAlive(cp)
6981
if ret != C.TILEDB_OK {
7082
return 0, fmt.Errorf("error getting consolidation plan num fragments: %w", cp.context.LastError())
@@ -77,7 +89,7 @@ func (cp *ConsolidationPlan) NumFragments(nodeIndex uint64) (uint64, error) {
7789
func (cp *ConsolidationPlan) FragmentURI(nodeIndex, fragmentIndex uint64) (string, error) {
7890
var curi *C.char
7991

80-
ret := C.tiledb_consolidation_plan_get_fragment_uri(cp.context.tiledbContext, cp.tiledbConsolidationPlan, C.uint64_t(nodeIndex), C.uint64_t(fragmentIndex), &curi)
92+
ret := C.tiledb_consolidation_plan_get_fragment_uri(cp.context.tiledbContext.Get(), cp.tiledbConsolidationPlan.Get(), C.uint64_t(nodeIndex), C.uint64_t(fragmentIndex), &curi)
8193
runtime.KeepAlive(cp)
8294
if ret != C.TILEDB_OK {
8395
return "", fmt.Errorf("error getting consolidation plan fragment uri for node %d and fragment %d: %w", nodeIndex, fragmentIndex, cp.context.LastError())
@@ -89,7 +101,7 @@ func (cp *ConsolidationPlan) FragmentURI(nodeIndex, fragmentIndex uint64) (strin
89101
// DumpJSON returns a json serialization of the plan
90102
func (cp *ConsolidationPlan) DumpJSON() (string, error) {
91103
var cjson *C.char
92-
ret := C.tiledb_consolidation_plan_dump_json_str(cp.context.tiledbContext, cp.tiledbConsolidationPlan, &cjson)
104+
ret := C.tiledb_consolidation_plan_dump_json_str(cp.context.tiledbContext.Get(), cp.tiledbConsolidationPlan.Get(), &cjson)
93105
runtime.KeepAlive(cp)
94106
if ret != C.TILEDB_OK {
95107
return "", fmt.Errorf("error getting consolidation plan json dump: %w", cp.context.LastError())
@@ -119,7 +131,7 @@ func (a *Array) ConsolidateFragments(config *Config, fragmentList []string) erro
119131
list, freeMemory := cStringArray(fragmentList)
120132
defer freeMemory()
121133

122-
ret := C.tiledb_array_consolidate_fragments(a.context.tiledbContext, curi, (**C.char)(slicePtr(list)), C.uint64_t(len(list)), config.tiledbConfig)
134+
ret := C.tiledb_array_consolidate_fragments(a.context.tiledbContext.Get(), curi, (**C.char)(slicePtr(list)), C.uint64_t(len(list)), config.tiledbConfig.Get())
123135
runtime.KeepAlive(a)
124136
if ret != C.TILEDB_OK {
125137
return fmt.Errorf("error consolidating tiledb array fragment list: %w", a.context.LastError())

0 commit comments

Comments
 (0)