# in_query = "Query = SELECT * FROM EMP WHERE EQP_NO = :test1, params = 567"
# 바인딩 쿼리를 입력하여 비인딩 변수 위치를 검색
# 1) 바인딩 start(':') 찾기 -> 2) 바인딩 변수 end 찾기 -> 3) 끝 위치 찾아서 반환
def get_end_index(input_str, start_index) :
end_list = [" ", ",", "+", "-", "/", "*", "=", "%", ">" , "<"]
print("test",input_str, start_index)
# 문자열 for 문으로 출력 -> end 문자 확인하여 길이 리턴
for i in range(start_index, len(input_str)) :
# print("test", i, input_str, len(input_str))
if input_str in end_list :
# msg_log = "index = {0}, char = {1}".format(i, str1[i])
end_index = i
return True, end_index
elif i == (len(input_str) -1) :
return True, i+1
return False, 0
# text 문자를 입력받아 query와 params 정보를 불리
def seperate_paramter(input_query):
input_query = input_query.upper()
# 1. "query" -> "=" -> "PARAMS" -> between string
query_index1 = input_query.find("QUERY")
query_index2 = input_query.find("=", query_index1) + 1
query_index3 = input_query.find("PARAMS", query_index2)
tmp_query = input_query[query_index2: query_index3]
between_index = tmp_query.rfind(",")
query_result = tmp_query[:between_index]
query_result = query_result.strip()
query_result = query_result.replace("\"", "")
# 4. "params" 데이터 찾기
params_index1 = input_query.find("PARAMS")
params_index2 = input_query.find("=", params_index1) + 1
params_result = input_query[params_index2:len(input_query)]
params_result = params_result.strip()
# logic end
return query_result, params_result
# Params 변수를 리스트에 저장
def get_parameter_list(input_param) :
result_list = input_param.split('|')
return result_list
# query, 바인딩 변수 리스트로 리터럴 쿼리 생성
def make_literal_query(input_str, binding_list) :
# try:
query_result = None
#1. 바인딩 위치 찾기
for i in range(len(input_str)) :
print('loop i = {0}, length = {1}'.format(i,len(input_str)))
if input_str[i] == ":":
start_index = i
is_ok, end_index = get_end_index(input_str, start_index)
if is_ok == True :
bind_var = ""
if len(binding_list) > 0 :
bind_var = binding_list.pop(0)
query_result = input_str[:start_index] + "'" + str(bind_var) + "'"+ input_str[end_index:]
input_str = query_result
else :
print("binding count is not correct.")
if (i+1) >= len(input_str) :
# print("break", i, len(input_str))
break;
# else :
# print("continue", i, len(input_str))
return query_result
# except Exception as e:
# print(e, input_str)
def convert_lieral_query(query) :
literal_query = None
#1. query, parameter 분리
bind_query, bind_para = seperate_paramter(query)
print("[Step1]", bind_query + "\n", bind_para)
#2. parameter를 리스트로 저장
bind_list = get_parameter_list(bind_para)
print("[Step2]", bind_list)
#3. query와 바인드 리스트를 이용하여 리터럴 쿼리 생성
literal_query = make_literal_query(bind_query, bind_list)
print("[Step3]", literal_query)
return literal_query
convert_lieral_query(in_query)
# print(convert_lieral_query(str1))