Skip to content
This repository was archived by the owner on Dec 23, 2023. It is now read-only.

Commit c3444df

Browse files
committed
session support
1 parent 150dc65 commit c3444df

File tree

3 files changed

+106
-13
lines changed

3 files changed

+106
-13
lines changed

chdb/chdb.go

+72-11
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ package chdb
1111
char *Execute(char *query, char *format) {
1212
1313
char * argv[] = {(char *)"clickhouse", (char *)"--multiquery", (char *)"--output-format=CSV", (char *)"--query="};
14-
char dataFormat[100];
14+
char dataFormat[100];
1515
char *localQuery;
1616
// Total 4 = 3 arguments + 1 programm name
1717
int argc = 4;
18-
struct local_result *result;
18+
struct local_result *result;
1919
2020
// Format
2121
snprintf(dataFormat, sizeof(dataFormat), "--format=%s", format);
@@ -24,33 +24,94 @@ char *Execute(char *query, char *format) {
2424
// Query - 10 characters + length of query
2525
localQuery = (char *) malloc(strlen(query)+10);
2626
if(localQuery == NULL) {
27-
27+
28+
printf("Out of memmory\n");
29+
return NULL;
30+
}
31+
32+
sprintf(localQuery, "--query=%s", query);
33+
argv[3]=strdup(localQuery);
34+
free(localQuery);
35+
36+
// Main query and result
37+
result = query_stable(argc, argv);
38+
39+
//Free it
40+
free(argv[2]);
41+
free(argv[3]);
42+
43+
return result->buf;
44+
}
45+
46+
char *Session(char *query, char *format, char* path) {
47+
48+
char * argv[] = {(char *)"clickhouse", (char *)"--multiquery", (char *)"--output-format=CSV", (char *)"--query=", (char *)"--path=/tmp/"};
49+
char dataFormat[100];
50+
char dataPath[100];
51+
char *localQuery;
52+
// Total 4 = 4 arguments + 1 programm name
53+
int argc = 5;
54+
struct local_result *result;
55+
56+
// Format
57+
snprintf(dataFormat, sizeof(dataFormat), "--format=%s", format);
58+
argv[2]=strdup(dataFormat);
59+
60+
// Query - 10 characters + length of query
61+
localQuery = (char *) malloc(strlen(query)+10);
62+
if(localQuery == NULL) {
63+
2864
printf("Out of memmory\n");
2965
return NULL;
3066
}
31-
67+
3268
sprintf(localQuery, "--query=%s", query);
3369
argv[3]=strdup(localQuery);
3470
free(localQuery);
3571
72+
// Path
73+
snprintf(dataPath, sizeof(dataPath), "--path=%s", path);
74+
argv[4]=strdup(dataPath);
75+
3676
// Main query and result
3777
result = query_stable(argc, argv);
3878
3979
//Free it
4080
free(argv[2]);
4181
free(argv[3]);
82+
free(argv[4]);
4283
4384
return result->buf;
4485
}
4586
*/
4687
import "C"
4788
import "unsafe"
4889

49-
func Query(str1, str2 string) string {
50-
query := C.CString(str1)
51-
defer C.free(unsafe.Pointer(query))
52-
format := C.CString(str2)
53-
defer C.free(unsafe.Pointer(format))
54-
resultData := C.Execute(query, format)
55-
return C.GoString(resultData)
90+
func Query(str1 string, str2 string) string {
91+
if str2 == "" {
92+
str2 = "CSV"
93+
}
94+
query := C.CString(str1)
95+
defer C.free(unsafe.Pointer(query))
96+
format := C.CString(str2)
97+
defer C.free(unsafe.Pointer(format))
98+
resultData := C.Execute(query, format)
99+
return C.GoString(resultData)
100+
}
101+
102+
func Session(str1 string, str2 string, str3 string) string {
103+
if str3 == "" {
104+
str3 = "/tmp/"
105+
}
106+
if str2 == "" {
107+
str2 = "CSV"
108+
}
109+
query := C.CString(str1)
110+
defer C.free(unsafe.Pointer(query))
111+
format := C.CString(str2)
112+
defer C.free(unsafe.Pointer(format))
113+
path := C.CString(str3)
114+
defer C.free(unsafe.Pointer(path))
115+
resultData := C.Session(query, format, path)
116+
return C.GoString(resultData)
56117
}

chdb/chdb_test.go

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package chdb
2+
3+
import (
4+
"testing"
5+
"strings"
6+
)
7+
8+
var testCases = []struct {
9+
query string
10+
expected string
11+
description string
12+
}{
13+
{"SELECT 1", "1", "Basic Select"},
14+
{"SELECT 'hello'", "\"hello\"", "Basic Select"},
15+
}
16+
17+
func TestChdb(t *testing.T) {
18+
for _, test := range testCases {
19+
observed := Query(test.query, "CSV")
20+
observed = strings.Replace(observed, "\n", "", -1)
21+
if observed != test.expected {
22+
t.Fatalf("%s: %s is not %s", test.query, observed, test.expected)
23+
}
24+
}
25+
}

main.go

+9-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,14 @@ import (
99
func main() {
1010
query := flag.String("query", "SELECT version()", "Query to execute")
1111
format := flag.String("format", "CSV", "Query output format")
12+
path := flag.String("path", "", "Table persistence path")
1213
flag.Parse()
13-
result := chdb.Query(string(*query), string(*format))
14-
fmt.Println(result)
14+
15+
if (path !== ""){
16+
result := chdb.Session(string(*query), string(*format), string(*path))
17+
fmt.Println(result)
18+
} else {
19+
result := chdb.Query(string(*query), string(*format))
20+
fmt.Println(result)
21+
}
1522
}

0 commit comments

Comments
 (0)