Files
uzdb/internal/database/manager.go
loveuer 9874561410 refactor: Flatten directory structure
Move project files from uzdb/ subdirectory to root directory for cleaner project structure.

Changes:
- Move frontend/ to root
- Move internal/ to root
- Move build/ to root
- Move all config files (go.mod, wails.json, etc.) to root
- Remove redundant uzdb/ subdirectory nesting

Project structure is now:
├── frontend/        # React application
├── internal/        # Go backend
├── build/           # Wails build assets
├── doc/             # Design documentation
├── main.go          # Entry point
└── ...

🤖 Generated with Qoder
2026-04-04 07:14:00 -07:00

138 lines
3.3 KiB
Go

package database
import (
"database/sql"
"fmt"
"sync"
"go.uber.org/zap"
"uzdb/internal/config"
"uzdb/internal/models"
)
// ConnectionManager manages database connections for different database types
type ConnectionManager struct {
connections map[string]DatabaseConnector
mu sync.RWMutex
}
// DatabaseConnector is the interface for all database connections
type DatabaseConnector interface {
GetDB() *sql.DB
Close() error
IsConnected() bool
ExecuteQuery(sql string, args ...interface{}) (*models.QueryResult, error)
ExecuteStatement(sql string, args ...interface{}) (*models.QueryResult, error)
GetTables(schema string) ([]models.Table, error)
GetTableStructure(tableName string) (*models.TableStructure, error)
GetMetadata() (*models.DBMetadata, error)
}
// NewConnectionManager creates a new connection manager
func NewConnectionManager() *ConnectionManager {
return &ConnectionManager{
connections: make(map[string]DatabaseConnector),
}
}
// GetConnection gets or creates a connection for a user connection config
func (m *ConnectionManager) GetConnection(conn *models.UserConnection, password string) (DatabaseConnector, error) {
m.mu.Lock()
defer m.mu.Unlock()
// Check if connection already exists
if existing, ok := m.connections[conn.ID]; ok {
if existing.IsConnected() {
return existing, nil
}
// Connection is dead, remove it
existing.Close()
delete(m.connections, conn.ID)
}
// Create new connection based on type
var connector DatabaseConnector
var err error
switch conn.Type {
case models.ConnectionTypeMySQL:
connector, err = NewMySQLConnection(conn, password)
case models.ConnectionTypePostgreSQL:
connector, err = NewPostgreSQLConnection(conn, password)
case models.ConnectionTypeSQLite:
connector, err = NewSQLiteConnection(conn)
default:
return nil, fmt.Errorf("unsupported database type: %s", conn.Type)
}
if err != nil {
return nil, err
}
m.connections[conn.ID] = connector
config.GetLogger().Info("connection created in manager",
zap.String("connection_id", conn.ID),
zap.String("type", string(conn.Type)),
)
return connector, nil
}
// RemoveConnection removes a connection from the manager
func (m *ConnectionManager) RemoveConnection(connectionID string) error {
m.mu.Lock()
defer m.mu.Unlock()
if conn, ok := m.connections[connectionID]; ok {
if err := conn.Close(); err != nil {
return err
}
delete(m.connections, connectionID)
config.GetLogger().Info("connection removed from manager",
zap.String("connection_id", connectionID),
)
}
return nil
}
// GetAllConnections returns all managed connections
func (m *ConnectionManager) GetAllConnections() map[string]DatabaseConnector {
m.mu.RLock()
defer m.mu.RUnlock()
result := make(map[string]DatabaseConnector)
for k, v := range m.connections {
result[k] = v
}
return result
}
// CloseAll closes all managed connections
func (m *ConnectionManager) CloseAll() error {
m.mu.Lock()
defer m.mu.Unlock()
var lastErr error
for id, conn := range m.connections {
if err := conn.Close(); err != nil {
lastErr = err
config.GetLogger().Error("failed to close connection",
zap.String("connection_id", id),
zap.Error(err),
)
}
}
m.connections = make(map[string]DatabaseConnector)
if lastErr != nil {
return lastErr
}
config.GetLogger().Info("all connections closed")
return nil
}