package main import ( "encoding/json" "flag" "fmt" "io/ioutil" "log" "os" "strings" "time" "git.wecise.com/wecise/odbserver/odb" "gitee.com/wecisecode/util/logger" ) func main() { log.SetFlags(log.LstdFlags | log.Lshortfile) var keyspace = flag.String("k", "matrix", "Keyspace") var filePath = flag.String("f", "", "Recover file") flag.Parse() logger.SetConsole(false) g, err := odb.New(&odb.Option{Cache: odb.CacheAll, Keyspace: *keyspace}) if err != nil { log.Fatal("New odb error:", err) } var ( mql string oldTagDirs []map[string]interface{} ) if *filePath == "" { mql = `select creater, domain, name, tags from /matrix/tagdir limit -1` oldTagDirs, _, err = g.Query(mql) if err != nil { log.Fatal("Get old tagdir error:", err) } // Export old tagdir b, err := json.MarshalIndent(oldTagDirs, "", " ") if err != nil { log.Fatal(err) } file, err := os.OpenFile("old_tagdir.json", os.O_CREATE|os.O_TRUNC|os.O_RDWR, os.ModePerm) if err != nil { log.Fatal("Create old_tagdir file error:", err) } if _, err = file.Write(b); err != nil { log.Fatal(err) } if _, _, err = g.Query(`delete from /matrix/tagdir with version`); err != nil { log.Fatal(err) } time.Sleep(time.Second) fmt.Println("Drop old tagdir class.") mql = `delete from /matrix/tagdir with version` if _, _, err = g.Query(mql); err != nil { log.Fatal(err) } time.Sleep(time.Second) mql = `drop class /matrix/tagdir` if _, _, err = g.Query(mql); err != nil { log.Fatal(err) } time.Sleep(time.Second) } else { b, err := ioutil.ReadFile(*filePath) if err != nil { log.Fatal(err) } if err = json.Unmarshal(b, &oldTagDirs); err != nil { log.Fatal(err) } } fmt.Println("Create new tagdir class.") mql = `create class if not exists /matrix/tagdir( creater varchar '创建者', domain varchar '目录所属域', name varchar '标签名称', parent varchar '父级目录,/分割的路径', path varchar '标签全名,/分割的路径', keys(creater, domain, name), indexes(creater, domain, name, parent, path) )` if _, _, err = g.Query(mql); err != nil { log.Fatal(err) } time.Sleep(time.Second) mql = `select name from /matrix/tagdir where creater = ? and domain = ? and name = ?` selectPs, err := g.Prepare(mql) if err != nil { log.Fatal(err) } mql = `insert into /matrix/tagdir (creater, domain, name, parent, path, tags) values (?, ?, ?, ?, ?, ?)` insertPs, err := g.Prepare(mql) if err != nil { log.Fatal(err) } fmt.Println("Insert new tagdir data.") for _, ot := range oldTagDirs { creater := ot["creater"].(string) domain := ot["domain"].(string) a := strings.Split(ot["name"].(string), "/") var parent string for _, tag := range a { res, _, err := selectPs.Exec(creater, domain, tag) if err != nil { log.Fatal(err) } if len(res) == 0 { var path string if parent != "" { path = parent + "/" + tag } else { path = tag } if _, _, err = insertPs.Exec(creater, domain, tag, parent, path, strings.Split(path, "/")); err != nil { log.Fatal(err) } fmt.Printf("Insert creater: %s, domain: %s, tag: %s, parent: %s, path: %s, tags: %v \n", creater, domain, tag, parent, path, strings.Split(path, "/")) } if parent == "" { parent = tag } else { parent += "/" + tag } } } }