Files
openGauss-OM/script/domain_utils/sql_handler/sql_executor.py
coolany eae422baf3 适配CM组件
Signed-off-by: coolany <kyosang@163.com>

support cgroup

追加合入
2022-03-05 18:51:52 +08:00

155 lines
5.6 KiB
Python

# -*- coding:utf-8 -*-
#############################################################################
# Copyright (c) 2020 Huawei Technologies Co.,Ltd.
#
# openGauss is licensed under Mulan PSL v2.
# You can use this software according to the terms
# and conditions of the Mulan PSL v2.
# You may obtain a copy of Mulan PSL v2 at:
#
# http://license.coscl.org.cn/MulanPSL2
#
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OF ANY KIND,
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
# See the Mulan PSL v2 for more details.
#############################################################################
import json
import os
import sys
from ctypes import cdll, c_char_p, c_void_p, c_int, string_at
from gspylib.common.ErrorCode import ErrorCode
from base_utils.executor.cmd_executor import CmdExecutor
from domain_utils.sql_handler.sql_result import SqlResult
localDirPath = os.path.dirname(os.path.realpath(__file__))
sys.path.insert(0, localDirPath + "/../../../lib")
from base_utils.executor.local_remote_cmd import LocalRemoteCmd
from base_utils.os.cmd_util import CmdUtil
from base_utils.os.file_util import FileUtil
from base_utils.os.env_util import EnvUtil
class SqlExecutor(object):
"""
exceute sql commands
"""
@staticmethod
def excuteSqlOnLocalhost(port, sql, database="postgres"):
'''
function: write output message
input : sql
output: NA
'''
tmpresult = None
conn = None
try:
libpath = os.path.join(EnvUtil.getEnv("GAUSSHOME"), "lib")
sys.path.append(libpath)
libc = cdll.LoadLibrary("libpq.so.5.5")
conn_opts = "dbname = '%s' application_name = 'OM' " \
"options='-c xc_maintenance_mode=on' port = %s " % \
(database, port)
conn_opts = conn_opts.encode(encoding='utf-8')
err_output = ""
libc.PQconnectdb.argtypes = [c_char_p]
libc.PQconnectdb.restype = c_void_p
libc.PQclear.argtypes = [c_void_p]
libc.PQfinish.argtypes = [c_void_p]
libc.PQerrorMessage.argtypes = [c_void_p]
libc.PQerrorMessage.restype = c_char_p
libc.PQresultStatus.argtypes = [c_void_p]
libc.PQresultStatus.restype = c_int
libc.PQexec.argtypes = [c_void_p, c_char_p]
libc.PQexec.restype = c_void_p
conn = libc.PQconnectdb(conn_opts)
if not conn:
raise Exception(ErrorCode.GAUSS_513["GAUSS_51310"]
% ("by options: %s." % conn_opts))
sql = sql.encode(encoding='utf-8')
libc.PQstatus.argtypes = [c_void_p]
if libc.PQstatus(conn) != 0:
raise Exception(ErrorCode.GAUSS_513["GAUSS_51310"] % ".")
tmpresult = libc.PQexec(conn, sql)
if not tmpresult:
raise Exception(ErrorCode.GAUSS_513["GAUSS_51309"] % sql)
status = libc.PQresultStatus(tmpresult)
resultObj = SqlResult(tmpresult)
resultObj.parseResult()
Error = libc.PQerrorMessage(conn)
if Error:
err_output = string_at(Error)
result = resultObj.resSet
libc.PQclear(tmpresult)
libc.PQfinish(conn)
return status, result, err_output
except Exception as e:
libc.PQclear.argtypes = [c_void_p]
libc.PQfinish.argtypes = [c_void_p]
if tmpresult:
libc.PQclear(tmpresult)
if conn:
libc.PQfinish(conn)
raise Exception(str(e))
@staticmethod
def getSQLResult(host_name, json_file):
"""
function: get sql result from json_file
input : host_name,json_file
output: status, result, error_output
"""
# copy json file from remote host
tmp_dir = EnvUtil.getTmpDirFromEnv() + "/"
filepath = os.path.join(tmp_dir, json_file)
scp_cmd = LocalRemoteCmd.getRemoteCopyCmd(
filepath, tmp_dir, host_name, False, "directory")
CmdExecutor.execCommandLocally(scp_cmd)
# parse json file
status = ""
result = []
error_output = ""
(ret, para) = SqlExecutor.check_input(filepath)
if ret != 0:
raise Exception("Error: can not load result data ")
if "status" not in para:
raise Exception("Error: can not get sql execute status")
else:
status = para["status"]
if "result" not in para:
raise Exception("Error: sql execute failed")
else:
result = para["result"]
if "error_output" in para:
error_output = para["error_output"]
# remove json file from remote host and localhost
FileUtil.removeDirectory(filepath)
remote_cmd = CmdUtil.getSshCmd(host_name)
cmd = "%s \"%s '%s'\"" % (remote_cmd, CmdUtil.getRemoveCmd("directory"), filepath)
CmdExecutor.execCommandLocally(cmd)
return status, result, error_output
@staticmethod
def check_input(json_file_path):
"""
function: check the input, and load the backup JSON file.
@param: N/A.
@return: return [OK, para], if the backup JSON file is loaded
successfully.
"""
try:
with open(json_file_path) as json_file:
para = json.load(json_file)
return [0, para]
except TypeError as err:
err_msg = "input para is not json_string. %s" % err
return [1, err_msg]