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
upgrade-helper.py
Go to the documentation of this file.
1 #!/usr/bin/python
2 
3 
4 """
5 HCE project, Python bindings, Distributed Tasks Manager application.
6 Upgrade-helper content main functional for group operation for upgrade MySQL database
7 
8 @package: dc_processor
9 @file upgrade-helper.py
10 @author Alexander Vybornyh <alexander.hce.cluster@gmail.com>
11 @link: http://hierarchical-cluster-engine.com/
12 @copyright: Copyright &copy; 2013-2016 IOIX Ukraine
13 @license: http://hierarchical-cluster-engine.com/license/
14 @since: 0.1
15 """
16 
17 
18 import ppath
19 from ppath import sys
20 
21 import os
22 import sys
23 import copy
24 from cement.core import foundation
25 import app.Consts as APP_CONSTS
26 import ConfigParser
27 from dc_crawler.DBTasksWrapper import DBTasksWrapper
28 from app.Utils import varDump
29 from curses.ascii import isalpha
30 import app.Utils as Utils
31 import logging
32 import dc_crawler
33 
34 APP_NAME = 'upgrade-helper'
35 
36 
45 
46 # #Get cmd parameters
47 #
48 # @param - None
49 # @return dbName, fileName, configName - extrcated from cmd line
51  app = foundation.CementApp(APP_NAME)
52  app.setup()
53  app.add_arg('-d', '--db', action='store', metavar='use_database_name_for_show_tables', help='use database name for getting site_id')
54  app.add_arg('-p', '--ptn', action='store', metavar='part_table_name', help='part of table_name')
55  app.add_arg('-t', '--tdb', action='store', metavar='use_database_name_for_execution', help='use database name for execution')
56  app.add_arg('-f', '--file', action='store', metavar='input_file_name', help='input file name with sql request')
57  app.add_arg('-c', '--config', action='store', metavar='config_file_name', help='config ini-file', required=True)
58  app.run()
59 
60  dbName = app.pargs.db
61  partTableName = app.pargs.ptn
62  tdbName = app.pargs.tdb
63  fileName = app.pargs.file
64  configName = app.pargs.config
65 
66  return dbName, partTableName, tdbName, fileName, configName
67 
68 
69 # # Get db task wrapper
70 #
71 # @param configName - config file name
72 # @return wrapper instance
73 def getDBTasksWrapper(configName):
74  # variable for result value
75  wrapper = None
76  try:
77  config = ConfigParser.ConfigParser()
78  config.optionxform = str
79 
80  readOk = config.read(configName)
81  if len(readOk) == 0:
82  raise Exception("Wrong config file name '" + str(configName) + "'")
83 
84  wrapper = DBTasksWrapper(config)
85  except Exception, err:
86  raise Exception('Get DBTaskWrapper: ' + str(err))
87 
88  return wrapper
89 
90 
91 # #Get table name list
92 #
93 # @param response - response after sql request
94 # @param oldTableNamePart - mandatory part of old table names
95 # @param newTableNamePart - mandatory part of new table names
96 # @return list of names
97 def getTableNamesList(response, oldTableNamePart, newTableNamePart):
98  result = []
99  if isinstance(response, tuple):
100  for elem in response:
101  if len(elem) > 0:
102  if elem[0].find(oldTableNamePart) > -1:
103  name = copy.deepcopy(elem[0])
104  name = name.replace(oldTableNamePart, newTableNamePart)
105  result.append(name)
106 
107  return result
108 
109 
110 # #Extract request
111 #
112 # @param fileName - input file name for extract
113 # @return request, tableNamePart
114 def extractRequest(fileName):
115  rawRequest = ''
116  tableNamePart = ''
117 
118  f = open(fileName, 'r')
119  rawRequest = f.read()
120  f.close()
121 
122  words = rawRequest.split()
123  for word in words:
124  if word.count('%') > 1:
125  tableNamePart = word[:word.find('%')]
126  break
127 
128  for elem in tableNamePart:
129  if isalpha(elem):
130  tableNamePart = tableNamePart[tableNamePart.find(elem):]
131  break
132 
133  return rawRequest, tableNamePart
134 
135 
136 # #Make SQL request
137 #
138 # @param rawRequest - raw request
139 # @param tableName - table name
140 # @param tableNamePart - part of table name
141 # @return SQL request
142 def makeSql(rawRequest, tableName, tableNamePart):
143  sql = ''
144  words = []
145  for word in rawRequest.split():
146  if word.find(tableNamePart) > -1:
147  words.append(tableName)
148  else:
149  words.append(word)
150 
151  sql = ' '.join(words)
152 
153  return sql
154 
155 
156 if __name__ == '__main__':
157  exit_code = APP_CONSTS.EXIT_SUCCESS
158  try:
159  dbName, partTableName, tdbName, fileName, configName = getCmdParams()
160  wrapper = getDBTasksWrapper(configName)
161 
162  if wrapper is not None:
163  sql = 'SHOW TABLES;'
164  response = wrapper.customRequest(sql, dbName)
165  rawRequest, tableNamePart = extractRequest(fileName)
166  tableNames = getTableNamesList(response, partTableName, tableNamePart)
167 
168  dc_crawler.DBTasksWrapper.logger.addHandler(logging.NullHandler())
169  for tableName in tableNames:
170  print(tableName)
171  sql = makeSql(rawRequest, tableName, tableNamePart)
172  wrapper.customRequest(sql, tdbName)
173 
174  print('Affected success ' + str(len(tableNames)) + ' rows')
175 
176  except Exception as err:
177  sys.stderr.write(str(err) + '\n')
178  exit_code = APP_CONSTS.EXIT_FAILURE
179  except:
180  exit_code = EXIT_FAILURE
181  finally:
182  sys.stdout.flush()
183  os._exit(exit_code)
def getCmdParams()
# Sample of execution:.
def getDBTasksWrapper(configName)
def getTableNamesList(response, oldTableNamePart, newTableNamePart)
Definition: join.py:1
def extractRequest(fileName)
def makeSql(rawRequest, tableName, tableNamePart)