From 89ea4b96302263165a8539d25aaf5ea3e274eb0a Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Tue, 13 Aug 2024 10:07:15 +0200 Subject: [PATCH] Implement saving to db --- main.go | 83 +++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 66 insertions(+), 17 deletions(-) diff --git a/main.go b/main.go index d14446c..4547795 100644 --- a/main.go +++ b/main.go @@ -32,6 +32,10 @@ func init() { } const projectsFile = `C:\Users\Administrator\Seafile\VSCode\Code\User\globalStorage\state.vscdb` +const ( + TABLE = "ItemTable" + KEY = "history.recentlyOpenedPathsList" +) var scanFolders []string = []string{ `C:\Users\Administrator\Seafile\Projects-Clion\ClionProjects`, @@ -75,17 +79,11 @@ func main() { continue } file.Close() - - // escaped := url.QueryEscape(relevantPath) - // escaped = strings.ReplaceAll(escaped, "%2F", "/") - // escaped = strings.ReplaceAll(escaped, "+", "%20") - // escaped = "file:///" + escaped - // log.Printf("%#v", escaped) } log.Printf("Cleaned %d invalid entries, %d valid entries remain", cleaned, len(cleanConfig)) added := 0 - for _, folder := range scanFolders { + for _, folder := range scanFolders[:0] { files, err := os.ReadDir(folder) if err != nil { log.Printf("Error reading folder %s: %v", folder, err) @@ -109,6 +107,19 @@ func main() { } } log.Printf("Added %d new entries from scan folders, now %d total", added, len(cleanConfig)) + + originalFormat := Config{ + Entries: make([]Entry, 0, len(cleanConfig)), + } + for _, entry := range cleanConfig { + originalFormat.Entries = append(originalFormat.Entries, *entry) + } + escapedConfig := EscapeConfig(originalFormat) + err = WriteDBConfig(escapedConfig) + if err != nil { + Error.Printf("Failed to write config: %v", err) + return + } } func ReadDBConfig() (Config, error) { @@ -118,7 +129,7 @@ func ReadDBConfig() (Config, error) { return res, err } - row := conn.QueryRow(`SELECT * FROM ItemTable WHERE key = 'history.recentlyOpenedPathsList'`) + row := conn.QueryRow(fmt.Sprintf("SELECT * FROM %s WHERE key = '%s'", TABLE, KEY)) var key string var value string @@ -137,28 +148,66 @@ func ReadDBConfig() (Config, error) { func CleanConfig(config Config) map[string]*Entry { var res = make(map[string]*Entry) for _, entry := range config.Entries { + entry.FileURI = UnescapePath(entry.FileURI) + entry.FolderURI = UnescapePath(entry.FolderURI) + relevantPath := entry.FileURI if relevantPath == "" { relevantPath = entry.FolderURI } - relevantPath = strings.TrimPrefix(relevantPath, "file://") - relevantPath = strings.TrimPrefix(relevantPath, "/") - decoded, err := url.QueryUnescape(relevantPath) - if err != nil { - Error.Printf("Error decoding URI %s: %v", relevantPath, err) - continue - } - relevantPath = path.Clean(decoded) res[relevantPath] = &entry } return res } +func UnescapePath(input string) string { + if input == "" { + return input + } + input = strings.TrimPrefix(input, "file:///") + // For some reason QueryUnescape does not handle : + input = strings.ReplaceAll(input, "%3A", ":") + decoded, err := url.QueryUnescape(input) + if err != nil { + Error.Printf("Error decoding URI %s: %v", input, err) + return input + } + input = path.Clean(decoded) + return input +} +func EscapeConfig(config Config) Config { + for idx, entry := range config.Entries { + config.Entries[idx].FolderURI = EscapePath(entry.FolderURI) + config.Entries[idx].FileURI = EscapePath(entry.FileURI) + } + return config +} +func EscapePath(input string) string { + if input == "" { + return input + } + input = strings.TrimPrefix(input, "file:///") + escaped := url.QueryEscape(input) + escaped = strings.ReplaceAll(escaped, "%2F", "/") + escaped = strings.ReplaceAll(escaped, "%5C", "/") + escaped = strings.ReplaceAll(escaped, "+", "%20") + escaped = "file:///" + escaped + return escaped +} func WriteDBConfig(config Config) error { + parsedConfig, err := json.Marshal(EscapeConfig(config)) + if err != nil { + return err + } + conn, err := sql.Open("sqlite3", projectsFile) if err != nil { return err } - log.Printf("%#v", conn) + + _, err = conn.Exec(fmt.Sprintf("UPDATE %s SET value = ? WHERE key = '%s'", TABLE, KEY), string(parsedConfig)) + if err != nil { + return err + } return nil }