HCE Project Python language Distributed Tasks Manager Application, Distributed Crawler Application and client API bindings.  2.0.0-chaika
Hierarchical Cluster Engine Python language binding
SQLCustomTask.py
Go to the documentation of this file.
1 """
2 @package: dc_db
3 @file SQLCustomTask.py
4 @author Alexander Vybornyh <alexander.hce.cluster@gmail.com>
5 @link: http://hierarchical-cluster-engine.com/
6 @copyright: Copyright &copy; 2013-2016 IOIX Ukraine
7 @license: http://hierarchical-cluster-engine.com/license/
8 @since: 0.1
9 """
10 
11 import dbi.EventObjects
12 import app.Utils as Utils # pylint: disable=F0401
13 from dc_db.BaseTask import BaseTask
14 import dc_db.Constants as Constants
15 
16 logger = Utils.MPLogger().getLogger()
17 
18 
19 # #process SQLCustomTask task
21 
22  # #constructor
23  #
24  def __init__(self):
25  super(SQLCustomTask, self).__init__()
26 
27 
28  # #make all necessary actions to makes sql custom request
29  #
30  # @param sqlRequest - instance of CustomRequest class
31  # @param queryCallback - function for queries execution
32  # @param bdResolveFunc - pointer to resolve DB external function
33  # @return CustomResponse instance
34  def process(self, sqlRequest, queryCallback, bdResolveFunc):
35  # variable for result
36  ret = dbi.EventObjects.CustomResponse(sqlRequest.rid, sqlRequest.query, sqlRequest.dbName)
37  try:
38  logger.debug("!!! SQL Custom request: %s", str(sqlRequest.query))
39 
40  if sqlRequest is None:
41  raise Exception("Error: request object is None")
42 
43  if sqlRequest.query is None or \
44  (not isinstance(sqlRequest.query, basestring) and not isinstance(sqlRequest.query, list)):
45  raise Exception("Error: wrong type of sql request param (%s)", str(type(sqlRequest)))
46 
47  if isinstance(sqlRequest.query, basestring) and sqlRequest.query == "":
48  raise Exception("Error: sql request is empty string")
49 
50  if isinstance(sqlRequest.query, list) and len(sqlRequest.query) == 0:
51  raise Exception("Error: input list of sql requests is empty")
52 
53  if sqlRequest.dbName is None or \
54  not isinstance(sqlRequest.dbName, basestring) or \
55  sqlRequest.dbName == "":
56  raise Exception("Error: wrong database name '%s'", str(sqlRequest.dbName))
57 
58  dbIndex = bdResolveFunc(sqlRequest.dbName)
59  if dbIndex is None:
60  raise Exception("Error: there isn't '%s' database connection", str(sqlRequest.dbName))
61 
62  isSingleQuery = True
63  if isinstance(sqlRequest.query, basestring):
64  queries = [sqlRequest.query]
65  else:
66  queries = sqlRequest.query
67  isSingleQuery = False
68 
69  results = []
70  for query in queries:
71  # execute single request
72  if sqlRequest.includeFieldsNames == dbi.EventObjects.CustomRequest.SQL_BY_INDEX:
73  res = queryCallback(query, dbIndex)
74  elif sqlRequest.includeFieldsNames == dbi.EventObjects.CustomRequest.SQL_BY_NAME:
75  res = queryCallback(query, dbIndex, Constants.EXEC_NAME)
76 
77  if res is None:
78  raise Exception("Error: wrong SQL request '%s'", str(query))
79 
80  # success execution
81  results.append(res)
82 
83 # logger.debug("!!! SQL Custom results: '%s' ", Utils.varDump(results))
84  if isSingleQuery and len(results) > 0:
85  ret.result = results[0]
86  else:
87  ret.result = results
88 
89  except Exception, err:
90  ret.errString = str(err)
91  logger.debug("!!! SQL Custom request: %s", str(err))
92 
93  return ret
def process(self, sqlRequest, queryCallback, bdResolveFunc)