ATLAS Offline Software
Loading...
Searching...
No Matches
python.TrigConfFrontier.FrontierCursor Class Reference
Inheritance diagram for python.TrigConfFrontier.FrontierCursor:
Collaboration diagram for python.TrigConfFrontier.FrontierCursor:

Public Types

typedef HLT::TypeInformation::for_each_type_c< typenameEDMLIST::map, my_functor, my_result<>, my_arg< HLT::TypeInformation::get_cont, CONTAINER > >::type result

Public Member Functions

 __init__ (self, urls, schema, refreshFlag=False, doDecode=True, retrieveZiplevel="zip", encoding="utf-8")
 __str__ (self)
 execute (self, query, bindvars={})
 fetchall (self)
 checkResultForErrors (self)
 decodeResult (self)

Public Attributes

list urls = [str(x) + "/Frontier" for x in urls]
 schema = schema
 refreshFlag = refreshFlag
 retrieveZiplevel = retrieveZiplevel
self.decodeResult() doDecode = doDecode
 encoding = encoding

Detailed Description

Definition at line 62 of file TrigConfFrontier.py.

Member Typedef Documentation

◆ result

Definition at line 90 of file EDM_MasterSearch.h.

Constructor & Destructor Documentation

◆ __init__()

python.TrigConfFrontier.FrontierCursor.__init__ ( self,
urls,
schema,
refreshFlag = False,
doDecode = True,
retrieveZiplevel = "zip",
encoding = "utf-8" )

Definition at line 63 of file TrigConfFrontier.py.

63 def __init__(self, urls, schema, refreshFlag=False, doDecode=True, retrieveZiplevel="zip", encoding="utf-8"):
64 self.urls = [str(x) + "/Frontier" for x in urls]#Add /Frontier to each URL
65 self.schema = schema
66 self.refreshFlag = refreshFlag
67 self.retrieveZiplevel = retrieveZiplevel
68 self.doDecode = doDecode
69 self.encoding = encoding
70

Member Function Documentation

◆ __str__()

python.TrigConfFrontier.FrontierCursor.__str__ ( self)

Definition at line 71 of file TrigConfFrontier.py.

71 def __str__(self):
72 s = "Using Frontier URL: %s\n" % self.urls
73 s += "Schema: %s\n" % self.schema
74 s += "Refresh cache: %s" % self.refreshFlag
75 return s
76

◆ checkResultForErrors()

python.TrigConfFrontier.FrontierCursor.checkResultForErrors ( self)
Parse the response, looking for errors 

Definition at line 130 of file TrigConfFrontier.py.

130 def checkResultForErrors(self):
131 ''' Parse the response, looking for errors '''
132 from xml.dom.minidom import parseString
133 dom = parseString(self.result)
134
135 globalError = dom.getElementsByTagName("global_error")
136 for node in globalError:
137 raise Exception(node.getAttribute("msg"))
138
139 qualityList = dom.getElementsByTagName("quality")
140 for node in qualityList:
141 if int(node.getAttribute("error")) > 0:
142 raise Exception(node.getAttribute("message"))
143

◆ decodeResult()

python.TrigConfFrontier.FrontierCursor.decodeResult ( self)

Definition at line 144 of file TrigConfFrontier.py.

144 def decodeResult(self):
145 from xml.dom.minidom import parseString
146 import base64, zlib, curses.ascii, re
147 #print ("Query result:\n", self.result)
148 dom = parseString(self.result)
149 dataList = dom.getElementsByTagName("data")
150 keepalives = 0
151 result = []
152 # Control characters represent records, but I won't bother with that now,
153 # and will simply replace those by space.
154 for data in dataList:
155 for node in data.childNodes:
156 # <keepalive /> elements may be present, combined with whitespace text
157 if node.nodeName == "keepalive":
158 # this is of type Element
159 keepalives += 1
160 continue
161 # else assume of type Text
162 if node.data.strip() == "":
163 continue
164 if keepalives > 0:
165 print (keepalives, "keepalives received\n")
166 keepalives = 0
167
168 row = base64.decodebytes(node.data.encode())
169 if self.retrieveZiplevel != "":
170 row = zlib.decompress(row).decode("ISO-8859-1")
171
172 #Hack to get these lines to work in python 2
173 if sys.version_info[0] < 3:
174 row = row.encode('ascii', 'xmlcharrefreplace')
175
176 endFirstRow = row.find('\x07')
177 firstRow = row[:endFirstRow]
178 for c in firstRow:
179 if curses.ascii.isctrl(c):
180 firstRow = firstRow.replace(c, ' ')
181 fields = [x for i,x in enumerate(firstRow.split()) if i%2==0]
182 types = [x for i,x in enumerate(firstRow.split()) if i%2==1]
183 ptypes = []
184 for _f,t in zip(fields, types):
185 if t.startswith("NUMBER"):
186 if _f in ["HPR_VALUE", "L1CI_GLOBAL_JET_SCALE", "L1CI_GLOBAL_EM_SCALE"]: # float columns in run 2 DB if ",0" in t:
187 ptypes.append(float)
188 else:
189 ptypes.append(int)
190 else:
191 ptypes.append(str)
192
193
194 log.debug("Fields : %r", fields)
195 log.debug("DB Types : %r", types)
196 log.debug("Python Types: %r", ptypes)
197
198 row = row[endFirstRow+1:]
199
200 row_h = row.rstrip('\x07')
201
202 if 'BLOB' in types:
203 row_h = re.sub("^.*?{","{",row_h)
204
205 row_h = row_h.replace("\x07\x06",'.nNn.\x06')
206
207 # pattern = re.compile("\x06\x00\x00\x00.",flags=re.S)
208 #replace pattern above more restrictive version, as longerstrings in the results
209 #have a size variable in the column separate that becomes visible if the string
210 #is large enough - this then broke the prevous decoding
211 pattern = re.compile("\x06\x00\x00..",flags=re.S)
212 row_h = pattern.sub('.xXx.',row_h)
213 row_h = row_h.replace("\x86", '.xXx.')
214
215 row_h = row_h.split('.nNn.')
216 row_h = [r.split('.xXx.') for r in row_h]
217
218 result = []
219 for r in row_h:
220 if r[0]=='': r[0:1]=[]
221 r = tuple([t(v) for t,v in zip(ptypes,r)])
222 result.append( r )
223
224 self.result = result
225
226
227

◆ execute()

python.TrigConfFrontier.FrontierCursor.execute ( self,
query,
bindvars = {} )

Definition at line 77 of file TrigConfFrontier.py.

77 def execute(self, query, bindvars={}):
78 if len(bindvars)>0:
79 query = replacebindvars(query,bindvars)
80
81
82 log.debug("Frontier URLs : %s", self.urls)
83 log.debug("Refresh cache : %s", self.refreshFlag)
84 log.debug("Query : %s", query)
85
86 import base64, zlib, urllib.request, urllib.error, urllib.parse
87
88 self.result = None
89
90 for url in self.urls:
91 try:
92 compQuery = zlib.compress(query.encode("utf-8"),9)
93 base64Query = base64.binascii.b2a_base64(compQuery).decode("utf-8")
94 encQuery = base64Query.replace("+", ".").replace("\n","").replace("/","-").replace("=","_")
95 log.debug("Frontier Request : %s", encQuery)
96 frontierRequest="%s/type=frontier_request:1:DEFAULT&encoding=BLOB%s&p1=%s" % (url, self.retrieveZiplevel, encQuery)
97 request = urllib.request.Request(frontierRequest)
98 if self.refreshFlag:
99 request.add_header("pragma", "no-cache")
100
101 frontierId = "TrigConfFrontier 1.0"
102 request.add_header("X-Frontier-Id", frontierId)
103
104 queryStart = time.localtime()
105 log.debug("Query started: %s", time.strftime("%m/%d/%y %H:%M:%S %Z", queryStart))
106
107 t1 = time.time()
108 result = urllib.request.urlopen(request,timeout=10).read().decode('utf-8')
109 t2 = time.time()
110
111 queryEnd = time.localtime()
112 log.debug("Query ended: %s", time.strftime("%m/%d/%y %H:%M:%S %Z", queryEnd))
113 log.debug("Query time: %s [seconds]", (t2-t1))
114 log.debug("Result size: %i [seconds]", len(result))
115 self.result = result
116 self.checkResultForErrors()
117 return
118 except urllib.error.HTTPError:
119 log.warning("Problem with Frontier connection to %s trying next server", url)
120 except Exception as err:
121 log.warning("Problem with the request {0}".format(err))
122
123 raise Exception("All servers failed")
124
125
std::string replace(std::string s, const std::string &s2, const std::string &s3)
Definition hcg.cxx:310
IovVectorMap_t read(const Folder &theFolder, const SelectionCriterion &choice, const unsigned int limit=10)

◆ fetchall()

python.TrigConfFrontier.FrontierCursor.fetchall ( self)

Definition at line 126 of file TrigConfFrontier.py.

126 def fetchall(self):
127 if self.doDecode: self.decodeResult()
128 return self.result
129

Member Data Documentation

◆ doDecode

self.decodeResult() python.TrigConfFrontier.FrontierCursor.doDecode = doDecode

Definition at line 68 of file TrigConfFrontier.py.

◆ encoding

python.TrigConfFrontier.FrontierCursor.encoding = encoding

Definition at line 69 of file TrigConfFrontier.py.

◆ refreshFlag

python.TrigConfFrontier.FrontierCursor.refreshFlag = refreshFlag

Definition at line 66 of file TrigConfFrontier.py.

◆ retrieveZiplevel

python.TrigConfFrontier.FrontierCursor.retrieveZiplevel = retrieveZiplevel

Definition at line 67 of file TrigConfFrontier.py.

◆ schema

python.TrigConfFrontier.FrontierCursor.schema = schema

Definition at line 65 of file TrigConfFrontier.py.

◆ urls

python.TrigConfFrontier.FrontierCursor.urls = [str(x) + "/Frontier" for x in urls]

Definition at line 64 of file TrigConfFrontier.py.


The documentation for this class was generated from the following file: