123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- package dbmanager
- import (
- "database/sql"
- "encoding/json"
- "fmt"
- "github.com/google/uuid"
- _ "github.com/mattn/go-sqlite3" // SQLite driver
- )
- type SQLiteManager struct {
- db *sql.DB
- }
- // NewSQLiteManager initializes a new SQLiteManager
- func NewSQLiteManager(dataSourceName string) (*SQLiteManager, error) {
- db, err := sql.Open("sqlite3", dataSourceName)
- if err != nil {
- return nil, fmt.Errorf("failed to connect to SQLite database: %w", err)
- }
- // Enable foreign key constraints
- _, err = db.Exec("PRAGMA foreign_keys = ON;")
- if err != nil {
- return nil, fmt.Errorf("failed to enable foreign keys: %w", err)
- }
- return &SQLiteManager{db: db}, nil
- }
- // Connect establishes a connection to the SQLite database
- func (m *SQLiteManager) Connect() error {
- // No action needed for SQLite
- return nil
- }
- // Disconnect closes the connection to the SQLite database
- func (m *SQLiteManager) Disconnect() error {
- return m.db.Close()
- }
- // Create inserts a new record into the specified table
- func (m *SQLiteManager) Create(table string, data interface{}) error {
- jsonData, err := json.Marshal(data)
- if err != nil {
- return fmt.Errorf("failed to marshal data: %w", err)
- }
- id := uuid.New().String()
- query := fmt.Sprintf("INSERT INTO %s (id, data) VALUES (?, ?)", table)
- _, err = m.db.Exec(query, id, jsonData)
- if err != nil {
- return fmt.Errorf("failed to insert data into table %s: %w", table, err)
- }
- return nil
- }
- // GetByID retrieves a record by ID from the specified table
- func (m *SQLiteManager) GetByID(table string, id string) (interface{}, error) {
- query := fmt.Sprintf("SELECT data FROM %s WHERE id = ?", table)
- row := m.db.QueryRow(query, id)
- var jsonData string
- if err := row.Scan(&jsonData); err != nil {
- if err == sql.ErrNoRows {
- return nil, nil // No record found
- }
- return nil, fmt.Errorf("failed to retrieve data from table %s: %w", table, err)
- }
- var result map[string]interface{}
- if err := json.Unmarshal([]byte(jsonData), &result); err != nil {
- return nil, fmt.Errorf("failed to unmarshal data: %w", err)
- }
- return result, nil
- }
- // Update updates an existing record in the specified table
- func (m *SQLiteManager) Update(table string, data interface{}) error {
- jsonData, err := json.Marshal(data)
- if err != nil {
- return fmt.Errorf("failed to marshal data: %w", err)
- }
- // Assuming the data contains an "id" field
- id := data.(map[string]interface{})["id"]
- query := fmt.Sprintf("UPDATE %s SET data = ? WHERE id = ?", table)
- _, err = m.db.Exec(query, jsonData, id)
- if err != nil {
- return fmt.Errorf("failed to update data in table %s: %w", table, err)
- }
- return nil
- }
- // Delete removes a record by ID from the specified table
- func (m *SQLiteManager) Delete(table string, id string) error {
- query := fmt.Sprintf("DELETE FROM %s WHERE id = ?", table)
- _, err := m.db.Exec(query, id)
- if err != nil {
- return fmt.Errorf("failed to delete data from table %s: %w", table, err)
- }
- return nil
- }
- // List retrieves all records from the specified table
- func (m *SQLiteManager) List(table string, filter map[string]interface{}) ([]interface{}, error) {
- query := fmt.Sprintf("SELECT data FROM %s", table)
- rows, err := m.db.Query(query)
- if err != nil {
- return nil, fmt.Errorf("failed to list data from table %s: %w", table, err)
- }
- defer rows.Close()
- var results []interface{}
- for rows.Next() {
- var jsonData string
- if err := rows.Scan(&jsonData); err != nil {
- return nil, fmt.Errorf("failed to scan row: %w", err)
- }
- var result map[string]interface{}
- if err := json.Unmarshal([]byte(jsonData), &result); err != nil {
- return nil, fmt.Errorf("failed to unmarshal data: %w", err)
- }
- results = append(results, result)
- }
- return results, nil
- }
- // Exec executes a raw SQL query
- func (m *SQLiteManager) Exec(query string, args ...interface{}) (interface{}, error) {
- result, err := m.db.Exec(query, args...)
- if err != nil {
- return nil, fmt.Errorf("failed to execute query: %w", err)
- }
- return result, nil
- }
- // Query executes a raw SQL query and returns the rows
- func (m *SQLiteManager) Query(query string, args ...interface{}) (*sql.Rows, error) {
- rows, err := m.db.Query(query, args...)
- if err != nil {
- return nil, fmt.Errorf("failed to execute query: %w", err)
- }
- return rows, nil
- }
- // Close closes the database connection
- func (m *SQLiteManager) Close() error {
- return m.db.Close()
- }
|