From af1f6352ce4c0a9f7a55635d3dc49250cfa99685 Mon Sep 17 00:00:00 2001 From: POUDEROUX Tom Date: Mon, 28 Apr 2025 22:37:17 +0200 Subject: [PATCH] Better Database Queries + fix profiler --- main.go | 10 +++++--- src/database/database.go | 55 ++++++++++++++++++++-------------------- src/profiler/profiler.go | 4 +++ 3 files changed, 38 insertions(+), 31 deletions(-) diff --git a/main.go b/main.go index 7d7f2b6..48297f1 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "chromagies/src/api" "chromagies/src/config" "chromagies/src/database" + "chromagies/src/profiler" "fmt" "log" "net/http" @@ -31,12 +32,13 @@ func main() { database.Init() initRouter() - - stopTime := time.Now() - log.Printf("Server ready in %d microseconds\n", stopTime.Sub(startTime).Microseconds()) - var conf config.Server = (config.GetConfig()).Server + var readyTime time.Duration = time.Duration(time.Since(startTime).Microseconds()) + profiler.Register("Startup", 1, "µs") + profiler.Add("Startup", readyTime) + log.Printf("Server ready in %d microseconds\n", readyTime) + http.ListenAndServe(fmt.Sprintf("%s:%d", conf.IP, conf.Port), router) stopServer() } diff --git a/src/database/database.go b/src/database/database.go index dff5e9e..febb5ff 100644 --- a/src/database/database.go +++ b/src/database/database.go @@ -256,8 +256,7 @@ func executeQuery(query string, args ...any) *sql.Rows { func fetchStoredRoutines() { storedRoutines = nil - var query string = fmt.Sprintf("SELECT ROUTINE_NAME, ROUTINE_TYPE FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA=\"%s\";", dbConfig.Database) - var rows *sql.Rows = executeQuery(query) + var rows *sql.Rows = executeQuery("SELECT ROUTINE_NAME, ROUTINE_TYPE FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA=?;", dbConfig.Database) if rows != nil { storedRoutines = make(map[string]uint8, 0) defer rows.Close() @@ -319,8 +318,7 @@ func callStoredFunction(name string, args ...any) { } func fetchTables() []string { - var query string = fmt.Sprintf("SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA=\"%s\";", dbConfig.Database) - var rows *sql.Rows = executeQuery(query) + var rows *sql.Rows = executeQuery("SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA=?;", dbConfig.Database) var tables []string = make([]string, 0) if rows != nil { defer rows.Close() @@ -334,8 +332,7 @@ func fetchTables() []string { } func fetchColumns(table string) []columsDefinition { - var query string = fmt.Sprintf("SELECT COLUMN_NAME, COLUMN_TYPE, COLUMN_DEFAULT, IS_NULLABLE, EXTRA, CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=\"%s\" AND TABLE_NAME=\"%s\";", dbConfig.Database, table) - var rows *sql.Rows = executeQuery(query) + var rows *sql.Rows = executeQuery("SELECT COLUMN_NAME, COLUMN_TYPE, COLUMN_DEFAULT, IS_NULLABLE, EXTRA, CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=? AND TABLE_NAME=?;", dbConfig.Database, table) var columns []columsDefinition = make([]columsDefinition, 0) if rows != nil { defer rows.Close() @@ -364,9 +361,7 @@ func fetchIndexes() []indexDefinition { // Add PRIMARY : ALTER TABLE ADD CONSTRAINT PRIMARY KEY(); // Add UNIQUE : ALTER TABLE
ADD CONSTRAINT UNIQUE(); - var query string = fmt.Sprintf("SELECT S.COLUMN_NAME as COLUMN_NAME, S.INDEX_NAME AS INDEX_NAME, TC.CONSTRAINT_TYPE AS CONSTRAINT_TYPE, S.TABLE_NAME AS TABLE_NAME FROM information_schema.STATISTICS as S INNER JOIN information_schema.TABLE_CONSTRAINTS as TC ON TC.TABLE_SCHEMA = S.TABLE_SCHEMA AND TC.CONSTRAINT_NAME = S.INDEX_NAME AND TC.TABLE_NAME = S.TABLE_NAME WHERE S.TABLE_SCHEMA = \"%s\" AND TC.CONSTRAINT_TYPE IN(\"UNIQUE\", \"PRIMARY KEY\");", dbConfig.Database) - fmt.Println(query) - var rows *sql.Rows = executeQuery(query) + var rows *sql.Rows = executeQuery("SELECT S.COLUMN_NAME as COLUMN_NAME, S.INDEX_NAME AS INDEX_NAME, TC.CONSTRAINT_TYPE AS CONSTRAINT_TYPE, S.TABLE_NAME AS TABLE_NAME FROM information_schema.STATISTICS as S INNER JOIN information_schema.TABLE_CONSTRAINTS as TC ON TC.TABLE_SCHEMA = S.TABLE_SCHEMA AND TC.CONSTRAINT_NAME = S.INDEX_NAME AND TC.TABLE_NAME = S.TABLE_NAME WHERE S.TABLE_SCHEMA = ? AND TC.CONSTRAINT_TYPE IN(\"UNIQUE\", \"PRIMARY KEY\");", dbConfig.Database) var indexes []indexDefinition = make([]indexDefinition, 0) if rows != nil { defer rows.Close() @@ -393,20 +388,26 @@ func fetchForeignKeys() []foreignKeyDefinition { // ADD ALTER TABLE
ADD CONSTRAINT FOREIGN KEY() REFERENCES () ON DELETE UPDATE ; // SELECT RC.CONSTRAINT_NAME as CONTRAINT_NAME, KCU.TABLE_NAME, KCU.COLUMN_NAME, KCU.REFERENCED_TABLE_NAME, KCU.REFERENCED_COLUMN_NAME, RC.UPDATE_RULE, RC.DELETE_RULE FROM REFERENTIAL_CONSTRAINTS AS RC INNER JOIN KEY_COLUMN_USAGE AS KCU ON KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME WHERE KCU.TABLE_SCHEMA = "RPG"; - var query string = fmt.Sprintf("SELECT INDEX_NAME, COLUMN_NAME FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=\"%s\";", dbConfig.Database) - var rows *sql.Rows = executeQuery(query) - var fk []foreignKeyDefinition = make([]foreignKeyDefinition, 0) + var rows *sql.Rows = executeQuery("SELECT RC.CONSTRAINT_NAME as CONTRAINT_NAME, KCU.TABLE_NAME, KCU.COLUMN_NAME, KCU.REFERENCED_TABLE_NAME, KCU.REFERENCED_COLUMN_NAME, RC.UPDATE_RULE, RC.DELETE_RULE FROM information_schema.REFERENTIAL_CONSTRAINTS AS RC INNER JOIN information_schema.KEY_COLUMN_USAGE AS KCU ON KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME WHERE KCU.TABLE_SCHEMA = ?;", dbConfig.Database) + var foreignKeys []foreignKeyDefinition = make([]foreignKeyDefinition, 0) if rows != nil { defer rows.Close() for rows.Next() { - var resName string - rows.Scan(&resName) - fk = append(fk, foreignKeyDefinition{ - Name: resName, - }) + var resName, resTable, resColumn, resRefTable, resRefColumn, resUpdate, resDelete string + rows.Scan(&resName, &resTable, &resColumn, &resRefTable, &resRefColumn, &resUpdate, &resDelete) + var fk foreignKeyDefinition = foreignKeyDefinition{ + Name: resName, + Table: resTable, + ColumnName: resColumn, + PointingToTable: resRefTable, + PointingToColumn: resRefColumn, + UpdateRule: resUpdate, + DeleteRule: resDelete, + } + foreignKeys = append(foreignKeys, fk) } } - return fk + return foreignKeys } func initDatabaseStructure() { @@ -414,26 +415,26 @@ func initDatabaseStructure() { fetchIndexes() fetchForeignKeys() + log.Println("Tables :") var tables []string = fetchTables() - for i := range tables { var columns []columsDefinition = fetchColumns(tables[i]) - fmt.Printf("Table %s : \n", tables[i]) + log.Printf(" - Table %s : \n", tables[i]) for j := range columns { - fmt.Printf(" - Column %s %s IsNullable:%t Default:%s Extra:%s Charset:%s/%s\n", + log.Printf(" - Column %s %s IsNullable:%t Default:%s Extra:%s Charset:%s/%s\n", columns[j].Name, columns[j].Type, columns[j].IsNullable, columns[j].Default, columns[j].Extra, columns[j].Charset, columns[j].Collation) } } + log.Println("Indexes :") var indexes []indexDefinition = fetchIndexes() - for i := range indexes { - fmt.Printf("Index %s : \n", indexes[i]) + log.Printf(" - Index %s\n", indexes[i]) } - var fk []foreignKeyDefinition = fetchForeignKeys() - - for i := range fk { - fmt.Printf("Foreign key %s : \n", fk[i]) + log.Println("Foreign keys :") + var foreignKeys []foreignKeyDefinition = fetchForeignKeys() + for i := range foreignKeys { + log.Printf(" - Foreign key %s\n", foreignKeys[i]) } } diff --git a/src/profiler/profiler.go b/src/profiler/profiler.go index a60dac2..183d7fc 100644 --- a/src/profiler/profiler.go +++ b/src/profiler/profiler.go @@ -121,6 +121,10 @@ func Get(entry string) Data { profile.RUnlock() + if data.count == 0 { + data.min = 0 + } + return data }