Better Database Queries + fix profiler
parent
15deca0a90
commit
af1f6352ce
10
main.go
10
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()
|
||||
}
|
||||
|
|
|
@ -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{
|
||||
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])
|
||||
}
|
||||
}
|
||||
|
|
|
@ -121,6 +121,10 @@ func Get(entry string) Data {
|
|||
|
||||
profile.RUnlock()
|
||||
|
||||
if data.count == 0 {
|
||||
data.min = 0
|
||||
}
|
||||
|
||||
return data
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue