mql_prepare.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. package odbcmql
  2. import (
  3. "fmt"
  4. "sort"
  5. "strconv"
  6. "strings"
  7. )
  8. type MQLRequest struct {
  9. // params
  10. OriginQueryString string
  11. FilePath string
  12. Fromline, Toline, Fromchar, Tochar int
  13. // init values
  14. Key string
  15. StaticActionExprs map[int]*Action
  16. StaticActions *StaticActions
  17. FormatedQueryString string
  18. //
  19. WaitMQLRequest *MQLRequest // 等待上一语句完成
  20. }
  21. type MQLRequestInstance struct {
  22. *MQLRequest
  23. PreparedQueryString string
  24. }
  25. type MQLGroupRequest struct {
  26. mqrn int // 一个文件中的mql计数
  27. mqrs [][]*MQLRequest // 并发MQLRequest序列, mqrs[0]为主序列
  28. curn int // 当前序列
  29. }
  30. func NewMQLGroupRequest() (mqg *MQLGroupRequest) {
  31. mqg = &MQLGroupRequest{
  32. mqrn: 0,
  33. mqrs: [][]*MQLRequest{{}},
  34. curn: 0,
  35. }
  36. return
  37. }
  38. // 加入请求组,并初始化,提取动作信息
  39. func (mqg *MQLGroupRequest) Append(mqr *MQLRequest) error {
  40. mqr, e := mqr.init(mqg.mqrn + 1)
  41. if e != nil {
  42. return e
  43. }
  44. if mqr != nil {
  45. if mqr.StaticActions.ForkName != nil {
  46. // fork新线程
  47. if len(mqg.mqrs[0]) > 0 {
  48. // 等待上一语句完成
  49. mqr.WaitMQLRequest = mqg.mqrs[0][len(mqg.mqrs[0])-1]
  50. } else {
  51. // 第一句就开始fork新线程
  52. }
  53. mqg.mqrs = append(mqg.mqrs, []*MQLRequest{})
  54. mqg.curn = len(mqg.mqrs) - 1
  55. }
  56. if mqr.StaticActions.ForkName == nil && mqr.StaticActions.WaitName != nil {
  57. // 主线程等待指定线程
  58. mqg.curn = 0
  59. }
  60. mqg.mqrs[mqg.curn] = append(mqg.mqrs[mqg.curn], mqr)
  61. mqg.mqrn++
  62. }
  63. return nil
  64. }
  65. func (mqr *MQLRequest) init(n int) (*MQLRequest, error) {
  66. mqr.OriginQueryString = strings.TrimSpace(mqr.OriginQueryString)
  67. if mqr.OriginQueryString == "" {
  68. return nil, nil
  69. }
  70. mqr.Key = fmt.Sprint(mqr.FilePath, ".", n, "[", mqr.Fromline, "-", mqr.Toline, "]")
  71. staticactionexprs := map[int]*Action{}
  72. str := mqr.OriginQueryString
  73. idxs := refmtvar.FindAllStringSubmatchIndex(str, -1)
  74. if len(idxs) > 0 {
  75. nstr := ""
  76. is := 0
  77. for _, idx := range idxs {
  78. if len(idx) == 6 {
  79. // 标记前内容
  80. ie := idx[0]
  81. nstr += str[is:ie]
  82. nstr += strings.Repeat("0", idx[1]-ie)
  83. is = idx[1]
  84. }
  85. }
  86. nstr += str[is:]
  87. str = nstr
  88. }
  89. actionexprs, e := getActionExprs(str, staticactionexprs)
  90. if e != nil {
  91. return nil, e
  92. }
  93. staticactions, e := ToStaticActions(actionexprs)
  94. if e != nil {
  95. return nil, e
  96. }
  97. if staticactions.Skip {
  98. return nil, nil
  99. }
  100. xmqlstr := ""
  101. if len(staticactionexprs) == 0 {
  102. xmqlstr = strings.ReplaceAll(mqr.OriginQueryString, "[", "[[]")
  103. } else {
  104. mqlrunes := []rune(mqr.OriginQueryString)
  105. istart := 0
  106. keys := []int{}
  107. for k := range staticactionexprs {
  108. keys = append(keys, k)
  109. }
  110. sort.Ints(keys)
  111. for _, k := range keys {
  112. sat := staticactionexprs[k]
  113. if sat.SourceText != "" {
  114. xmqlstr += strings.ReplaceAll(string(mqlrunes[istart:sat.SourceFromIndex]), "[", "[[]")
  115. xmqlstr += "[" + strconv.Itoa(k) + "]"
  116. istart = sat.SourceToIndex
  117. }
  118. }
  119. xmqlstr += strings.ReplaceAll(string(mqlrunes[istart:]), "[", "[[]")
  120. }
  121. mqr.StaticActionExprs = staticactionexprs
  122. mqr.StaticActions = staticactions
  123. mqr.FormatedQueryString = xmqlstr
  124. return mqr, nil
  125. }