156 lines
4.2 KiB
Go

package explorer
import (
"encoding/json"
"fmt"
"time"
"github.com/google/uuid"
"github.com/jmoiron/sqlx"
v3 "go.signoz.io/signoz/pkg/query-service/model/v3"
)
var db *sqlx.DB
type ExplorerQuery struct {
UUID string `json:"uuid" db:"uuid"`
CreatedAt time.Time `json:"created_at" db:"created_at"`
UpdatedAt time.Time `json:"updated_at" db:"updated_at"`
SourcePage string `json:"source_page" db:"source_page"`
// 0 - false, 1 - true
IsView int8 `json:"is_view" db:"is_view"`
Data string `json:"data" db:"data"`
ExtraData string `json:"extra_data" db:"extra_data"`
}
// InitWithDSN sets up setting up the connection pool global variable.
func InitWithDSN(dataSourceName string) (*sqlx.DB, error) {
var err error
db, err = sqlx.Open("sqlite3", dataSourceName)
if err != nil {
return nil, err
}
tableSchema := `CREATE TABLE IF NOT EXISTS explorer_queries (
uuid TEXT PRIMARY KEY,
created_at datetime NOT NULL,
updated_at datetime NOT NULL,
source_page TEXT NOT NULL,
is_view INTEGER NOT NULL,
data TEXT NOT NULL,
extra_data TEXT
);`
_, err = db.Exec(tableSchema)
if err != nil {
return nil, fmt.Errorf("Error in creating explorer queries table: %s", err.Error())
}
return db, nil
}
func InitWithDB(sqlDB *sqlx.DB) {
db = sqlDB
}
func GetQueries() ([]*v3.ExplorerQuery, error) {
var queries []ExplorerQuery
err := db.Select(&queries, "SELECT * FROM explorer_queries")
if err != nil {
return nil, fmt.Errorf("Error in getting explorer queries: %s", err.Error())
}
var explorerQueries []*v3.ExplorerQuery
for _, query := range queries {
var compositeQuery v3.CompositeQuery
err = json.Unmarshal([]byte(query.Data), &compositeQuery)
if err != nil {
return nil, fmt.Errorf("Error in unmarshalling explorer query data: %s", err.Error())
}
explorerQueries = append(explorerQueries, &v3.ExplorerQuery{
UUID: query.UUID,
SourcePage: query.SourcePage,
CompositeQuery: &compositeQuery,
IsView: query.IsView,
ExtraData: query.ExtraData,
})
}
return explorerQueries, nil
}
func CreateQuery(query v3.ExplorerQuery) (string, error) {
data, err := json.Marshal(query.CompositeQuery)
if err != nil {
return "", fmt.Errorf("Error in marshalling explorer query data: %s", err.Error())
}
uuid_ := query.UUID
if uuid_ == "" {
uuid_ = uuid.New().String()
}
createdAt := time.Now()
updatedAt := time.Now()
_, err = db.Exec(
"INSERT INTO explorer_queries (uuid, created_at, updated_at, source_page, is_view, data, extra_data) VALUES (?, ?, ?, ?, ?, ?, ?)",
uuid_,
createdAt,
updatedAt,
query.SourcePage,
query.IsView,
data,
query.ExtraData,
)
if err != nil {
return "", fmt.Errorf("Error in creating explorer query: %s", err.Error())
}
return uuid_, nil
}
func GetQuery(uuid_ string) (*v3.ExplorerQuery, error) {
var query ExplorerQuery
err := db.Get(&query, "SELECT * FROM explorer_queries WHERE uuid = ?", uuid_)
if err != nil {
return nil, fmt.Errorf("Error in getting explorer query: %s", err.Error())
}
var compositeQuery v3.CompositeQuery
err = json.Unmarshal([]byte(query.Data), &compositeQuery)
if err != nil {
return nil, fmt.Errorf("Error in unmarshalling explorer query data: %s", err.Error())
}
return &v3.ExplorerQuery{
UUID: query.UUID,
SourcePage: query.SourcePage,
CompositeQuery: &compositeQuery,
IsView: query.IsView,
ExtraData: query.ExtraData,
}, nil
}
func UpdateQuery(uuid_ string, query v3.ExplorerQuery) error {
data, err := json.Marshal(query.CompositeQuery)
if err != nil {
return fmt.Errorf("Error in marshalling explorer query data: %s", err.Error())
}
updatedAt := time.Now()
_, err = db.Exec("UPDATE explorer_queries SET updated_at = ?, source_page = ?, is_view = ?, data = ?, extra_data = ? WHERE uuid = ?",
updatedAt, query.SourcePage, query.IsView, data, query.ExtraData, uuid_)
if err != nil {
return fmt.Errorf("Error in updating explorer query: %s", err.Error())
}
return nil
}
func DeleteQuery(uuid_ string) error {
_, err := db.Exec("DELETE FROM explorer_queries WHERE uuid = ?", uuid_)
if err != nil {
return fmt.Errorf("Error in deleting explorer query: %s", err.Error())
}
return nil
}