Skip to content

Commit 07504a2

Browse files
update db.go pg suporte
1 parent 3622aed commit 07504a2

1 file changed

Lines changed: 150 additions & 9 deletions

File tree

internal/db/db.go

Lines changed: 150 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ func New(driverName string, dsn string) (*DB, error) {
4141
db.SetMaxIdleConns(25)
4242
db.SetConnMaxIdleTime(5 * time.Minute)
4343
db.SetConnMaxLifetime(2 * time.Hour)
44+
fmt.Println(driverName)
4445
switch driverName {
4546
case "sqlite3", "sqlite":
4647
db.ExecContext(ctx, "PRAGMA journal_mode = wal2")
@@ -88,8 +89,7 @@ func setStrEnv(input string) string {
8889

8990
// Adjust the query based on the database driver
9091
func adjustQuery(driver, query string) string {
91-
switch driver {
92-
case "postgres":
92+
if driver == "postgres" {
9393
// Replace ? with $1, $2, $3, etc. for PostgreSQL
9494
count := 1
9595
var result strings.Builder
@@ -104,10 +104,10 @@ func adjustQuery(driver, query string) string {
104104
}
105105
}
106106
return result.String()
107-
case "mysql":
107+
} else if driver == "mysql" {
108108
// Replace double quotes " with backticks ` for MySQL
109109
return strings.ReplaceAll(query, `"`, "`")
110-
case "mssql":
110+
} else if driver == "mssql" {
111111
return strings.ReplaceAll(query, `"`, "")
112112
}
113113
// SQLite uses ? placeholders, so no changes needed
@@ -409,8 +409,126 @@ func (db *DB) TableSchema(params map[string]any, table string, dbName string, ex
409409
}
410410
return &_aux_data, true, nil
411411
} else if contains(_pg_drivers, _driver) {
412-
_query := `SELECT table_name as name FROM information_schema.tables WHERE table_schema = 'public';`
413-
return db.QueryMultiRows(_query, []interface{}{}...)
412+
user_id := int(params["user"].(map[string]interface{})["user_id"].(float64))
413+
_query := fmt.Sprintf(`SELECT
414+
c.ordinal_position - 1 AS cid,
415+
c.column_name AS name,
416+
c.data_type AS type,
417+
(c.is_nullable = 'NO') AS notnull,
418+
c.column_default AS dflt_value,
419+
CASE WHEN kcu.column_name IS NOT NULL THEN 1 ELSE 0 END AS pk
420+
FROM information_schema.columns c
421+
LEFT JOIN information_schema.key_column_usage kcu
422+
ON c.table_name = kcu.table_name
423+
AND c.column_name = kcu.column_name
424+
AND kcu.constraint_name IN (
425+
SELECT constraint_name
426+
FROM information_schema.table_constraints
427+
WHERE table_name = '%s'
428+
AND constraint_type = 'PRIMARY KEY'
429+
)
430+
WHERE c.table_name = '%s'
431+
ORDER BY c.ordinal_position;
432+
`, table, table)
433+
//fmt.Println(table, _query)
434+
_aux_data := []map[string]interface{}{}
435+
_aux_data_fk := map[string]interface{}{}
436+
res, _, err := db.QueryMultiRows(_query, []interface{}{}...)
437+
if err != nil {
438+
return nil, false, err
439+
}
440+
_query = fmt.Sprintf(`WITH foreign_keys AS (
441+
SELECT
442+
rc.constraint_name AS fk_name,
443+
tc.table_name AS table_name,
444+
kcu.column_name AS "from",
445+
ccu.table_name AS "to",
446+
ccu.column_name AS to_column,
447+
rc.update_rule AS on_update,
448+
rc.delete_rule AS on_delete,
449+
kcu.ordinal_position AS seq
450+
FROM information_schema.referential_constraints rc
451+
JOIN information_schema.table_constraints tc
452+
ON rc.constraint_name = tc.constraint_name
453+
AND rc.constraint_schema = tc.constraint_schema
454+
JOIN information_schema.key_column_usage kcu
455+
ON kcu.constraint_name = rc.constraint_name
456+
AND kcu.constraint_schema = rc.constraint_schema
457+
JOIN information_schema.constraint_column_usage ccu
458+
ON ccu.constraint_name = rc.constraint_name
459+
AND ccu.constraint_schema = rc.constraint_schema
460+
WHERE tc.table_name = '%s'
461+
)
462+
SELECT
463+
ROW_NUMBER() OVER () - 1 AS id,
464+
seq,
465+
table_name AS parent_table,
466+
"from",
467+
"to",
468+
on_update,
469+
on_delete,
470+
'NONE' AS match
471+
FROM foreign_keys;`, table)
472+
res_fk, _, err := db.QueryMultiRows(_query, []interface{}{}...)
473+
if err != nil {
474+
return nil, false, err
475+
}
476+
for _, row := range *res_fk {
477+
// fmt.Println(row)
478+
_aux_data_fk[row["from"].(string)] = map[string]interface{}{
479+
"referred_table": row["table"].(string),
480+
"referred_column": row["to"].(string),
481+
}
482+
}
483+
for _, row := range *res {
484+
fmt.Println("NAME:", row["name"])
485+
fk := false
486+
var referred_table string
487+
var referred_column string
488+
if _, exists := _aux_data_fk[row["name"].(string)]; exists {
489+
fk = true
490+
referred_table = _aux_data_fk[row["name"].(string)].(map[string]interface{})["referred_table"].(string)
491+
referred_column = _aux_data_fk[row["name"].(string)].(map[string]interface{})["referred_column"].(string)
492+
}
493+
pk := false
494+
if _pk, ok := row["pk"].(bool); ok {
495+
pk = _pk
496+
} else if _pk, ok := row["pk"].(int); ok {
497+
if _pk == 1 {
498+
pk = true
499+
}
500+
}
501+
nullable := false
502+
if notnull, ok := row["notnull"].(bool); ok {
503+
nullable = notnull
504+
} else if notnull, ok := row["notnull"].(int); ok {
505+
if notnull == 0 {
506+
nullable = true
507+
}
508+
}
509+
_aux_row := map[string]interface{}{
510+
"db": dbName,
511+
"table": table,
512+
"field": row["name"].(string),
513+
"type": row["type"].(string),
514+
"comment": nil,
515+
"pk": pk,
516+
"autoincrement": nil,
517+
"nullable": nullable,
518+
"computed": nil,
519+
"default": nil,
520+
"fk": fk,
521+
"referred_table": referred_table,
522+
"referred_column": referred_column,
523+
"user_id": user_id,
524+
"created_at": time.Now(),
525+
"updated_at": time.Now(),
526+
"excluded": false,
527+
}
528+
// fmt.Println(1, row["name"].(string), _aux_row)
529+
_aux_data = append(_aux_data, _aux_row)
530+
}
531+
return &_aux_data, true, nil
414532
} else if contains(_ddb_drivers, _driver) {
415533
_query := `SELECT table_name as name FROM information_schema.tables`
416534
return db.QueryMultiRows(_query, []interface{}{}...)
@@ -515,6 +633,12 @@ func (db *DB) QueryMultiRows(query string, params ...interface{}) (*[]map[string
515633
//fmt.Println(3, err)
516634
return nil, false, err
517635
}
636+
for key, val := range row {
637+
switch v := val.(type) {
638+
case []byte:
639+
row[key] = string(v)
640+
}
641+
}
518642
//fmt.Println(2, row)
519643
result = append(result, row)
520644
}
@@ -545,6 +669,12 @@ func (db *DB) QueryMultiRowsWithCols(query string, params ...interface{}) (*[]ma
545669
if err := rows.MapScan(row); err != nil {
546670
return nil, nil, false, err
547671
}
672+
for key, val := range row {
673+
switch v := val.(type) {
674+
case []byte:
675+
row[key] = string(v)
676+
}
677+
}
548678
result = append(result, row)
549679
}
550680
return &result, columns, true, nil
@@ -564,6 +694,13 @@ func (db *DB) QuerySingleRow(query string, params ...interface{}) (*map[string]a
564694
if err := rows.MapScan(result); err != nil {
565695
return nil, false, err
566696
}
697+
698+
for key, val := range result {
699+
switch v := val.(type) {
700+
case []byte:
701+
result[key] = string(v)
702+
}
703+
}
567704
}
568705
//fmt.Println(result)
569706
return &result, true, nil
@@ -592,10 +729,8 @@ func (db *DB) GetUserByNameOrEmail(email string) (map[string]any, bool, error) {
592729
//user2 := map[string]any{}
593730
user := map[string]any{}
594731

595-
//query := `SELECT * FROM user WHERE email = $1 OR username = $1`
596-
597732
query := `SELECT * FROM users WHERE email = $1 OR username = $1`
598-
733+
fmt.Println(email)
599734
//err := db.GetContext(ctx, &user2, query, email)
600735
rows, err := db.QueryxContext(ctx, query, email)
601736
if err != nil {
@@ -607,6 +742,12 @@ func (db *DB) GetUserByNameOrEmail(email string) (map[string]any, bool, error) {
607742
if errr != nil {
608743
fmt.Print(errr)
609744
}
745+
for key, val := range user {
746+
switch v := val.(type) {
747+
case []byte:
748+
user[key] = string(v)
749+
}
750+
}
610751
//fmt.Print(user["username"])
611752
}
612753
if errors.Is(err, sql.ErrNoRows) {

0 commit comments

Comments
 (0)