Implement saving to db
This commit is contained in:
83
main.go
83
main.go
@@ -32,6 +32,10 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const projectsFile = `C:\Users\Administrator\Seafile\VSCode\Code\User\globalStorage\state.vscdb`
|
const projectsFile = `C:\Users\Administrator\Seafile\VSCode\Code\User\globalStorage\state.vscdb`
|
||||||
|
const (
|
||||||
|
TABLE = "ItemTable"
|
||||||
|
KEY = "history.recentlyOpenedPathsList"
|
||||||
|
)
|
||||||
|
|
||||||
var scanFolders []string = []string{
|
var scanFolders []string = []string{
|
||||||
`C:\Users\Administrator\Seafile\Projects-Clion\ClionProjects`,
|
`C:\Users\Administrator\Seafile\Projects-Clion\ClionProjects`,
|
||||||
@@ -75,17 +79,11 @@ func main() {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
file.Close()
|
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))
|
log.Printf("Cleaned %d invalid entries, %d valid entries remain", cleaned, len(cleanConfig))
|
||||||
|
|
||||||
added := 0
|
added := 0
|
||||||
for _, folder := range scanFolders {
|
for _, folder := range scanFolders[:0] {
|
||||||
files, err := os.ReadDir(folder)
|
files, err := os.ReadDir(folder)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Error reading folder %s: %v", folder, err)
|
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))
|
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) {
|
func ReadDBConfig() (Config, error) {
|
||||||
@@ -118,7 +129,7 @@ func ReadDBConfig() (Config, error) {
|
|||||||
return res, err
|
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 key string
|
||||||
var value string
|
var value string
|
||||||
@@ -137,28 +148,66 @@ func ReadDBConfig() (Config, error) {
|
|||||||
func CleanConfig(config Config) map[string]*Entry {
|
func CleanConfig(config Config) map[string]*Entry {
|
||||||
var res = make(map[string]*Entry)
|
var res = make(map[string]*Entry)
|
||||||
for _, entry := range config.Entries {
|
for _, entry := range config.Entries {
|
||||||
|
entry.FileURI = UnescapePath(entry.FileURI)
|
||||||
|
entry.FolderURI = UnescapePath(entry.FolderURI)
|
||||||
|
|
||||||
relevantPath := entry.FileURI
|
relevantPath := entry.FileURI
|
||||||
if relevantPath == "" {
|
if relevantPath == "" {
|
||||||
relevantPath = entry.FolderURI
|
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
|
res[relevantPath] = &entry
|
||||||
}
|
}
|
||||||
return res
|
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 {
|
func WriteDBConfig(config Config) error {
|
||||||
|
parsedConfig, err := json.Marshal(EscapeConfig(config))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
conn, err := sql.Open("sqlite3", projectsFile)
|
conn, err := sql.Open("sqlite3", projectsFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
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
|
return nil
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user