summaryrefslogtreecommitdiff
path: root/:w
diff options
context:
space:
mode:
Diffstat (limited to ':w')
-rw-r--r--:w66
1 files changed, 66 insertions, 0 deletions
diff --git a/:w b/:w
new file mode 100644
index 0000000..d7a5759
--- /dev/null
+++ b/:w
@@ -0,0 +1,66 @@
+package db
+
+import (
+ "fmt"
+ "reflect"
+ "strings"
+)
+
+type DataTable[T any] struct {
+ TableName string
+}
+
+// Filters are stored as KVP where the field is the key and the value is the filter
+func (base *DataTable[T]) formQueryWithFilters(filters map[string]any) string {
+ if len(filters) == 0 {
+ return base.formSelectAllQuery()
+ }
+ var sb = strings.Builder{}
+ var baseQuery = base.formSelectAllQuery()
+ sb.WriteString(strings.TrimRight(baseQuery, ";"))
+ sb.WriteString(" WHERE (")
+ var isFirst = true
+ for k, v := range filters {
+ if !isFirst {
+ sb.WriteString(" AND ")
+ }
+ switch v.(type) {
+ case string:
+ sb.WriteString(fmt.Sprintf("%s = '%s'", k, v))
+ }
+ isFirst = false
+ }
+ sb.WriteString(");")
+ return sb.String()
+}
+
+// Forms a query to get all the fields from database
+func (base *DataTable[T]) formSelectAllQuery() string {
+ var sb = strings.Builder{}
+ sb.WriteString("SELECT (")
+ var fields = base.getFields()
+ for i, v := range fields {
+ if i != 0 {
+ sb.WriteString(", ")
+ }
+ sb.WriteString(v)
+ }
+ sb.WriteString(") FROM ")
+ sb.WriteString(base.TableName)
+ sb.WriteString(";")
+ return sb.String()
+}
+
+func (base *DataTable[T]) getFields() []string {
+ var zero T
+ var outp = make([]string, 0)
+ for _, f := range reflect.VisibleFields(reflect.TypeOf(zero)) {
+ var tag, exists = f.Tag.Lookup("sql")
+ if exists {
+ outp = append(outp, tag)
+ } else {
+ outp = append(outp, f.Name)
+ }
+ }
+ return outp
+}