Skip to content

Commit

Permalink
database update
Browse files Browse the repository at this point in the history
  • Loading branch information
Kaya-Sem committed Feb 12, 2025
1 parent f5d617d commit 828bedb
Show file tree
Hide file tree
Showing 6 changed files with 211 additions and 18 deletions.
158 changes: 158 additions & 0 deletions cmd/:
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
package cmd

import (
"database/sql"
"fmt"
_ "github.com/mattn/go-sqlite3"
"os"
"path/filepath"

"github.com/Kaya-Sem/oopsie"
)

func getDBPath() string {
home := os.Getenv("HOME")

// FIX: not working correctly I think. No need for sudo anyway?

// If running with sudo, get the original user's home
if os.Getenv("SUDO_USER") != "" {
homeDir, err := os.UserHomeDir()
if err == nil {
home = homeDir
}
}

if home == "" {
fmt.Println("Could not determine user home directory")
os.Exit(1)
}

dbDir := filepath.Join(home, databaseDir)
return filepath.Join(dbDir, databaseFile)
}

func getDatabaseConnection() *sql.DB {
err := ensureDB()
if err != nil {
fmt.Print(oopsie.CreateOopsie().Title("Database error").IndicatorMessage("DATABASE").IndicatorColors(oopsie.GREEN, oopsie.BRIGHT_BLACK).Render())
os.Exit(1)
}

path := getDBPath() // Use the correct path now
db, err := sql.Open("sqlite3", path)
if err != nil {
fmt.Printf("Could not open database at %s\n", path)
return nil
}

return db
}

func ensureDB() error {
dbPath := getDBPath()

// Check if the database file exists
_, err := os.Stat(dbPath)
if err == nil {
// File exists, no need to create it
return nil
}

if os.IsNotExist(err) {
// The database file does not exist, create it

// Create necessary directories if they don't exist
dir := filepath.Dir(dbPath)
if err := os.MkdirAll(dir, 0666); err != nil {
return fmt.Errorf("could not create directory for database: %v", err)
}

// Create the empty database file
file, err := os.Create(dbPath)
if err != nil {
return fmt.Errorf("could not create database file: %v", err)
}
defer file.Close()

// Optionally, initialize the database schema after creating the file
fmt.Println("Database file created.")
}

// Ensure that the database schema is initialized
db := getDatabaseConnection()
if db != nil {
defer db.Close()
initialiseDBschema(db)
}

return nil
}

func initialiseDBschema(db *sql.DB) {
sql := `
CREATE TABLE IF NOT EXISTS folders (
inode BIGINT PRIMARY KEY,
path TEXT NOT NULL,
type TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS mounts (
source BIGINT NOT NULL,
target BIGINT NOT NULL,
FOREIGN KEY (source) REFERENCES folders (inode),
FOREIGN KEY (target) REFERENCES folders (inode)
);`

_, err := db.Exec(sql)
if err != nil {
fmt.Printf("Could not initialise schema for database:\n%s\n", err)
}
}

func AddFolder(fi FolderInfo) error {

return nil
}

func addFolderToDatabase(path string, inode int) error {
db := getDatabaseConnection()
if db == nil {
return fmt.Errorf("failed to connect to database")
}

defer db.Close()

return nil
}

func GetTypedFolders(t string) ([]FolderInfo, error) {
db := getDatabaseConnection()
if db == nil {
return nil, fmt.Errorf("failed to connect to database")
}
defer db.Close()

query := `SELECT inode, path FROM folders WHERE type = ?`
rows, err := db.Query(query, t)
if err != nil {
return nil, fmt.Errorf("database query failed: %w", err)
}
defer rows.Close()

var results []FolderInfo

for rows.Next() {
var fileInfo FolderInfo
if err := rows.Scan(&fileInfo.Inode, &fileInfo.FullPath); err != nil {
fmt.Printf("Error scanning row: %v\n", err)
continue
}
results = append(results, fileInfo)
}

if err := rows.Err(); err != nil {
return nil, fmt.Errorf("error iterating over rows: %w", err)
}

return results, nil
}
36 changes: 20 additions & 16 deletions cmd/add.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ package cmd

import (
"fmt"
"golang.org/x/sys/unix"
"log"
"strings"

"golang.org/x/sys/unix"

"github.com/Kaya-Sem/oopsie"
"github.com/spf13/cobra"
)

Expand All @@ -14,8 +16,8 @@ var tags []string
func init() {
addCmd := &cobra.Command{
Use: "add [flags] path",
Short: "Add tags to a file or directory",
Long: `Add one or more tags to a file or directory's semlink xattr data.`,
Short: "Add tags to a directory",
Long: `Add one or more tags to a directory's semlink xattr data.`,
Args: cobra.ExactArgs(1),
Run: runAdd,
}
Expand All @@ -32,13 +34,7 @@ func runAdd(cmd *cobra.Command, args []string) {

path := args[0]

// Load registry
registry, err := loadRegistry()
if err != nil {
log.Fatalf("Failed to load registry: %v", err)
}

ensureType(path)
ensureHasType(path)

existingTags := getSemlinkTags(path)

Expand Down Expand Up @@ -72,18 +68,26 @@ func runAdd(cmd *cobra.Command, args []string) {

inode := stat.Ino

// Update registry
if err := registry.updateFile(inode, path); err != nil {
log.Fatalf("Failed to update registry: %v", err)
// ------- do this in database, not in registry -----

err := addFolderToDatabase(path, int(inode), getSemlinkType(path))
if err != nil {
fmt.Print(oopsie.CreateOopsie().Title("Database error").Error(err).IndicatorMessage("SQL").Render())
}

fmt.Printf("Successfully updated tags for %s\n", path)
fmt.Printf("New tags: %s\n", newTagString)
// -----------------------------

// check if verbose
if verbose {

fmt.Printf("Successfully updated tags for %s\n", path)
fmt.Printf("New tags: %s\n", newTagString)
}

triggerUpdate()
}

func ensureType(path string) {
func ensureHasType(path string) {
folderType := getSemlinkType(path)

if folderType == "" {
Expand Down
26 changes: 26 additions & 0 deletions cmd/sqlite.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,11 +109,37 @@ func initialiseDBschema(db *sql.DB) {
}
}

func AddFolder(fi FolderInfo) error {

return nil
}

func addFolderToDatabase(path string, inode int, folderType string) error {
db := getDatabaseConnection()
if db == nil {
return fmt.Errorf("failed to connect to database")
}

defer db.Close()

query := `INSERT INTO folders (inode, path, type) VALUES(?,?,?)`

rows, err := db.Query(query, inode, path, folderType)
if err != nil {
return fmt.Errorf("Database query failed: %w", err)
}

defer rows.Close()

return nil
}

func GetTypedFolders(t string) ([]FolderInfo, error) {
db := getDatabaseConnection()
if db == nil {
return nil, fmt.Errorf("failed to connect to database")
}

defer db.Close()

query := `SELECT inode, path FROM folders WHERE type = ?`
Expand Down
2 changes: 1 addition & 1 deletion cmd/type.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,6 @@ func listType(t string) {
}

for _, info := range folderInfoList {
fmt.Printf("%d: %s", info.Inode, info.FullPath)
fmt.Printf("[%d] at %s", info.Inode, info.FullPath)
}
}
6 changes: 5 additions & 1 deletion cmd/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,11 @@ type FolderInfo struct {

func triggerUpdate() {

fmt.Printf("\nUpdate triggered!\n")
// check if verbose before printing

if verbose {
fmt.Printf("\n ⚙️Update triggered!\n")
}

/* TODO: before mounting, attempt a repair (system Inode scan) */

Expand Down
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,6 @@ require (
require (
github.com/Kaya-Sem/oopsie v1.0.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/mattn/go-sqlite3 v1.14.24 // indirect
github.com/spf13/pflag v1.0.5 // indirect
)

0 comments on commit 828bedb

Please sign in to comment.