@@ -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
9091func 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