reauth.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. /*
  2. Before you execute the program, Launch `cqlsh` and execute:
  3. create keyspace example with replication = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };
  4. create table example.tweet(timeline text, id UUID, text text, PRIMARY KEY(id));
  5. create index on example.tweet(timeline);
  6. */
  7. package main
  8. import (
  9. "os"
  10. //"fmt"
  11. "flag"
  12. // "strconv"
  13. "strings"
  14. "git.wecise.com/wecise/odbserver/odb/test"
  15. "gitee.com/wecisecode/util/logger"
  16. )
  17. var domain map[string][]string
  18. var stat *PrepareStatement
  19. var qstat *PrepareStatement
  20. var ccache map[string]string //key is class+tag==>path
  21. func main() {
  22. logger.SetConsole(true)
  23. logger.SetLevel(logger.INFO)
  24. keyspace := flag.String("keyspace", "matrix", "keyspace")
  25. flag.Parse()
  26. var err error
  27. option := &Option{Cache: CacheAll, Keyspace: *keyspace, DisableInitialHostLookup: true}
  28. g, err := test.NewG(option)
  29. if err != nil {
  30. logger.Error(err.Error())
  31. } else {
  32. defer g.Close()
  33. }
  34. rst, _, err := g.Query(`select name, id, tadd, tdelete, tedit, tlist from /matrix/group limit -1`, &QueryMeta{Return: ReturnAll, MinAsteriskField: false, KeepClassID: false})
  35. if err != nil {
  36. logger.Error(err.Error())
  37. os.Exit(2)
  38. }
  39. stat, err = g.Prepare(`update /matrix/group set tadd = ?, tdelete = ?, tedit = ?, tlist = ? where id = ?`)
  40. if err != nil {
  41. logger.Error(err.Error())
  42. os.Exit(2)
  43. }
  44. qstat, err = g.Prepare(`select path from /matrix/tagdir where domain in ? and name=?`)
  45. if err != nil {
  46. logger.Error(err.Error())
  47. os.Exit(2)
  48. }
  49. ccache = map[string]string{}
  50. domain = map[string][]string{}
  51. if rows, _, err := g.Query("SELECT mclass, name FROM /matrix/system/domain"); err != nil {
  52. logger.Error(err.Error())
  53. os.Exit(2)
  54. } else {
  55. for _, row := range rows {
  56. name := row["name"].(string)
  57. class := row["mclass"].(string)
  58. if cc, ok := domain[class]; ok {
  59. cc = append(cc, name)
  60. domain[class] = cc
  61. } else {
  62. domain[class] = []string{name}
  63. }
  64. }
  65. }
  66. for _, row := range rst {
  67. name := row["name"].(string)
  68. logger.Infof("######### %s #########", name)
  69. id := row["id"].(string)
  70. var tadd, tdelete, tedit, tlist map[string]string
  71. if val := row["tadd"]; val != nil {
  72. tadd = val.(map[string]string)
  73. }
  74. if val := row["tdelete"]; val != nil {
  75. tdelete = val.(map[string]string)
  76. }
  77. if val := row["tedit"]; val != nil {
  78. tedit = val.(map[string]string)
  79. }
  80. if val := row["tlist"]; val != nil {
  81. tlist = val.(map[string]string)
  82. }
  83. convert(g, stat, id, tadd, tdelete, tedit, tlist)
  84. }
  85. }
  86. func convert(g *Gutil, stat *PrepareStatement, id string, tadd, tdelete, tedit, tlist map[string]string) {
  87. add := convertmap(g, tadd)
  88. delete := convertmap(g, tdelete)
  89. edit := convertmap(g, tedit)
  90. list := convertmap(g, tlist)
  91. if true {
  92. if _, _, err := stat.Exec(add, delete, edit, list, id); err != nil {
  93. logger.Error(err.Error())
  94. }
  95. }
  96. }
  97. func convertmap(g *Gutil, v map[string]string) map[string]string {
  98. n := map[string]string{}
  99. for cls, s := range v {
  100. exps := []string{}
  101. ss := strings.Split(s, ",")
  102. for _, sss := range ss {
  103. if sss != "" {
  104. tags := strings.Split(sss, "+")
  105. if len(tags) == 1 { // no+
  106. if full, ok := ccache[cls+"/"+sss]; ok {
  107. exps = append(exps, full)
  108. } else {
  109. full = fullclass(g, cls, sss)
  110. exps = append(exps, full)
  111. ccache[cls+"/"+sss] = full
  112. }
  113. } else {
  114. comp := []string{}
  115. for _, tag := range tags {
  116. if full, ok := ccache[cls+"/"+tag]; ok {
  117. comp = append(comp, full)
  118. } else {
  119. full := fullclass(g, cls, tag)
  120. comp = append(comp, full)
  121. ccache[cls+"/"+tag] = full
  122. }
  123. }
  124. switch len(comp) {
  125. case 0:
  126. case 1:
  127. exps = append(exps, comp[0])
  128. default:
  129. exps = append(exps, strings.Join(comp, "+"))
  130. }
  131. }
  132. }
  133. }
  134. switch len(exps) {
  135. case 0:
  136. case 1:
  137. n[cls] = exps[0]
  138. default:
  139. n[cls] = strings.Join(exps, ",")
  140. }
  141. }
  142. return n
  143. }
  144. func fullclass(g *Gutil, cls, v string) string {
  145. if idx := strings.Index(v, "/"); idx != -1 {
  146. return v
  147. } else {
  148. if ds, ok := domain[cls]; !ok {
  149. logger.Warnf("not find domain for %s", cls)
  150. } else {
  151. if rst, _, err := qstat.Exec(ds, v); err != nil {
  152. logger.Warnf("can't find domain: %v, tag: %s, err: %v", ds, v, err)
  153. } else {
  154. if len(rst) > 0 {
  155. logger.Infof("find tag: %s => %s in domian %v", v, rst[0]["path"].(string), ds)
  156. return rst[0]["path"].(string)
  157. } else {
  158. logger.Warnf("can't find tag: %s in domian: %v", v, ds)
  159. }
  160. }
  161. }
  162. }
  163. return v
  164. }