Skip to content

Commit 7f1ffc5

Browse files
authored
Merge pull request #4 from cipherstash/fix/add-types-to-convert-to-string
Add types to convert to string
2 parents 2e6e71b + 422db1e commit 7f1ffc5

File tree

2 files changed

+49
-4
lines changed

2 files changed

+49
-4
lines changed

goeql.go

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ package goeql
1414
import (
1515
"encoding/json"
1616
"fmt"
17+
"reflect"
1718
"strconv"
19+
"strings"
1820
)
1921

2022
// TableColumn represents the table and column an encrypted value belongs to
@@ -240,12 +242,30 @@ func ToEncryptedColumn(value any, table string, column string, queryType any) (E
240242
}
241243

242244
func convertToString(value any) (string, error) {
245+
// Check for slice types
246+
val := reflect.ValueOf(value)
247+
// reflect.Slice will return true if it is a slice
248+
if val.Kind() == reflect.Slice {
249+
strSlice := make([]string, val.Len())
250+
for i := 0; i < val.Len(); i++ {
251+
elem, err := convertToString(val.Index(i).Interface())
252+
if err != nil {
253+
return "", err
254+
}
255+
strSlice[i] = elem
256+
}
257+
return "[" + strings.Join(strSlice, ", ") + "]", nil
258+
}
243259
switch v := value.(type) {
260+
case fmt.Stringer:
261+
return v.String(), nil
244262
case string:
245263
return v, nil
246-
case int:
264+
case int, int8, int16, int32, int64:
265+
return fmt.Sprintf("%d", v), nil
266+
case uint, uint8, uint16, uint32, uint64, uintptr:
247267
return fmt.Sprintf("%d", v), nil
248-
case float64:
268+
case float32, float64:
249269
return fmt.Sprintf("%f", v), nil
250270
case map[string]any:
251271
jsonData, err := json.Marshal(v)

goeql_test.go

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,9 @@ func TestToEncryptedColumn(t *testing.T) {
406406

407407
// Test convertToString Function
408408
func TestConvertToString(t *testing.T) {
409+
// the ptr value for unitptr will change between tests
410+
// set a mock value to use to confirm the convertToString function works on this uintptr.
411+
var mockPtr uintptr = 1374390189136
409412
tests := []struct {
410413
value interface{}
411414
expectedStr string
@@ -414,9 +417,31 @@ func TestConvertToString(t *testing.T) {
414417
{value: "test_string", expectedStr: "test_string", expectError: false},
415418
{value: 123, expectedStr: "123", expectError: false},
416419
{value: 123.456, expectedStr: "123.456000", expectError: false},
420+
{value: int(1), expectedStr: "1", expectError: false},
421+
{value: int8(-128), expectedStr: "-128", expectError: false},
422+
{value: int8(127), expectedStr: "127", expectError: false},
423+
{value: int16(-32768), expectedStr: "-32768", expectError: false},
424+
{value: int16(32767), expectedStr: "32767", expectError: false},
425+
{value: int32(-2147483648), expectedStr: "-2147483648", expectError: false},
426+
{value: int32(2147483647), expectedStr: "2147483647", expectError: false},
427+
{value: int64(-9223372036854775808), expectedStr: "-9223372036854775808", expectError: false},
428+
{value: int64(9223372036854775807), expectedStr: "9223372036854775807", expectError: false},
429+
{value: uint(1), expectedStr: "1", expectError: false},
430+
{value: uint8(255), expectedStr: "255", expectError: false},
431+
{value: uint16(65535), expectedStr: "65535", expectError: false},
432+
{value: uint32(4294967295), expectedStr: "4294967295", expectError: false},
433+
{value: uint64(18446744073709551615), expectedStr: "18446744073709551615", expectError: false},
434+
{value: float32(123.456), expectedStr: "123.456001", expectError: false},
435+
{value: float32(-10.543), expectedStr: "-10.543000", expectError: false},
436+
{value: float64(3.1425), expectedStr: "3.142500", expectError: false},
437+
{value: float64(-2.7182), expectedStr: "-2.718200", expectError: false},
438+
{value: mockPtr, expectedStr: "1374390189136", expectError: false}, //uinttpr type
417439
{value: true, expectedStr: "true", expectError: false},
418440
{value: map[string]interface{}{"key": "value"}, expectedStr: `{"key":"value"}`, expectError: false},
419-
{value: []int{1, 2, 3}, expectedStr: "", expectError: true}, // Unsupported type
441+
{value: []int{1, 2, 3}, expectedStr: "[1, 2, 3]", expectError: false},
442+
{value: []float64{1.1, 2.2, 3.3}, expectedStr: "[1.100000, 2.200000, 3.300000]", expectError: false},
443+
{value: []string{"hello", "world"}, expectedStr: "[hello, world]", expectError: false},
444+
{value: []bool{true, false, true}, expectedStr: "[true, false, true]", expectError: false},
420445
}
421446

422447
for _, tt := range tests {
@@ -429,7 +454,7 @@ func TestConvertToString(t *testing.T) {
429454
if err != nil {
430455
t.Errorf("Unexpected error for value: %v, error: %v", tt.value, err)
431456
} else if str != tt.expectedStr {
432-
t.Errorf("Expected '%s', got '%s' for value: %v", tt.expectedStr, str, tt.value)
457+
t.Errorf("Expected '%s', got '%s' for value: %v for type: '%s'", tt.expectedStr, str, tt.value, reflect.TypeOf(tt.value))
433458
}
434459
}
435460
}

0 commit comments

Comments
 (0)