From c7f08b29a9b94814ed07b87c9dc189ae3dd1af45 Mon Sep 17 00:00:00 2001 From: Zrouga Mohamed <61499067+zrougamed@users.noreply.github.com> Date: Wed, 1 Sep 2021 16:51:00 +0100 Subject: [PATCH] fixing the progressbar , fixing the graph ... --- pyTigerDriver/pyDriver.py | 218 ++++---------------------------------- test.py | 108 +++---------------- 2 files changed, 33 insertions(+), 293 deletions(-) diff --git a/pyTigerDriver/pyDriver.py b/pyTigerDriver/pyDriver.py index 6df22d8..bdd5690 100644 --- a/pyTigerDriver/pyDriver.py +++ b/pyTigerDriver/pyDriver.py @@ -8,6 +8,7 @@ import logging import codecs import datetime +import sys from os import getenv from os.path import expanduser, isfile @@ -183,9 +184,9 @@ def __init__(self, server_ip="127.0.0.1", username="tigergraph", password="tiger self._server_ip = server_ip self._username = username self._password = password - if self.debug: - print(password) - print(username) + self.ExceptionDetected = False + self.ExceptionCode = "" + self.ExceptionText = "" if commit: self._client_commit = commit elif version in VERSION_COMMIT: @@ -216,9 +217,7 @@ def __init__(self, server_ip="127.0.0.1", username="tigergraph", password="tiger self._base_url = "/gsqlserver/gsql/" # if ":" not in server_ip: self._server_ip = "{0}:{1}".format(server_ip, gsPort) - if self.debug: - print(self._server_ip) - print(self._username) + self._initialize_url() @@ -229,7 +228,7 @@ def __init__(self, server_ip="127.0.0.1", username="tigergraph", password="tiger self.authorization = 'Basic {0}'.format(self.base64_credential) def _initialize_url(self): - self.command_url = self._base_url + "command" + self.command_url = self._base_url + "file" # Changed for multi line support ... self.version_url = self._base_url + "version" self.help_url = self._base_url + "help" self.login_url = self._base_url + "login" @@ -258,7 +257,7 @@ def _get_cookie(self): if self._client_commit: cookie["commitClient"] = self._client_commit - return json.dumps(cookie, ensure_ascii=True) + return cookie def _set_cookie(self, cookie_str): @@ -270,7 +269,7 @@ def _set_cookie(self, cookie_str): def _setup_connection(self, url, content, cookie={}, auth=True): if cookie == None: - cookie = {} + cookie = self._get_cookie() cookie["fromGsqlClient"] = True cookie["fromGraphStudio"] = True @@ -299,6 +298,9 @@ def _setup_connection(self, url, content, cookie={}, auth=True): def _request(self, url, content, handler=None, cookie=None, auth=True): response = None + if cookie == None: + cookie = {} + cookie = self._get_cookie() try: r = self._setup_connection(url, content, cookie, auth) response = r.getresponse() @@ -323,13 +325,17 @@ def _command_interactive(self, url, content, ans="", out=False): def __handle__interactive(reader): res = [] + for line in reader: + line = line.strip() + if line.startswith(PREFIX_RET): _, ret = line.split(",", 1) ret = int(ret) if ret != 0: - raise ExceptionCodeRet(ret) + self.ExceptionDetected = True + # raise ExceptionCodeRet(ret) elif line.startswith(PREFIX_INTERACT): _, it, ik = line.split(",", 2) if it in {"DecryptQb", "AlterPasswordQb", "CreateUserQb", "CreateTokenQb", "ClearStoreQb"} \ @@ -346,7 +352,9 @@ def __handle__interactive(reader): elif PROGRESS_PATTERN.match(line): if COMPLETE_PATTERN.match(line): line += "\n" - print("\r" + line) + # else: + # print("\r" + line) + # sys.stdout.flush() else: if out: print(line) @@ -382,8 +390,6 @@ def login(self, commit_try="", version_try=""): try: Cookies = {} Cookies['clientCommit'] = self._client_commit - if self.debug: - print(self.base64_credential) r = self._setup_connection(self.login_url, self.base64_credential, cookie=Cookies, auth=False) response = r.getresponse() ret_code = response.status @@ -437,8 +443,8 @@ def version(self): def help(self): return self._command_interactive(self.help_url, "help") - def query(self, content, ans=""): - + def query(self, content,graph="", ans=""): + self.graph = graph return self._command_interactive(self.command_url, content, ans) def use(self, graph): @@ -490,186 +496,4 @@ def _read_file(self, file_path, loaded): return res -class REST_ClientError(Exception): - pass - - -class REST_Client(object): - - def __init__(self, server_ip): - - self._token = "" - if ":" in server_ip: - self._server_ip = server_ip - else: - self._server_ip = server_ip + ":9000" - - self._logger = logging.getLogger("gsql_client.RESTPP") - - def _setup_connection(self, method, endpoint, parameters, content): - - url = endpoint - if parameters: - url += "?" + urlencode(parameters) - - headers = { - "Content-Language": "en-US", - "Pragma": "no-cache", - "Cache-Control": "no-cache", - "Connection": "keep-alive", - "Content-Type": "application/json" - } - - if content: - encoded = content.encode("utf-8") - headers["Content-Length"] = str(len(encoded)) - else: - encoded = None - - if self._token: - headers["Authorization"] = "Bearer: {0}".format(self._token) - - conn = HTTPConnection(self._server_ip) - conn.request(method, url, encoded, headers) - return conn - - def _request(self, method, endpoint, parameters=None, content=None): - - response = None - try: - r = self._setup_connection(method, endpoint, parameters, content) - response = r.getresponse() - ret_code = response.status - if ret_code == 401: - raise AuthenticationFailedException("Invalid token!") - response_text = response.read().decode("utf-8") - self._logger.debug(response_text) - # non strict mode to allow control characters in string - res = json.loads(response_text, strict=False) - - # notice that result is not consistent, we need to handle them differently - if "error" not in res: - return res - elif res["error"] and res["error"] != "false": # workaround for GET /version result - self._logger.error("API error: " + res["message"]) - raise REST_ClientError(res.get("message", "")) - elif "token" in res: - return res["token"] - elif "results" in res: - return res["results"] - elif "message" in res: - return res["message"] - else: - return res - finally: - if response: - response.close() - - def _get(self, endpoint, parameters=None): - return self._request("GET", endpoint, parameters, None) - - def _post(self, endpoint, parameters=None, content=None): - return self._request("POST", endpoint, parameters, content) - - def _delete(self, endpoint, parameters=None): - return self._request("DELETE", endpoint, parameters, None) - - def request_token(self, secret, lifetime=None): - - parameters = { - "secret": secret - } - if lifetime: - parameters["lifetime"] = lifetime - - res = self._get("/requesttoken", parameters) - if res: - self._token = res - return True - else: - return False - - def echo(self): - - return self._get("/echo") - - def version(self): - - return self._get("/version") - - def endpoints(self): - - return self._get("/endpoints") - - def license(self): - - return self._get("/showlicenseinfo") - - def stat(self, graph, **kwargs): - - url = "/builtins/" + graph - return self._post(url, content=json.dumps(kwargs, ensure_ascii=True)) - - def stat_vertex_number(self, graph, type_name="*"): - return self.stat(graph, function="stat_vertex_number", type=type_name) - - def stat_edge_number(self, graph, type_name="*", from_type_name="*", to_type_name="*"): - return self.stat(graph, function="stat_edge_number", type=type_name, - from_type=from_type_name, to_type=to_type_name) - - def stat_vertex_attr(self, graph, type_name="*"): - return self.stat(graph, function="stat_vertex_attr", type=type_name) - - def stat_edge_attr(self, graph, type_name="*", from_type_name="*", to_type_name="*"): - return self.stat(graph, function="stat_edge_attr", type=type_name, - from_type=from_type_name, to_type=to_type_name) - - def select_vertices(self, graph, vertex_type, vertex_id=None, **kwargs): - - endpoint = "/graph/{0}/vertices/{1}".format(graph, vertex_type) - if vertex_id: - endpoint += "/" + vertex_id - return self._get(endpoint, kwargs) - - def select_edges(self, graph, src_type, src_id, edge_type="_", dst_type=None, dst_id=None, **kwargs): - - endpoint = "/graph/{0}/edges/{1}/{2}/{3}".format(graph, src_type, src_id, edge_type) - if dst_type: - endpoint += "/" + dst_type - if dst_id: - endpoint += "/" + dst_id - return self._get(endpoint, kwargs) - - def delete_vertices(self, graph, vertex_type, vertex_id=None, **kwargs): - - endpoint = "/graph/{0}/vertices/{1}".format(graph, vertex_type) - if vertex_id: - endpoint += "/" + vertex_id - return self._get(endpoint, kwargs) - - def delete_edges(self, graph, src_type, src_id, edge_type="_", dst_type=None, dst_id=None, **kwargs): - - endpoint = "/graph/{0}/edges/{1}/{2}/{3}".format(graph, src_type, src_id, edge_type) - if dst_type: - endpoint += "/" + dst_type - if dst_id: - endpoint += "/" + dst_id - return self._delete(endpoint, kwargs) - - def load(self, graph, lines, **kwargs): - - if lines: - content = "\n".join(lines) - else: - content = None - - endpoint = "/ddl/" + graph - return self._post(endpoint, kwargs, content) - - def update(self, graph, content): - - return self._post("/graph/" + graph, content=json.dumps(content, ensure_ascii=True)) - - def query(self, graph, query_name, **kwargs): - return self._get("/{0}/{1}".format(graph, query_name), kwargs) diff --git a/test.py b/test.py index 54170b7..55692ee 100644 --- a/test.py +++ b/test.py @@ -1,107 +1,23 @@ -import pyTigerDriver as tg -# Version v1.0.11 -# my used sample kit -# secret : junq2fhuji2hq9r0mg92folp82l33ufl -# curl -X GET 'https://ttl.i.tgcloud.io:9000/requesttoken?secret=junq2fhuji2hq9r0mg92folp82l33ufl&lifetime=1000000' -# {"code":"REST-0000","expiration":1613435591,"error":false,"message":"Generate new token successfully.","token":"ptkqg4c8tdncjvspbtkt2crird81dron"} +from pyTigerDriver import GSQL_Client -# -# def get(self, path, headers=None, resKey="results", skipCheck=False, params=None): -# def post(self, path, headers=None, data=None, resKey="results", skipCheck=False, params=None): -# def delete(self, path): -# def execute(self, query, local=False, options=None): +tgCl =GSQL_Client(server_ip="127.0.0.1",gsPort="14240", restpp="9000" + , username="tigergraph", password="tigergraph",debug=True + , version="3.1.0" + ,cacert="/home/med/.gsql/my-cert.txt") -# All the params are listed for info only! -# you need : server_ip , user , pass , token , graph , and protocol ( by default local = False ) -# tgcloud.io Case : /gsqlserver/gsql/ -# tgCl = tg.Client(server_ip="ttl.i.tgcloud.io",gsPort="14240", restPort="9000" -# , username="tigergraph", password="tigergraph", local = False -# , version="3.0.5",protocol="https" -# , graph="MyGraph",token="ptkqg4c8tdncjvspbtkt2crird81dron") -# Docker Case : /gsqlserver/gsql/ -tgCl = tg.Client(server_ip="127.0.0.1",gsPort="14240", restPort="9000" - , username="tigergraph", password="tigergraph",local=False - , version="3.0.5",protocol="http" - , graph="ioT") +print("################ GSQL ##################") -# Local installation : /gsql/ -# tgCl = tg.Client(server_ip="127.0.0.1",gsPort="14240", restPort="9000" -# , username="tigergraph", password="tigergraph",local=True -# , version="3.0.5",protocol="http" -# , graph="ioT") -def getUDT(endpoint,param=None): - """ - GSQL Schema : get(URL + "/gsqlserver/gsql/udtlist?graph=" + graphname, authMode="pwd") - :param endpoint: - :param param: - :return: - """ - res = tgCl.Gsql.get(endpoint,param) - return res - - -def RunQuery(query_name,graph,params=None): - """ - Run an installed query - :param query_name: - :param graph: - :param params: - :param timeout: - :param sizeLimit: - :return: - """ - res = tgCl.Rest.get("/query/{0}/{1}".format(graph,query_name),parameters=params,resKey="results") - return res - - - - -print("################ /GET UDT Listing : GSQL 14240 ##################") -endpoint = "udtlist" # endpoint after /gsql/ or /gsqlserver/gsql/ -param = {"graph":"MyGraph"} # 1 param -res = getUDT(endpoint,param) -print(res) - -print("################ /GET echo : RestPP 9000 ##################") -res = tgCl.Rest.get("/echo") -print(res) - -print("################ /GET Catalog ##################") -res = tgCl.Rest.get("/echo") +res = tgCl.query(''' +CREATE QUERY ttss () FOR GRAPH Test { +print "it works"; +} +INSTALL QUERY ALL +''',graph="Test") print(res) -print("################ Run Query #######################") -res = RunQuery("GetLocations","ioT") -print(res) - - -# print("################ GSQL ##################") -# res = tgCl.Gsql.execute("ls") -# print(res) - -print("################ Change Graph ##################") - -tgCl.Gsql.graph = "ioT" - - -res = [] -res.append("Using Graph with GSQL") -res = tgCl.Gsql.execute("use GRAPH ioT") -res += tgCl.Gsql.execute("show loading status all") -res.append("Using Global with GSQL") -res += tgCl.Gsql.execute("use Global") -res += tgCl.Gsql.execute("show loading status all") -res.append("Changing back to Graph with variable cookie") -tgCl.Gsql.graph = "ioT" -# res += tgCl.Gsql.execute("use GRAPH ioT") -res += tgCl.Gsql.execute("show loading status all") -print("\n".join(res)) - - -