def get_http_parameters_dict(self, params: dict) -> dict:
        """ Build the http parameters dictionary to pass to remote server. """
        parms_dict: dict = {}
        param_index = 0

        # Blob lists
        if params is None:
            return parms_dict

        for x in params:
            param_index += 1

            # For Py2 always convert "unicode" aka str with special chars to str
            x = CursorUtil.get_utf8_value(x)

            param_type = CursorUtil.get_sql_type(x)
            parms_dict["param_type_" + str(param_index)] = param_type

            # print(str(param_index) + " param_type: " + str(param_type))

            # NULL values are defined in a (None, SqlNullType.TYPE) typle
            # BLOB values are defined in a (fd,) or (fd, length) tuple where
            # fd = open(filename)
            if CursorUtil.get_class_name(x) == "tuple":
                if param_type == "BLOB":
                    blob_id = FileUtil.get_unique_id() + ".blob"
                    parms_dict["param_value_" + str(param_index)] = blob_id

                    self.blob_ids.append(blob_id)
                    self.blob_streams.append(x[0])

                    if len(x) == 2:
                        self.blob_lengths.append(x[1])
                    else:
                        self.blob_lengths.append(0)
                else:
                    parms_dict["param_value_" + str(param_index)] = "NULL"

            elif CursorUtil.get_class_name(x) == "datetime.datetime":
                parms_dict[
                    "param_value_" +
                    str(param_index)] = DateTimeUtil.get_timestamp_from_date(x)
            elif CursorUtil.get_class_name(x) == "datetime.date":
                parms_dict[
                    "param_value_" +
                    str(param_index)] = DateTimeUtil.get_timestamp_from_date(x)
            elif CursorUtil.get_class_name(x) == "datetime.time":
                the_datetime = datetime.now()
                the_datetime.hour = x.hour
                the_datetime.minute = x.minute
                the_datetime.second = x.second
                parms_dict[
                    "param_value_" +
                    str(param_index)] = DateTimeUtil.get_timestamp_from_date(
                        the_datetime)
            else:
                parms_dict["param_value_" + str(param_index)] = str(x)

        print("parms_dict: " + str(parms_dict))
        return parms_dict
Example #2
0
    def executemany(self, sql: str, seq_params: list) -> List[int]:
        """Execute the given SQL operation multiple times
        The executemany() method will execute the operation iterating
        over the list of parameters in seq_params.
        Note that the SQL operation are transferred with one unique HTTP call to the server side which will execute
        them using a JDBC PreparedStatement in batch mode: this will allow fast execution.
        """
        if not ConnectionUtil.is_batch_supported(self.__connection):
            raise Exception("AceQL Server version must be >= " + ConnectionUtil.BATCH_MIN_SERVER_VERSION
                            + " in order to call executemany.")

        batch_file_parameters = FileUtil.build_batch_file()

        try:
            self.__raise_error_if_closed()

            if sql is None:
                raise TypeError("sql is null!")

            sql = sql.strip()

            if not CursorUtil.is_update_call(sql):
                raise aceql.Error("Only DELETE, INSERT or UPDATE calls are supported this AceQL Client version.", 0,
                                  None, None, 200)

            if not seq_params:
                return

            # The addBatch() part
            for params in seq_params:
                the_cursor_util: CursorUtil = CursorUtil()
                parms_dict: dict = the_cursor_util.get_http_parameters_dict(params)

                blob_ids: list = the_cursor_util.blob_ids

                if blob_ids is not None and len(blob_ids) > 0:
                    raise aceql.Error(
                        "Cannot call executemany for a table with BLOB parameter in this AceQL Client version.", 0,
                        None, None, 200)

                prep_statement_parameters_holder_schema = marshmallow_dataclass.class_schema(
                    PrepStatementParametersHolder)
                prep_statement_parameters_holder: PrepStatementParametersHolder = PrepStatementParametersHolder(
                    parms_dict)
                json_string: str = prep_statement_parameters_holder_schema().dumps(prep_statement_parameters_holder)
                with open(batch_file_parameters, "a") as fd:
                    fd.write(json_string + "\n")

            # The executeBatch() part
            rows: List[int] = self.__aceql_http_api.execute_batch(sql, batch_file_parameters)
            return rows
        finally:
            CursorUtil.remove_file_safe(batch_file_parameters)
Example #3
0
 def treat_result(self, filename: str):
     file_out = None
     if self.__aceQLHttpApi.is_gzip_result():
         file_out = filename[0:len(filename) - 4] + ".ungzipped.txt"
         FileUtil.decompress(filename, file_out)
         if AceQLDebugParms.DELETE_FILES:
             CursorUtil.remove_file_safe(filename)
     else:
         file_out = filename
     AceQLDebug.debug("Before StreamResultAnalyzer")
     result_analyzer = StreamResultAnalyzer(
         file_out, self.__aceQLHttpApi.get_http_status_code())
     if not result_analyzer.is_status_ok():
         if AceQLDebugParms.DELETE_FILES:
             CursorUtil.remove_file_safe(filename)
         raise Error(result_analyzer.get_error_message(),
                     result_analyzer.get_error_type(), None, None,
                     self.__aceQLHttpApi.get_http_status_code())
     row_counter = RowCounter(file_out)
     row_count = row_counter.count()
     result_set_info = ResultSetInfo(file_out, row_count)
     AceQLDebug.debug("Before resultSetInfo")
     return result_set_info
    def load():
        """Loads the file that contains the classes to debug and update the CLASSES_TO_DEBUG set."""
        if len(FrameworkDebug.CLASSES_TO_DEBUG) > 0:
            return
        aceql_debug_file = FileUtil.get_user_home_dot_kawansoft_dir(
        ) + sep + "aceql-debug-python.ini"

        if not os.path.isfile(aceql_debug_file):
            return

        # Loads from file classes to debug
        with open(aceql_debug_file) as f:
            lines = f.readlines()
            for line in lines:
                FrameworkDebug.CLASSES_TO_DEBUG.add(line.strip())
 def get_utf8_value(x: str) -> str:
     """ For python 2: string values with special chars must be UTF-8 encoded """
     if FileUtil.is_python_2() and CursorUtil.get_class_name(
             x) == "unicode":
         x = x.encode('utf-8')
     return x
Example #6
0
    def execute_server_query(self, server_query_executor_class_name: str,
                             parameters: list):
        """Calls /execute_server_query API"""
        try:

            action = "execute_server_query"
            dict_params = {
                "server_query_executor_class_name":
                server_query_executor_class_name
            }
            AceQLDebug.debug("dictParams 1: " + str(dict_params))

            server_query_executor_dto_schema = marshmallow_dataclass.class_schema(
                ServerQueryExecutorDto)
            server_query_executor_dto: ServerQueryExecutorDto = ServerQueryExecutorDtoBuilder.build(
                server_query_executor_class_name, parameters)
            json_string: str = server_query_executor_dto_schema().dumps(
                server_query_executor_dto)

            dict_params["server_query_executor_dto"] = json_string
            url_withaction = self.__url + action

            AceQLDebug.debug("url_withaction: " + url_withaction)
            AceQLDebug.debug("parameters    : " + str(parameters))

            self.update_dict_params(dict_params)
            AceQLDebug.debug("dictParams 2: " + str(dict_params))

            # r = requests.post('http://httpbin.org/post', data = {'key':'value'})

            if self.__aceQLHttpApi.get_timeout() is None:
                AceQLDebug.debug("QUERY HERE 1")
                response: Request = requests.post(
                    url_withaction,
                    headers=self.__aceQLHttpApi.get_headers(),
                    data=dict_params,
                    proxies=self.__aceQLHttpApi.get_proxies(),
                    auth=self.__aceQLHttpApi.get_auth())
            else:
                AceQLDebug.debug("QUERY HERE 2")
                response: Request = requests.post(
                    url_withaction,
                    headers=self.__aceQLHttpApi.get_headers(),
                    data=dict_params,
                    proxies=self.__aceQLHttpApi.get_proxies(),
                    auth=self.__aceQLHttpApi.get_auth(),
                    timeout=self.__aceQLHttpApi.get_timeout())
            AceQLDebug.debug("DONE!")
            self.__aceQLHttpApi.set_http_status_code(response.status_code)

            filename = FileUtil.build_result_set_file()
            AceQLDebug.debug("filename1: " + filename)

            # We dump the JSon stream into user.home/.kawansoft/tmp
            with open(filename, 'wb') as fd:
                for chunk in response.iter_content(chunk_size=2048):
                    fd.write(chunk)

            AceQLDebug.debug("after open filename")
            result_set_info = self.treat_result(filename)
            return result_set_info

        except Exception as e:
            if isinstance(e, Error):
                raise
            else:
                raise Error(str(e), 0, e, None,
                            self.__aceQLHttpApi.get_http_status_code())
Example #7
0
    def execute_query(self, sql: str, is_prepared_statement: bool,
                      statement_parameters: dict):
        """Calls /execute_query API"""
        try:

            action = "execute_query"
            AceQLExecutionUtil.check_values(is_prepared_statement, sql)
            dict_params = {"sql": sql}
            AceQLExecutionUtil.set_is_prepared_statement(
                dict_params, is_prepared_statement)

            url_withaction = self.__url + action

            AceQLDebug.debug("url_withaction: " + url_withaction)
            AceQLDebug.debug("dictParams 1: " + str(dict_params))

            if statement_parameters is not None:
                if not isinstance(statement_parameters, dict):
                    raise TypeError("statementParameters is not a dictionary!")

                dict_params.update(statement_parameters)

            self.update_dict_params(dict_params)
            AceQLDebug.debug("dictParams 2: " + str(dict_params))

            # r = requests.post('http://httpbin.org/post', data = {'key':'value'})

            if self.__aceQLHttpApi.get_timeout() is None:
                AceQLDebug.debug("QUERY HERE 1")
                response: Request = requests.post(
                    url_withaction,
                    headers=self.__aceQLHttpApi.get_headers(),
                    data=dict_params,
                    proxies=self.__aceQLHttpApi.get_proxies(),
                    auth=self.__aceQLHttpApi.get_auth())
            else:
                AceQLDebug.debug("QUERY HERE 2")
                response: Request = requests.post(
                    url_withaction,
                    headers=self.__aceQLHttpApi.get_headers(),
                    data=dict_params,
                    proxies=self.__aceQLHttpApi.get_proxies(),
                    auth=self.__aceQLHttpApi.get_auth(),
                    timeout=self.__aceQLHttpApi.get_timeout())
            AceQLDebug.debug("DONE!")
            self.__aceQLHttpApi.set_http_status_code(response.status_code)

            filename = FileUtil.build_result_set_file()
            AceQLDebug.debug("filename1: " + filename)

            # We dump the JSon stream into user.home/.kawansoft/tmp
            with open(filename, 'wb') as fd:
                for chunk in response.iter_content(chunk_size=2048):
                    fd.write(chunk)

            AceQLDebug.debug("after open filename")
            result_set_info = self.treat_result(filename)
            return result_set_info

        except Exception as e:
            if isinstance(e, Error):
                raise
            else:
                raise Error(str(e), 0, e, None,
                            self.__aceQLHttpApi.get_http_status_code())
Example #8
0
    def do_it():

        aceql_http_api = AceQLHttpApi("http://localhost:9090/aceql", "user1", "password1", "sampledb")
        print("connect done!")

        print("client version: " + aceql_http_api.get_client_version())
        print("server version: " + aceql_http_api.get_server_version())

        auto_commit = aceql_http_api.get_auto_commit()
        print("auto_commit: " + str(auto_commit))

        aceql_http_api.set_auto_commit(False)
        auto_commit = aceql_http_api.get_auto_commit()
        print("auto_commit: " + str(auto_commit))

        aceql_http_api.commit()
        aceql_http_api.rollback()
        aceql_http_api.set_auto_commit(True)

        auto_commit = aceql_http_api.get_auto_commit()
        print("auto_commit: " + str(auto_commit))

        holdability = aceql_http_api.get_holdability()
        print("holdability: " + holdability)

        transaction_isolation = aceql_http_api.get_transaction_isolation()
        print("transaction_isolation: " + transaction_isolation)

        read_only = aceql_http_api.is_read_only()
        print("readOnly: " + str(read_only))

        print()
        sql = "update customer set fname = ? where customer_id = ?"
        is_prepared_statement = True

        statement_parameters = {}
        statement_parameters["param_type_1"] = "VARCHAR"
        statement_parameters["param_value_1"] = "Nicolas"
        statement_parameters["param_type_2"] = "INTEGER"
        statement_parameters["param_value_2"] = "1"

        result = aceql_http_api.execute_update(sql, is_prepared_statement, statement_parameters)
        print("result: " + str(result))

        status_code = aceql_http_api.get_http_status_code()
        print("statusCode: " + str(status_code))

        status_message = aceql_http_api.get_http_status_message()
        print("status_message: " + str(status_message))
        print()

        print("UUID: " + FileUtil.get_unique_id())
        print("Home: " + FileUtil.get_user_home_dot_kawansoft_dir())
        print("Tmp : " + FileUtil.get_kawansoft_temp_dir())
        print()

        statement_parameters2 = {}
        statement_parameters2["param_type_1"] = "INTEGER"
        statement_parameters2["param_value_1"] = "0"
        sql = "select * from customer where customer_id >= ? order by customer_id"
        aceql_http_api.set_pretty_printing(True)

        result = aceql_http_api.execute_query(sql, is_prepared_statement, statement_parameters2)
        print("result: " + str(result))
        print()