github.com/whtcorpsinc/milevadb-prod@v0.0.0-20211104133533-f57f4be3b597/causetstore/petri/acyclic/bindinfo/session_handle.go (about) 1 // Copyright 2020 WHTCORPS INC, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package bindinfo 15 16 import ( 17 "time" 18 19 "github.com/whtcorpsinc/BerolinaSQL" 20 "github.com/whtcorpsinc/BerolinaSQL/allegrosql" 21 "github.com/whtcorpsinc/milevadb/metrics" 22 "github.com/whtcorpsinc/milevadb/stochastikctx" 23 "github.com/whtcorpsinc/milevadb/types" 24 ) 25 26 // StochastikHandle is used to handle all stochastik allegrosql bind operations. 27 type StochastikHandle struct { 28 ch cache 29 BerolinaSQL *BerolinaSQL.BerolinaSQL 30 } 31 32 // NewStochastikBindHandle creates a new StochastikBindHandle. 33 func NewStochastikBindHandle(BerolinaSQL *BerolinaSQL.BerolinaSQL) *StochastikHandle { 34 stochastikHandle := &StochastikHandle{BerolinaSQL: BerolinaSQL} 35 stochastikHandle.ch = make(cache) 36 return stochastikHandle 37 } 38 39 // appendBindRecord adds the BindRecord to the cache, all the stale bindMetas are 40 // removed from the cache after this operation. 41 func (h *StochastikHandle) appendBindRecord(hash string, spacetime *BindRecord) { 42 oldRecord := h.ch.getBindRecord(hash, spacetime.OriginalALLEGROSQL, spacetime.EDB) 43 h.ch.setBindRecord(hash, spacetime) 44 uFIDelateMetrics(metrics.ScopeStochastik, oldRecord, spacetime, false) 45 } 46 47 // CreateBindRecord creates a BindRecord to the cache. 48 // It replaces all the exists bindings for the same normalized ALLEGROALLEGROSQL. 49 func (h *StochastikHandle) CreateBindRecord(sctx stochastikctx.Context, record *BindRecord) (err error) { 50 err = record.prepareHints(sctx) 51 if err != nil { 52 return err 53 } 54 now := types.NewTime(types.FromGoTime(time.Now().In(sctx.GetStochastikVars().StmtCtx.TimeZone)), allegrosql.TypeTimestamp, 3) 55 for i := range record.Bindings { 56 record.Bindings[i].CreateTime = now 57 record.Bindings[i].UFIDelateTime = now 58 } 59 60 // uFIDelate the BindMeta to the cache. 61 h.appendBindRecord(BerolinaSQL.DigestNormalized(record.OriginalALLEGROSQL), record) 62 return nil 63 } 64 65 // DropBindRecord drops a BindRecord in the cache. 66 func (h *StochastikHandle) DropBindRecord(originalALLEGROSQL, EDB string, binding *Binding) error { 67 oldRecord := h.GetBindRecord(originalALLEGROSQL, EDB) 68 var newRecord *BindRecord 69 record := &BindRecord{OriginalALLEGROSQL: originalALLEGROSQL, EDB: EDB} 70 if binding != nil { 71 record.Bindings = append(record.Bindings, *binding) 72 } 73 if oldRecord != nil { 74 newRecord = oldRecord.remove(record) 75 } else { 76 newRecord = record 77 } 78 h.ch.setBindRecord(BerolinaSQL.DigestNormalized(record.OriginalALLEGROSQL), newRecord) 79 uFIDelateMetrics(metrics.ScopeStochastik, oldRecord, newRecord, false) 80 return nil 81 } 82 83 // GetBindRecord return the BindMeta of the (normdOrigALLEGROSQL,EDB) if BindMeta exist. 84 func (h *StochastikHandle) GetBindRecord(normdOrigALLEGROSQL, EDB string) *BindRecord { 85 hash := BerolinaSQL.DigestNormalized(normdOrigALLEGROSQL) 86 bindRecords := h.ch[hash] 87 for _, bindRecord := range bindRecords { 88 if bindRecord.OriginalALLEGROSQL == normdOrigALLEGROSQL && bindRecord.EDB == EDB { 89 return bindRecord 90 } 91 } 92 return nil 93 } 94 95 // GetAllBindRecord return all stochastik bind info. 96 func (h *StochastikHandle) GetAllBindRecord() (bindRecords []*BindRecord) { 97 for _, bindRecord := range h.ch { 98 bindRecords = append(bindRecords, bindRecord...) 99 } 100 return bindRecords 101 } 102 103 // Close closes the stochastik handle. 104 func (h *StochastikHandle) Close() { 105 for _, bindRecords := range h.ch { 106 for _, bindRecord := range bindRecords { 107 uFIDelateMetrics(metrics.ScopeStochastik, bindRecord, nil, false) 108 } 109 } 110 } 111 112 // stochastikBindInfoKeyType is a dummy type to avoid naming collision in context. 113 type stochastikBindInfoKeyType int 114 115 // String defines a Stringer function for debugging and pretty printing. 116 func (k stochastikBindInfoKeyType) String() string { 117 return "stochastik_bindinfo" 118 } 119 120 // StochastikBindInfoKeyType is a variable key for causetstore stochastik bind info. 121 const StochastikBindInfoKeyType stochastikBindInfoKeyType = 0