| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- package mql
- import (
- "fmt"
- "sort"
- "strconv"
- "strings"
- )
- type MQLRequest struct {
- // params
- OriginQueryString string
- FilePath string
- Fromline, Toline, Fromchar, Tochar int
- // init values
- Key string
- StaticActionExprs map[int]*Action
- StaticActions *StaticActions
- FormatedQueryString string
- //
- WaitMQLRequest *MQLRequest // 等待上一语句完成
- }
- type MQLRequestInstance struct {
- *MQLRequest
- PreparedQueryString string
- }
- type MQLGroupRequest struct {
- mqrn int // 一个文件中的mql计数
- mqrs [][]*MQLRequest // 并发MQLRequest序列, mqrs[0]为主序列
- curn int // 当前序列
- }
- func NewMQLGroupRequest() (mqg *MQLGroupRequest) {
- mqg = &MQLGroupRequest{
- mqrn: 0,
- mqrs: [][]*MQLRequest{{}},
- curn: 0,
- }
- return
- }
- func (mqg *MQLGroupRequest) Append(mqr *MQLRequest) error {
- mqr, e := mqr.init(mqg.mqrn + 1)
- if e != nil {
- return e
- }
- if mqr != nil {
- if mqr.StaticActions.ForkName != nil {
- // fork新线程
- if len(mqg.mqrs[0]) > 0 {
- // 等待上一语句完成
- mqr.WaitMQLRequest = mqg.mqrs[0][len(mqg.mqrs[0])-1]
- } else {
- // 第一句就开始fork新线程
- }
- mqg.mqrs = append(mqg.mqrs, []*MQLRequest{})
- mqg.curn = len(mqg.mqrs) - 1
- }
- if mqr.StaticActions.ForkName == nil && mqr.StaticActions.WaitName != nil {
- // 主线程等待指定线程
- mqg.curn = 0
- }
- mqg.mqrs[mqg.curn] = append(mqg.mqrs[mqg.curn], mqr)
- mqg.mqrn++
- }
- return nil
- }
- func (mqr *MQLRequest) init(n int) (*MQLRequest, error) {
- mqr.OriginQueryString = strings.TrimSpace(mqr.OriginQueryString)
- if mqr.OriginQueryString == "" {
- return nil, nil
- }
- mqr.Key = fmt.Sprint(mqr.FilePath, ".", n, "[", mqr.Fromline, "-", mqr.Toline, "]")
- staticactionexprs := map[int]*Action{}
- str := mqr.OriginQueryString
- idxs := refmtvar.FindAllStringSubmatchIndex(str, -1)
- if len(idxs) > 0 {
- nstr := ""
- is := 0
- for _, idx := range idxs {
- if len(idx) == 6 {
- // 标记前内容
- ie := idx[0]
- nstr += str[is:ie]
- nstr += strings.Repeat("_", idx[1]-ie)
- is = idx[1]
- }
- }
- nstr += str[is:]
- str = nstr
- }
- actionexprs, e := getActionExprs(str, staticactionexprs)
- if e != nil {
- return nil, e
- }
- staticactions, e := ToStaticActions(actionexprs)
- if e != nil {
- return nil, e
- }
- if staticactions.Skip {
- return nil, nil
- }
- xmqlstr := ""
- if len(staticactionexprs) == 0 {
- xmqlstr = strings.ReplaceAll(mqr.OriginQueryString, "[", "[[]")
- } else {
- mqlrunes := []rune(mqr.OriginQueryString)
- istart := 0
- keys := []int{}
- for k := range staticactionexprs {
- keys = append(keys, k)
- }
- sort.Ints(keys)
- for _, k := range keys {
- sat := staticactionexprs[k]
- if sat.SourceText != "" {
- xmqlstr += strings.ReplaceAll(string(mqlrunes[istart:sat.SourceFromIndex]), "[", "[[]")
- xmqlstr += "[" + strconv.Itoa(k) + "]"
- istart = sat.SourceToIndex
- }
- }
- xmqlstr += strings.ReplaceAll(string(mqlrunes[istart:]), "[", "[[]")
- }
- mqr.StaticActionExprs = staticactionexprs
- mqr.StaticActions = staticactions
- mqr.FormatedQueryString = xmqlstr
- return mqr, nil
- }
|