Better Database Queries + fix profiler

dev
POUDEROUX Tom 2025-04-28 22:37:17 +02:00
parent 15deca0a90
commit af1f6352ce
3 changed files with 38 additions and 31 deletions

10
main.go
View File

@ -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()
}

View File

@ -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 <table> ADD CONSTRAINT PRIMARY KEY(<columns>);
// Add UNIQUE : ALTER TABLE <table> ADD CONSTRAINT <constraint_name> UNIQUE(<columns>);
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 <table> ADD CONSTRAINT <constraint_name> FOREIGN KEY(<column>) REFERENCES <ref_table>(<ref_column>) ON DELETE <CASCADE / SET NULL> UPDATE <CASCADE / SET NULL>;
// 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])
}
}

View File

@ -121,6 +121,10 @@ func Get(entry string) Data {
profile.RUnlock()
if data.count == 0 {
data.min = 0
}
return data
}