def commit(serverUrl=None,method_name=None,componentID=None): global lastCall # all other methods that access the database can do that # with their own private sessions and hence connect imediately # to the database. Commit is different since if it fails all # updates in the queues must fail (rollback). last_session=Session.current_session try: Session.connect('ProdMgr') Session.start_transaction('ProdMgr') if (serverUrl==None) or (method_name==None) or (componentID==None): serverUrl,method_name,componentID=lastCall sqlStr="""UPDATE ws_last_call SET call_state="result_retrieved" WHERE server_url="%s" AND component_id="%s" AND service_call="%s"; """ %(serverUrl,componentID,method_name) Session.execute(sqlStr) Session.commit() Session.close() Session.set_session(last_session) except Exception,ex: Session.rollback() Session.close() Session.set_session(last_session) raise ProdAgentException("Service commit Error: "+str(ex))
def logCall(serverUrl,method_name,args,componentID="defaultComponent",tag="0"): global lastCall last_session=Session.current_session try: Session.connect('ProdMgr') Session.start_transaction('ProdMgr') sqlStr="""INSERT INTO ws_last_call(server_url,component_id,service_call,service_parameters,call_state,tag) VALUES("%s","%s","%s","%s","%s","%s") ON DUPLICATE KEY UPDATE service_parameters="%s", call_state="%s", tag="%s"; """ %(serverUrl,componentID,method_name,base64.encodestring(cPickle.dumps(args)),"call_placed",str(tag),base64.encodestring(cPickle.dumps(args)),"call_placed",tag) Session.execute(sqlStr) Session.commit() lastCall=(serverUrl,method_name,componentID) Session.close() Session.set_session(last_session) except Exception,ex: Session.rollback() Session.close() Session.set_session(last_session) raise ProdAgentException("Service logging Error: "+str(ex))
def retrieve(serverURL=None,method_name=None,componentID=None): last_session=Session.current_session try: Session.connect('ProdMgr') Session.start_transaction('ProdMgr') #NOTE: we do several nested queries and assume that the query engine can rewrite them #NOTE: we should rewrite these queries ourselves. if serverURL==None and method_name==None and componentID==None: sqlStr="""SELECT server_url,service_call,component_id,tag FROM ws_last_call WHERE call_state="call_placed" AND id in ( SELECT max(id) FROM ws_last_call WHERE call_state="call_placed" AND log_time IN ( SELECT max(log_time) FROM ws_last_call WHERE call_state="call_placed" GROUP BY server_url) GROUP BY server_url); """ elif serverURL==None and method_name==None and componentID!=None: sqlStr="""SELECT server_url,service_call,component_id,tag FROM ws_last_call WHERE component_id="%s" AND call_state="call_placed" AND id in ( SELECT max(id) FROM ws_last_call WHERE component_id="%s" AND call_state="call_placed" AND log_time IN ( SELECT max(log_time) FROM ws_last_call WHERE component_id="%s" AND call_state="call_placed" GROUP BY server_url) GROUP BY server_url); """ %(componentID,componentID,componentID) elif serverURL==None and method_name!=None and componentID!=None: sqlStr="""SELECT server_url,service_call,component_id,tag FROM ws_last_call WHERE component_id="%s" AND service_call="%s" AND call_state="call_placed" AND id in ( SELECT max(id) FROM ws_last_call WHERE component_id="%s" AND service_call="%s" AND call_state="call_placed" AND log_time IN ( SELECT max(log_time) FROM ws_last_call WHERE component_id="%s" AND service_call="%s" AND call_state="call_placed" GROUP BY server_url) GROUP BY server_url; """ %(componentID,method_name,componentID,method_name,componentID,method_name) elif serverURL!=None and method_name==None and componentID!=None: sqlStr="""SELECT server_url,service_call,component_id,tag FROM ws_last_call WHERE component_id="%s" AND server_url="%s" AND call_state="call_placed" AND id in ( SELECT max(id) FROM ws_last_call WHERE component_id="%s" AND server_url="%s" AND call_state="call_placed" AND log_time IN ( SELECT max(log_time) FROM ws_last_call WHERE component_id="%s" AND server_url="%s" AND call_state="call_placed" GROUP BY server_url) GROUP BY server_url); """ %(componentID,serverURL,componentID,serverURL,componentID,serverURL) elif serverURL!=None and method_name!=None and componentID!=None: sqlStr="""SELECT server_url,service_call,component_id,tag FROM ws_last_call WHERE component_id="%s" AND server_url="%s" AND call_state="call_placed" AND service_call="%s" """ %(componentID,serverURL,method_name) dbCur.execute(sqlStr) rows=dbCur.fetchall() if len(rows)==0: raise ProdAgentException("No result in local last service call table with componentID :"+\ str(componentID),3000) server_url=rows[0][0] service_call=rows[0][1] component_id=rows[0][2] tag=rows[0][3] Session.execute(sqlStr) Session.commit() Session.close() Session.set_session(last_session) return [server_url,service_call,component_id,tag] except ProdAgentException: Session.rollback() Session.close() Session.set_session(last_session) raise except Exception,ex: Session.rollback() Session.close() Session.set_session(last_session) raise ProdAgentException("Service commit Error: "+str(ex),3001)