4 @link: http://hierarchical-cluster-engine.com/ 5 @copyright: Copyright © 2013-2014 IOIX Ukraine 6 @license: http://hierarchical-cluster-engine.com/license/ 31 FIELD_NAME_URLS =
"urls" 32 FIELD_NAME_PROPERTIES =
"properties" 33 FIELD_NAME_FILTERS =
"filters" 39 def __init__(self, dcSiteTemplate, keyValueDefaultFile, keyValueStorageDir, dBDataTask, dcStatTemplates,
40 dcLogTemplate, dcAttrTemplate, tasksManager=None):
64 if not self.
isSiteExist(site.id, queryCallback, site.userId):
65 self.
addSite(site, queryCallback)
75 {
'PRIMARY KEY':
'KEY'})
90 response.statuses.append(site.id)
92 logger.debug(
">>> Was some sql error while SITE_NEW operation start SiteDelete/rollback")
94 response =
GeneralResponse(Constants.TASK_SQL_ERR, Constants.TASK_SQL_ERR_MSG)
95 response.statuses.append(
None)
97 response =
GeneralResponse(Constants.TASK_DUPLICATE_ERR, Constants.TASK_DUPLICATE_ERR_MSG)
98 response.statuses.append(
None)
108 fields, values = Constants.getFieldsValuesTuple(site, Constants.siteDict)
109 fieldValueString = Constants.createFieldsValuesString(fields, values)
110 if len(fieldValueString) > 0:
111 query = Constants.INSERT_COMMON_TEMPLATE % (
"sites", fieldValueString)
112 queryCallback(query, Constants.PRIMARY_DB_ID)
122 if site.filters
is not None:
123 for localFilter
in site.filters:
124 if localFilter
is not None:
126 if localFilter.uDate
is not None:
127 localUDate = str(localFilter.uDate)
128 query = (Constants.SITE_FILTER_SQL_TEMPLATE %
129 (Utils.escape(str(localFilter.siteId)), Utils.escape(str(localFilter.pattern)),
130 Utils.escape(str(localFilter.subject)), str(localFilter.opCode),
131 str(localFilter.stage), str(localFilter.action), localUDate, str(localFilter.type),
132 str(localFilter.mode), str(localFilter.state), str(localFilter.groupId)))
133 queryCallback(query, Constants.PRIMARY_DB_ID)
142 if site.filters
is not None:
143 for localFilter
in site.filters:
144 if localFilter
is not None:
145 localUDate =
"`UDate`" 146 if localFilter.uDate
is not None:
147 localUDate =
"'" + str(localFilter.uDate) +
"'" 148 query = (Constants.SITE_FILTER_SQL_UPDATE %
149 (Utils.escape(str(localFilter.pattern)), Utils.escape(str(localFilter.subject)),
150 str(localFilter.opCode), str(localFilter.stage),
151 str(localFilter.action), localUDate, str(localFilter.groupId),
152 Utils.escape(str(localFilter.siteId)),
153 str(localFilter.type), str(localFilter.mode), str(localFilter.state)))
154 queryCallback(query, Constants.PRIMARY_DB_ID)
164 if isinstance(site.properties, dict):
165 if isinstance(site.properties[field], list):
166 if site.properties[field][0]
is not None:
167 localDict[
"siteId"] = str(site.properties[field][0])
169 localDict[
"siteId"] = site.id
170 localDict[
"name"] = str(field)
171 if site.properties[field][1]
is not None:
172 localDict[
"value"] = str(site.properties[field][1])
173 if site.properties[field][2]
is not None:
174 localDict[
"urlMd5"] = str(site.properties[field][2])
176 localDict[
"siteId"] = site.id
177 localDict[
"name"] = str(field)
178 localDict[
"value"] = str(site.properties[field])
179 elif isinstance(site.properties, list)
and isinstance(field, dict):
182 if "uDate" in localDict
and localDict[
"uDate"]
is not None:
184 logger.debug(
"!!! localDict[\"uDate\"] has ISO format datetime: " + str(localDict[
"uDate"]))
185 localDict[
"uDate"] =
"'" + str(localDict[
"uDate"]) +
"'" 187 logger.debug(
"!!! localDict[\"uDate\"] has not ISO format datetime: " + str(localDict[
"uDate"]))
190 if "cDate" in localDict
and localDict[
"cDate"]
is not None:
192 logger.debug(
"!!! localDict[\"cDate\"] has ISO format datetime: " + str(localDict[
"cDate"]))
193 localDict[
"cDate"] =
"'" + str(localDict[
"cDate"]) +
"'" 195 logger.debug(
"!!! localDict[\"cDate\"] has not ISO format datetime: " + str(localDict[
"cDate"]))
208 if isinstance(dateValue, basestring):
212 except Exception, err:
213 logger.debug(
"value '" + str(dateValue) +
"' has not ISO format, try parse error: " + str(err))
223 if site.properties
is not None:
226 for field
in site.properties:
227 if field
is not None:
230 fields, values = Constants.getFieldsValuesTuple(localDict, Constants.propDict)
231 if len(fields) > 0
and len(fields) == len(values):
232 fieldValueString = Constants.createFieldsValuesString(fields, values)
233 query = Constants.INSERT_COMMON_TEMPLATE % (
"sites_properties", fieldValueString)
234 queryCallback(query, Constants.PRIMARY_DB_ID)
242 if site.properties
is not None:
245 for field
in site.properties:
246 if field
is not None:
249 if "siteId" in localDict
and localDict[
"siteId"]
is not None and "name" in localDict
and \
250 localDict[
"name"]
is not None:
251 fields, values = Constants.getFieldsValuesTuple(localDict, Constants.propDict)
252 if len(fields) > 0
and len(fields) == len(values):
253 fieldValueString = Constants.createFieldsValuesString(fields, values)
254 query = Constants.SITE_PROP_SQL_UPDATE % (fieldValueString, localDict[
"siteId"], localDict[
"name"])
255 queryCallback(query, Constants.PRIMARY_DB_ID)
257 logger.debug(
"Site.Properties \"SiteId\" or \"name\" fields are empty")
265 for urlObject
in site.urls:
266 if urlObject
is not None:
267 fields, values = Constants.getFieldsValuesTuple(urlObject, Constants.SiteURLTableDitct)
268 fieldValueString = Constants.createFieldsValuesString(fields, values)
269 query = Constants.SITE_URL_SQL_TEMPLATE % fieldValueString
270 queryCallback(query, Constants.PRIMARY_DB_ID, Constants.EXEC_INDEX,
True)
279 urlMd5Defined =
False 280 for urlObject
in site.urls:
282 if urlObject
is not None:
283 if urlObject.url
is not None:
284 urlMd5 = hashlib.md5(urlObject.url).hexdigest()
288 if urlObject.urlMd5
is not None and urlObject.url
is not None:
289 query = str(Constants.SITE_URL_SQL_SELECT_COUNT +
"`URL`='%s' AND `URLMd5`<>'%s'") % \
290 (Utils.escape(urlObject.url), urlObject.urlMd5)
291 r = queryCallback(query, Constants.PRIMARY_DB_ID)
292 if r
is None or (len(r) > 0)
and len(r[0]) > 0
and r[0][0] > 0:
293 logger.error(
"Root URL '%s' already exists in dc_sites.sites_urls!", str(urlObject.url))
295 if urlObject.url
is not None and urlObject.urlMd5
is None:
296 urlMd5Defined =
False 297 urlObject.urlMd5 = urlMd5
298 elif urlObject.urlMd5
is not None:
301 urlMd5Defined =
False 302 fields, values = Constants.getFieldsValuesTuple(urlObject, Constants.SiteURLTableDitct)
303 fieldValueString = Constants.createFieldsValuesString(fields, values)
304 if urlMd5Defined
is False and urlObject.url
is not None:
305 query = str(Constants.SITE_URL_SQL_UPDATE +
" AND `URL`='%s'") % (fieldValueString, site.id, urlObject.url)
306 elif urlMd5Defined
is True:
307 query = str(Constants.SITE_URL_SQL_UPDATE +
" AND `URLMd5`='%s'") % (fieldValueString, site.id,
311 if query
is not None:
312 queryCallback(query, Constants.PRIMARY_DB_ID)
314 logger.error(
'No url or urlMd5 value in urlObject, update query not created!\n%s' + str(urlObject))
316 if urlMd5Defined
and urlObject.url
is not None and urlMd5 != urlObject.urlMd5:
317 query = (Constants.SITE_URL_SQL_UPDATE +
"AND `URL`='%s'") % (
'URLMd5="' + str(urlMd5) +
'"', site.id,
318 Utils.escape(urlObject.url))
319 logger.debug(
'Update old URLMd5 with new: %s for site: %s, url: %s, query: %s', urlMd5, str(site.id),
320 urlObject.url, str(query))
321 queryCallback(query, Constants.PRIMARY_DB_ID)
322 except Exception, err:
323 logger.error(
"Error: %s, query:%s, urlMd5Defined: %s, urlObject.url: %s", str(err), str(query),
324 str(urlMd5Defined), str(urlObject.url))
325 logger.error(Utils.getTracebackInfo())
327 self.
statisticLogUpdate(site, urlObject.urlMd5, site.id, urlObject.status, queryCallback)
335 for urlObject
in site.urls:
336 urlMD5 = hashlib.md5(urlObject.url).hexdigest()
337 StatisticLogManager.addNewRecord(queryCallback, site.id, urlMD5)
339 localURLObject = copy.copy(urlObject)
340 localURLObject.siteId = site.id
341 if site.urlType
is not None:
342 localURLObject.type = site.urlType
343 if site.requestDelay
is not None:
344 localURLObject.requestDelay = site.requestDelay
345 if site.httpTimeout
is not None:
346 localURLObject.httpTimeout = site.httpTimeout
347 localURLObject.urlMd5 = urlMD5
348 DC_SITE_URL_SQL_TEMPLATE =
"INSERT IGNORE INTO `%s` SET %s" 349 fields, values = Constants.getFieldsValuesTuple(localURLObject, Constants.URLTableDict)
350 fieldValueString = Constants.createFieldsValuesString(fields, values)
351 query = DC_SITE_URL_SQL_TEMPLATE % ((DC_URLS_TABLE_NAME_TEMPLATE % site.id), fieldValueString)
353 DC_SITE_URL_SQL_TEMPLATE = (
"INSERT IGNORE INTO `%s` SET `Site_Id`='%s', `URL`='%s', `URLMD5`='%s'")
354 query = DC_SITE_URL_SQL_TEMPLATE % ((DC_URLS_TABLE_NAME_TEMPLATE % site.id), site.id,
355 MySQLdb.escape_string(urlObject.url), urlMD5)
356 queryCallback(query, Constants.SECONDARY_DB_ID)
368 if replaceDic
is None:
370 fTemplate = open(template).read()
371 for rFrom
in replaceDic:
372 fTemplate = fTemplate.replace(rFrom, replaceDic[rFrom])
373 query = fTemplate.replace(
"%SITE_ID%", str(site.id))
374 queryCallback(query, dbId)
375 except Exception, err:
376 logger.error(
"DB error: %s\nquery: %s", str(err), template)
409 SITE_CRITERION_TEMPLATE =
"SELECT `Id` FROM `sites`" 411 if additionWhere
is not None and additionWhere !=
"":
412 query = SITE_CRITERION_TEMPLATE + additionWhere
413 result = queryCallback(query, Constants.PRIMARY_DB_ID)
414 if hasattr(result,
'__iter__'):
415 ret = [elem[0]
for elem
in result]
def isSiteExist(self, siteId, queryCallback, userId=None)
def updateSiteURLSites(self, site, queryCallback)
def __init__(self, dcSiteTemplate, keyValueDefaultFile, keyValueStorageDir, dBDataTask, dcStatTemplates, dcLogTemplate, dcAttrTemplate, tasksManager=None)
def addSiteURLSites(self, site, queryCallback)
GeneralResponse event object, represents general state response for multipurpose usage.
def generateCriterionSQL(criterions, additionWhere=None, siteId=None)
def siteDelete(self, site, queryCallback)
def addSitesFilter(self, site, queryCallback)
def execSiteCriterions(criterions, queryCallback)
def createPropDict(self, field, site)
def statisticLogUpdate(self, localObj, urlMd5, siteId, status, queryCallback, isInsert=False)
def isIsoFormatDate(self, dateValue)
def addSiteURLURLs(self, site, queryCallback)
def updateSitesFilter(self, site, queryCallback)
def updateSiteProperties(self, site, queryCallback)
def addSite(self, site, queryCallback)
def addSiteProperties(self, site, queryCallback)
def addSiteInKVDB(self, site, queryCallback)
def createTableFromTemplate(self, site, template, dbId, queryCallback, replaceDic=None)
def process(self, site, queryCallback)