Skip to content

Commit 1b1b761

Browse files
authored
Merge pull request #259 from TileDB-Inc/smr/sc-25205/support-dimlabels
Add support for dimension labels
2 parents eee5241 + 44bd673 commit 1b1b761

File tree

9 files changed

+885
-24
lines changed

9 files changed

+885
-24
lines changed

dimension.go

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"fmt"
1313
"os"
1414
"reflect"
15+
"runtime"
1516
"strconv"
1617
"unsafe"
1718
)
@@ -50,8 +51,14 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
5051

5152
var ret C.int32_t
5253
// Convert domain to type then to void*
54+
// Use domainPtr to ensure cdomain is not collected before it is passed to tiledb.
55+
var domainPtr any
56+
defer runtime.KeepAlive(domainPtr)
5357
var cdomain unsafe.Pointer
5458
// Convert extent to type then to void*
59+
// Use extentPtr to ensure cdomain is not collected before it is passed to tiledb.
60+
var extentPtr any
61+
defer runtime.KeepAlive(extentPtr)
5562
var cextent unsafe.Pointer
5663
// Switch on datatype type to create void* for domain and extent.
5764
// Extent has already checked to be same type as domain so this is safe
@@ -63,9 +70,11 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
6370
}
6471
// Create domain void*
6572
tmpDomain := domain.([]int8)
73+
domainPtr = &tmpDomain
6674
cdomain = unsafe.Pointer(&tmpDomain[0])
6775
// Create extent void*
68-
tmpExtent := (extent.(int8))
76+
tmpExtent := extent.(int8)
77+
extentPtr = &tmpExtent
6978
cextent = unsafe.Pointer(&tmpExtent)
7079
case TILEDB_INT16:
7180
if domainType != reflect.Int16 {
@@ -74,9 +83,11 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
7483
}
7584
// Create domain void*
7685
tmpDomain := domain.([]int16)
86+
domainPtr = &tmpDomain
7787
cdomain = unsafe.Pointer(&tmpDomain[0])
7888
// Create extent void*
79-
tmpExtent := (extent.(int16))
89+
tmpExtent := extent.(int16)
90+
extentPtr = &tmpExtent
8091
cextent = unsafe.Pointer(&tmpExtent)
8192
case TILEDB_INT32:
8293
if domainType != reflect.Int32 && domainType != reflect.Int {
@@ -90,9 +101,11 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
90101
}
91102
// Create domain void*
92103
tmpDomain := domain.([]int32)
104+
domainPtr = &tmpDomain
93105
cdomain = unsafe.Pointer(&tmpDomain[0])
94106
// Create extent void*
95-
tmpExtent := (extent.(int32))
107+
tmpExtent := extent.(int32)
108+
extentPtr = &tmpExtent
96109
cextent = unsafe.Pointer(&tmpExtent)
97110
case TILEDB_INT64, TILEDB_DATETIME_YEAR, TILEDB_DATETIME_MONTH, TILEDB_DATETIME_WEEK, TILEDB_DATETIME_DAY, TILEDB_DATETIME_HR, TILEDB_DATETIME_MIN, TILEDB_DATETIME_SEC, TILEDB_DATETIME_MS, TILEDB_DATETIME_US, TILEDB_DATETIME_NS, TILEDB_DATETIME_PS, TILEDB_DATETIME_FS, TILEDB_DATETIME_AS, TILEDB_TIME_HR, TILEDB_TIME_MIN, TILEDB_TIME_SEC, TILEDB_TIME_MS, TILEDB_TIME_US, TILEDB_TIME_NS, TILEDB_TIME_PS, TILEDB_TIME_FS, TILEDB_TIME_AS:
98111
if domainType != reflect.Int64 && domainType != reflect.Int {
@@ -106,9 +119,11 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
106119
}
107120
// Create domain void*
108121
tmpDomain := domain.([]int64)
122+
domainPtr = &tmpDomain
109123
cdomain = unsafe.Pointer(&tmpDomain[0])
110124
// Create extent void*
111-
tmpExtent := (extent.(int64))
125+
tmpExtent := extent.(int64)
126+
extentPtr = &tmpExtent
112127
cextent = unsafe.Pointer(&tmpExtent)
113128
case TILEDB_UINT8:
114129
if domainType != reflect.Uint8 {
@@ -117,9 +132,11 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
117132
}
118133
// Create domain void*
119134
tmpDomain := domain.([]uint8)
135+
domainPtr = &tmpDomain
120136
cdomain = unsafe.Pointer(&tmpDomain[0])
121137
// Create extent void*
122-
tmpExtent := (extent.(uint8))
138+
tmpExtent := extent.(uint8)
139+
extentPtr = &tmpExtent
123140
cextent = unsafe.Pointer(&tmpExtent)
124141
case TILEDB_UINT16:
125142
if domainType != reflect.Uint16 {
@@ -128,9 +145,11 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
128145
}
129146
// Create domain void*
130147
tmpDomain := domain.([]uint16)
148+
domainPtr = &tmpDomain
131149
cdomain = unsafe.Pointer(&tmpDomain[0])
132150
// Create extent void*
133-
tmpExtent := (extent.(uint16))
151+
tmpExtent := extent.(uint16)
152+
extentPtr = &tmpExtent
134153
cextent = unsafe.Pointer(&tmpExtent)
135154
case TILEDB_UINT32:
136155
if domainType != reflect.Uint32 && domainType != reflect.Uint {
@@ -144,9 +163,11 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
144163
}
145164
// Create domain void*
146165
tmpDomain := domain.([]uint32)
166+
domainPtr = &tmpDomain
147167
cdomain = unsafe.Pointer(&tmpDomain[0])
148168
// Create extent void*
149-
tmpExtent := (extent.(uint32))
169+
tmpExtent := extent.(uint32)
170+
extentPtr = &tmpExtent
150171
cextent = unsafe.Pointer(&tmpExtent)
151172
case TILEDB_UINT64:
152173
if domainType != reflect.Uint64 && domainType != reflect.Uint {
@@ -160,9 +181,11 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
160181
}
161182
// Create domain void*
162183
tmpDomain := domain.([]uint64)
184+
domainPtr = &tmpDomain
163185
cdomain = unsafe.Pointer(&tmpDomain[0])
164186
// Create extent void*
165-
tmpExtent := (extent.(uint64))
187+
tmpExtent := extent.(uint64)
188+
extentPtr = &tmpExtent
166189
cextent = unsafe.Pointer(&tmpExtent)
167190
case TILEDB_FLOAT32:
168191
if domainType != reflect.Float32 {
@@ -171,9 +194,11 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
171194
}
172195
// Create domain void*
173196
tmpDomain := domain.([]float32)
197+
domainPtr = &tmpDomain
174198
cdomain = unsafe.Pointer(&tmpDomain[0])
175199
// Create extent void*
176-
tmpExtent := (extent.(float32))
200+
tmpExtent := extent.(float32)
201+
extentPtr = &tmpExtent
177202
cextent = unsafe.Pointer(&tmpExtent)
178203
case TILEDB_FLOAT64:
179204
if domainType != reflect.Float64 {
@@ -182,9 +207,11 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
182207
}
183208
// Create domain void*
184209
tmpDomain := domain.([]float64)
210+
domainPtr = &tmpDomain
185211
cdomain = unsafe.Pointer(&tmpDomain[0])
186212
// Create extent void*
187-
tmpExtent := (extent.(float64))
213+
tmpExtent := extent.(float64)
214+
extentPtr = &tmpExtent
188215
cextent = unsafe.Pointer(&tmpExtent)
189216
case TILEDB_BOOL:
190217
if domainType != reflect.Bool {
@@ -193,9 +220,11 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
193220
}
194221
// Create domain void*
195222
tmpDomain := domain.([]bool)
223+
domainPtr = &tmpDomain
196224
cdomain = unsafe.Pointer(&tmpDomain[0])
197225
// Create extent void*
198-
tmpExtent := (extent.(bool))
226+
tmpExtent := extent.(bool)
227+
extentPtr = &tmpExtent
199228
cextent = unsafe.Pointer(&tmpExtent)
200229
default:
201230
return nil, fmt.Errorf("Unrecognized datatype passed: %s", datatype.String())

0 commit comments

Comments
 (0)