summaryrefslogtreecommitdiff
path: root/research/lesci/append.go
diff options
context:
space:
mode:
Diffstat (limited to 'research/lesci/append.go')
-rw-r--r--research/lesci/append.go46
1 files changed, 46 insertions, 0 deletions
diff --git a/research/lesci/append.go b/research/lesci/append.go
new file mode 100644
index 0000000..a3459ff
--- /dev/null
+++ b/research/lesci/append.go
@@ -0,0 +1,46 @@
+package lesci
+
+import (
+ "context"
+ "database/sql"
+ "database/sql/driver"
+
+ "github.com/duckdb/duckdb-go/v2"
+)
+
+type AppendFunc func([]driver.Value) error
+type AppendRowsFunc func(appendFunc AppendFunc) error
+
+func AppendRows(db *sql.DB, table string, appendRowsFunc AppendRowsFunc) error {
+ var conn *sql.Conn
+
+ if c, err := db.Conn(context.Background()); err != nil {
+ return err
+ } else {
+ conn = c
+ }
+
+ defer conn.Close()
+
+ return conn.Raw(func(driverConn any) error {
+ duckConn := driverConn.(*duckdb.Conn)
+
+ var appender *duckdb.Appender
+
+ if a, err := duckdb.NewAppenderFromConn(duckConn, "", table); err != nil {
+ return err
+ } else {
+ appender = a
+ }
+
+ defer appender.Close()
+
+ if err := appendRowsFunc(func(row []driver.Value) error {
+ return appender.AppendRow(row...)
+ }); err != nil {
+ return err
+ }
+
+ return appender.Flush()
+ })
+}