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
}