From a63d996aa9a8cff4b789679173ca01ee37396162 Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Fri, 23 May 2025 15:31:02 +0530 Subject: [PATCH 01/32] FEAT: MacOS Support --- .gitignore | 5 +- mssql_python/connection.py | 199 +- mssql_python/constants.py | 2 - mssql_python/cursor.py | 64 +- mssql_python/db_connection.py | 4 +- mssql_python/ddbc_bindings.py | 30 +- mssql_python/exceptions.py | 4 +- mssql_python/helpers.py | 3 +- mssql_python/libs/LICENSING | 19 - mssql_python/libs/macos/lib/libltdl.7.dylib | Bin 0 -> 93840 bytes .../libs/macos/lib/libmsodbcsql.18.dylib | Bin 0 -> 1673120 bytes mssql_python/libs/macos/lib/libodbc.2.dylib | Bin 0 -> 390096 bytes mssql_python/libs/macos/lib/libodbccr.2.dylib | Bin 0 -> 71280 bytes .../libs/macos/lib/libodbcinst.2.dylib | Bin 0 -> 111808 bytes .../libs/macos/odbc_include/autotest.h | 176 ++ .../libs/macos/odbc_include/odbcinst.h | 458 ++++ .../libs/macos/odbc_include/odbcinstext.h | 369 +++ mssql_python/libs/macos/odbc_include/sql.h | 839 ++++++ mssql_python/libs/macos/odbc_include/sqlext.h | 2204 +++++++++++++++ mssql_python/libs/macos/odbc_include/sqlspi.h | 173 ++ .../libs/macos/odbc_include/sqltypes.h | 482 ++++ .../libs/macos/odbc_include/sqlucode.h | 789 ++++++ .../odbc_include/unixODBC/unixodbc_conf.h | 484 ++++ .../libs/macos/odbc_include/unixodbc.h | 17 + .../libs/macos/odbc_include/uodbc_extras.h | 85 + .../libs/macos/odbc_include/uodbc_stats.h | 83 + .../macos/share/doc/msodbcsql18/LICENSE.txt | 101 + .../macos/share/doc/msodbcsql18/RELEASE_NOTES | 465 ++++ .../resources/en_US/msodbcsqlr18.rll | Bin 0 -> 200704 bytes mssql_python/pybind/CMakeLists.txt | 272 +- mssql_python/pybind/build.sh | 128 + mssql_python/pybind/configure_dylibs.sh | 96 + mssql_python/pybind/ddbc_bindings_mac.cpp | 2416 +++++++++++++++++ mssql_python/pybind/mac_buffers.h | 169 ++ mssql_python/pybind/mac_fix.cpp | 111 + mssql_python/pybind/mac_fix.h | 31 + mssql_python/testing_ddbc_bindings.py | 66 +- mssql_python/type.py | 2 +- setup.py | 22 +- tests/conftest.py | 8 +- tests/test_003_connection.py | 38 +- tests/test_004_cursor.py | 14 +- tests/test_005_exceptions.py | 17 +- 43 files changed, 10058 insertions(+), 387 deletions(-) delete mode 100644 mssql_python/libs/LICENSING create mode 100644 mssql_python/libs/macos/lib/libltdl.7.dylib create mode 100755 mssql_python/libs/macos/lib/libmsodbcsql.18.dylib create mode 100755 mssql_python/libs/macos/lib/libodbc.2.dylib create mode 100755 mssql_python/libs/macos/lib/libodbccr.2.dylib create mode 100755 mssql_python/libs/macos/lib/libodbcinst.2.dylib create mode 100644 mssql_python/libs/macos/odbc_include/autotest.h create mode 100644 mssql_python/libs/macos/odbc_include/odbcinst.h create mode 100644 mssql_python/libs/macos/odbc_include/odbcinstext.h create mode 100644 mssql_python/libs/macos/odbc_include/sql.h create mode 100644 mssql_python/libs/macos/odbc_include/sqlext.h create mode 100644 mssql_python/libs/macos/odbc_include/sqlspi.h create mode 100644 mssql_python/libs/macos/odbc_include/sqltypes.h create mode 100644 mssql_python/libs/macos/odbc_include/sqlucode.h create mode 100644 mssql_python/libs/macos/odbc_include/unixODBC/unixodbc_conf.h create mode 100644 mssql_python/libs/macos/odbc_include/unixodbc.h create mode 100644 mssql_python/libs/macos/odbc_include/uodbc_extras.h create mode 100644 mssql_python/libs/macos/odbc_include/uodbc_stats.h create mode 100644 mssql_python/libs/macos/share/doc/msodbcsql18/LICENSE.txt create mode 100644 mssql_python/libs/macos/share/doc/msodbcsql18/RELEASE_NOTES create mode 100644 mssql_python/libs/macos/share/msodbcsql18/resources/en_US/msodbcsqlr18.rll create mode 100755 mssql_python/pybind/build.sh create mode 100755 mssql_python/pybind/configure_dylibs.sh create mode 100644 mssql_python/pybind/ddbc_bindings_mac.cpp create mode 100644 mssql_python/pybind/mac_buffers.h create mode 100644 mssql_python/pybind/mac_fix.cpp create mode 100644 mssql_python/pybind/mac_fix.h diff --git a/.gitignore b/.gitignore index f4c36b51..1ae348ea 100644 --- a/.gitignore +++ b/.gitignore @@ -47,4 +47,7 @@ build/ # IDE files .vscode/ .idea/ -*.swp \ No newline at end of file +*.swp + +# .DS_Store files +.DS_Store \ No newline at end of file diff --git a/mssql_python/connection.py b/mssql_python/connection.py index 8031a26a..4bceadf2 100644 --- a/mssql_python/connection.py +++ b/mssql_python/connection.py @@ -33,7 +33,7 @@ class Connection: close() -> None: """ - def __init__(self, connection_str: str = "", autocommit: bool = False, attrs_before: dict = None, **kwargs) -> None: + def __init__(self, connection_str: str, autocommit: bool = False, **kwargs) -> None: """ Initialize the connection object with the specified connection string and parameters. @@ -53,17 +53,16 @@ def __init__(self, connection_str: str = "", autocommit: bool = False, attrs_bef preparing it for further operations such as connecting to the database, executing queries, etc. """ - self.henv = None - self.hdbc = None + self.henv = ctypes.c_void_p() + self.hdbc = ctypes.c_void_p() self.connection_str = self._construct_connection_string( connection_str, **kwargs ) - self._attrs_before = attrs_before - self._autocommit = autocommit # Initialize _autocommit before calling _initializer self._initializer() + self._autocommit = autocommit self.setautocommit(autocommit) - def _construct_connection_string(self, connection_str: str = "", **kwargs) -> str: + def _construct_connection_string(self, connection_str: str, **kwargs) -> str: """ Construct the connection string by concatenating the connection string with key/value pairs from kwargs. @@ -77,14 +76,13 @@ def _construct_connection_string(self, connection_str: str = "", **kwargs) -> st """ # Add the driver attribute to the connection string conn_str = add_driver_to_connection_str(connection_str) - # Add additional key-value pairs to the connection string for key, value in kwargs.items(): - if key.lower() == "host" or key.lower() == "server": + if key.lower() == "host": key = "Server" - elif key.lower() == "user" or key.lower() == "uid": + elif key.lower() == "user": key = "Uid" - elif key.lower() == "password" or key.lower() == "pwd": + elif key.lower() == "password": key = "Pwd" elif key.lower() == "database": key = "Database" @@ -95,21 +93,8 @@ def _construct_connection_string(self, connection_str: str = "", **kwargs) -> st else: continue conn_str += f"{key}={value};" - - if ENABLE_LOGGING: - logger.info("Final connection string: %s", conn_str) - return conn_str - def _is_closed(self) -> bool: - """ - Check if the connection is closed. - - Returns: - bool: True if the connection is closed, False otherwise. - """ - return self.hdbc is None - def _initializer(self) -> None: """ Initialize the environment and connection handles. @@ -121,132 +106,59 @@ def _initializer(self) -> None: self._allocate_environment_handle() self._set_environment_attributes() self._allocate_connection_handle() - if self._attrs_before != {}: - self._apply_attrs_before() # Apply pre-connection attributes - if self._autocommit: - self._set_connection_attributes( - ddbc_sql_const.SQL_ATTR_AUTOCOMMIT.value, - ddbc_sql_const.SQL_AUTOCOMMIT_ON.value, - ) + self._set_connection_attributes() self._connect_to_db() - def _apply_attrs_before(self): - """ - Apply specific pre-connection attributes. - Currently, this method only processes an attribute with key 1256 (e.g., SQL_COPT_SS_ACCESS_TOKEN) - if present in `self._attrs_before`. Other attributes are ignored. - - Returns: - bool: True. - """ - - if ENABLE_LOGGING: - logger.info("Attempting to apply pre-connection attributes (attrs_before): %s", self._attrs_before) - - if not isinstance(self._attrs_before, dict): - if self._attrs_before is not None and ENABLE_LOGGING: - logger.warning( - f"_attrs_before is of type {type(self._attrs_before).__name__}, " - f"expected dict. Skipping attribute application." - ) - elif self._attrs_before is None and ENABLE_LOGGING: - logger.debug("_attrs_before is None. No pre-connection attributes to apply.") - return True # Exit if _attrs_before is not a dictionary or is None - - for key, value in self._attrs_before.items(): - ikey = None - if isinstance(key, int): - ikey = key - elif isinstance(key, str) and key.isdigit(): - try: - ikey = int(key) - except ValueError: - if ENABLE_LOGGING: - logger.debug( - f"Skipping attribute with key '{key}' in attrs_before: " - f"could not convert string to int." - ) - continue # Skip if string key is not a valid integer - else: - if ENABLE_LOGGING: - logger.debug( - f"Skipping attribute with key '{key}' in attrs_before due to " - f"unsupported key type: {type(key).__name__}. Expected int or string representation of an int." - ) - continue # Skip keys that are not int or string representation of an int - - if ikey == ddbc_sql_const.SQL_COPT_SS_ACCESS_TOKEN.value: - if ENABLE_LOGGING: - logger.info( - f"Found attribute {ddbc_sql_const.SQL_COPT_SS_ACCESS_TOKEN.value}. Attempting to set it." - ) - self._set_connection_attributes(ikey, value) - if ENABLE_LOGGING: - logger.info( - f"Call to set attribute {ddbc_sql_const.SQL_COPT_SS_ACCESS_TOKEN.value} with value '{value}' completed." - ) - # If you expect only one such key, you could add 'break' here. - else: - if ENABLE_LOGGING: - logger.debug( - f"Ignoring attribute with key '{key}' (resolved to {ikey}) in attrs_before " - f"as it is not the target attribute ({ddbc_sql_const.SQL_COPT_SS_ACCESS_TOKEN.value})." - ) - return True - def _allocate_environment_handle(self): """ Allocate the environment handle. """ - ret, handle = ddbc_bindings.DDBCSQLAllocHandle( + ret = ddbc_bindings.DDBCSQLAllocHandle( ddbc_sql_const.SQL_HANDLE_ENV.value, # SQL environment handle type - None + 0, # SQL input handle + ctypes.cast( + ctypes.pointer(self.henv), ctypes.c_void_p + ).value, # SQL output handle pointer ) - check_error(ddbc_sql_const.SQL_HANDLE_ENV.value, handle, ret) - self.henv = handle + check_error(ddbc_sql_const.SQL_HANDLE_ENV.value, self.henv.value, ret) def _set_environment_attributes(self): """ Set the environment attributes. """ ret = ddbc_bindings.DDBCSQLSetEnvAttr( - self.henv, # Use the wrapper class + self.henv.value, # Environment handle ddbc_sql_const.SQL_ATTR_DDBC_VERSION.value, # Attribute ddbc_sql_const.SQL_OV_DDBC3_80.value, # String Length 0, # Null-terminated string ) - check_error(ddbc_sql_const.SQL_HANDLE_ENV.value, self.henv, ret) + check_error(ddbc_sql_const.SQL_HANDLE_ENV.value, self.henv.value, ret) def _allocate_connection_handle(self): """ Allocate the connection handle. """ - ret, handle = ddbc_bindings.DDBCSQLAllocHandle( + ret = ddbc_bindings.DDBCSQLAllocHandle( ddbc_sql_const.SQL_HANDLE_DBC.value, # SQL connection handle type - self.henv + self.henv.value, # SQL environment handle + ctypes.cast( + ctypes.pointer(self.hdbc), ctypes.c_void_p + ).value, # SQL output handle pointer ) - check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, handle, ret) - self.hdbc = handle + check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) - def _set_connection_attributes(self, ikey: int, ivalue: any) -> None: + def _set_connection_attributes(self): """ Set the connection attributes before connecting. - - Args: - ikey (int): The attribute key to set. - ivalue (Any): The value to set for the attribute. Can be bytes, bytearray, int, or unicode. - vallen (int): The length of the value. - - Raises: - DatabaseError: If there is an error while setting the connection attribute. """ - - ret = ddbc_bindings.DDBCSQLSetConnectAttr( - self.hdbc, # Connection handle - ikey, # Attribute - ivalue, # Value - ) - check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc, ret) + if self.autocommit: + ret = ddbc_bindings.DDBCSQLSetConnectAttr( + self.hdbc.value, + ddbc_sql_const.SQL_ATTR_AUTOCOMMIT.value, + ddbc_sql_const.SQL_AUTOCOMMIT_ON.value, + 0, + ) + check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) def _connect_to_db(self) -> None: """ @@ -264,11 +176,11 @@ def _connect_to_db(self) -> None: if ENABLE_LOGGING: logger.info("Connecting to the database") ret = ddbc_bindings.DDBCSQLDriverConnect( - self.hdbc, # Connection handle (wrapper) + self.hdbc.value, # Connection handle 0, # Window handle self.connection_str, # Connection string ) - check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc, ret) + check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) if ENABLE_LOGGING: logger.info("Connection established successfully.") @@ -280,11 +192,11 @@ def autocommit(self) -> bool: bool: True if autocommit is enabled, False otherwise. """ autocommit_mode = ddbc_bindings.DDBCSQLGetConnectionAttr( - self.hdbc, # Connection handle (wrapper) + self.hdbc.value, # Connection handle ddbc_sql_const.SQL_ATTR_AUTOCOMMIT.value, # Attribute ) check_error( - ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc, autocommit_mode + ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, autocommit_mode ) return autocommit_mode == ddbc_sql_const.SQL_AUTOCOMMIT_ON.value @@ -300,15 +212,16 @@ def autocommit(self, value: bool) -> None: DatabaseError: If there is an error while setting the autocommit mode. """ ret = ddbc_bindings.DDBCSQLSetConnectAttr( - self.hdbc, # Connection handle + self.hdbc.value, # Connection handle ddbc_sql_const.SQL_ATTR_AUTOCOMMIT.value, # Attribute ( ddbc_sql_const.SQL_AUTOCOMMIT_ON.value if value else ddbc_sql_const.SQL_AUTOCOMMIT_OFF.value ), # Value + 0, # String length ) - check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc, ret) + check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) self._autocommit = value if ENABLE_LOGGING: logger.info("Autocommit mode set to %s.", value) @@ -340,9 +253,6 @@ def cursor(self) -> Cursor: DatabaseError: If there is an error while creating the cursor. InterfaceError: If there is an error related to the database interface. """ - if self._is_closed(): - # Cannot create a cursor if the connection is closed - raise Exception("Connection is closed. Cannot create cursor.") return Cursor(self) def commit(self) -> None: @@ -357,17 +267,13 @@ def commit(self) -> None: Raises: DatabaseError: If there is an error while committing the transaction. """ - if self._is_closed(): - # Cannot commit if the connection is closed - raise Exception("Connection is closed. Cannot commit.") - # Commit the current transaction ret = ddbc_bindings.DDBCSQLEndTran( ddbc_sql_const.SQL_HANDLE_DBC.value, # Handle type - self.hdbc, # Connection handle (wrapper) + self.hdbc.value, # Connection handle ddbc_sql_const.SQL_COMMIT.value, # Commit the transaction ) - check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc, ret) + check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) if ENABLE_LOGGING: logger.info("Transaction committed successfully.") @@ -382,17 +288,13 @@ def rollback(self) -> None: Raises: DatabaseError: If there is an error while rolling back the transaction. """ - if self._is_closed(): - # Cannot roll back if the connection is closed - raise Exception("Connection is closed. Cannot roll back.") - # Roll back the current transaction ret = ddbc_bindings.DDBCSQLEndTran( ddbc_sql_const.SQL_HANDLE_DBC.value, # Handle type - self.hdbc, # Connection handle (wrapper) + self.hdbc.value, # Connection handle ddbc_sql_const.SQL_ROLLBACK.value, # Roll back the transaction ) - check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc, ret) + check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) if ENABLE_LOGGING: logger.info("Transaction rolled back successfully.") @@ -409,16 +311,15 @@ def close(self) -> None: Raises: DatabaseError: If there is an error while closing the connection. """ - if self._is_closed(): - # Connection is already closed - return # Disconnect from the database - ret = ddbc_bindings.DDBCSQLDisconnect(self.hdbc) - check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc, ret) + ret = ddbc_bindings.DDBCSQLDisconnect(self.hdbc.value) + check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) - # Set the reference to None to trigger destructor - self.hdbc.free() - self.hdbc = None + # Free the connection handle + ret = ddbc_bindings.DDBCSQLFreeHandle( + ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value + ) + check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) if ENABLE_LOGGING: logger.info("Connection closed successfully.") diff --git a/mssql_python/constants.py b/mssql_python/constants.py index 1f479ebd..aade503c 100644 --- a/mssql_python/constants.py +++ b/mssql_python/constants.py @@ -116,5 +116,3 @@ class ConstantsDDBC(Enum): SQL_C_WCHAR = -8 SQL_NULLABLE = 1 SQL_MAX_NUMERIC_LEN = 16 - SQL_IS_POINTER = -4 - SQL_COPT_SS_ACCESS_TOKEN = 1256 \ No newline at end of file diff --git a/mssql_python/cursor.py b/mssql_python/cursor.py index c038ea7e..023bd601 100644 --- a/mssql_python/cursor.py +++ b/mssql_python/cursor.py @@ -48,11 +48,9 @@ def __init__(self, connection) -> None: Args: connection: Database connection object. """ - if connection.hdbc is None: - raise Exception("Connection is closed. Cannot create a cursor.") self.connection = connection # self.connection.autocommit = False - self.hstmt = None + self.hstmt = ctypes.c_void_p() self._initialize_cursor() self.description = None self.rowcount = -1 @@ -417,22 +415,22 @@ def _allocate_statement_handle(self): """ Allocate the DDBC statement handle. """ - ret, handle = ddbc_bindings.DDBCSQLAllocHandle( + ret = ddbc_bindings.DDBCSQLAllocHandle( ddbc_sql_const.SQL_HANDLE_STMT.value, - self.connection.hdbc + self.connection.hdbc.value, + ctypes.cast(ctypes.pointer(self.hstmt), ctypes.c_void_p).value, ) - check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, handle, ret) - self.hstmt = handle + check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) def _reset_cursor(self) -> None: """ Reset the DDBC statement handle. """ - if self.hstmt: - self.hstmt.free() # Free the existing statement handle - self.hstmt = None - if ENABLE_LOGGING: - logger.debug("SQLFreeHandle succeeded") + # Free the existing statement handle + if self.hstmt.value: + ddbc_bindings.DDBCSQLFreeHandle( + ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value + ) # Reinitialize the statement handle self._initialize_cursor() @@ -444,13 +442,15 @@ def close(self) -> None: Error: If any operation is attempted with the cursor after it is closed. """ if self.closed: - raise Exception("Cursor is already closed.") + raise RuntimeError("Cursor is already closed.") + + if self.hstmt.value: + ret = ddbc_bindings.DDBCSQLFreeHandle( + ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value + ) + check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) + self.hstmt.value = None - if self.hstmt: - self.hstmt.free() - self.hstmt = None - if ENABLE_LOGGING: - logger.debug("SQLFreeHandle succeeded") self.closed = True def _check_closed(self): @@ -461,7 +461,7 @@ def _check_closed(self): Error: If the cursor is closed. """ if self.closed: - raise Exception("Operation cannot be performed: the cursor is closed.") + raise RuntimeError("Operation cannot be performed: the cursor is closed.") def _create_parameter_types_list(self, parameter, param_info, parameters_list, i): """ @@ -489,8 +489,8 @@ def _initialize_description(self): Initialize the description attribute using SQLDescribeCol. """ col_metadata = [] - ret = ddbc_bindings.DDBCSQLDescribeCol(self.hstmt, col_metadata) - check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt, ret) + ret = ddbc_bindings.DDBCSQLDescribeCol(self.hstmt.value, col_metadata) + check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) self.description = [ ( @@ -602,19 +602,19 @@ def execute( ) ret = ddbc_bindings.DDBCSQLExecute( - self.hstmt, + self.hstmt.value, operation, parameters, parameters_type, self.is_stmt_prepared, use_prepare, ) - check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt, ret) + check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) self.last_executed_stmt = operation # Update rowcount after execution # TODO: rowcount return code from SQL needs to be handled - self.rowcount = ddbc_bindings.DDBCSQLRowCount(self.hstmt) + self.rowcount = ddbc_bindings.DDBCSQLRowCount(self.hstmt.value) # Initialize description after execution self._initialize_description() @@ -664,8 +664,8 @@ def fetchone(self) -> Union[None, tuple]: self._check_closed() # Check if the cursor is closed row = [] - ret = ddbc_bindings.DDBCSQLFetchOne(self.hstmt, row) - check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt, ret) + ret = ddbc_bindings.DDBCSQLFetchOne(self.hstmt.value, row) + check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) if ret == ddbc_sql_const.SQL_NO_DATA.value: return None return list(row) @@ -690,8 +690,8 @@ def fetchmany(self, size: int = None) -> List[tuple]: # Fetch the next set of rows rows = [] - ret = ddbc_bindings.DDBCSQLFetchMany(self.hstmt, rows, size) - check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt, ret) + ret = ddbc_bindings.DDBCSQLFetchMany(self.hstmt.value, rows, size) + check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) if ret == ddbc_sql_const.SQL_NO_DATA.value: return [] return rows @@ -710,8 +710,8 @@ def fetchall(self) -> List[tuple]: # Fetch all remaining rows rows = [] - ret = ddbc_bindings.DDBCSQLFetchAll(self.hstmt, rows) - check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt, ret) + ret = ddbc_bindings.DDBCSQLFetchAll(self.hstmt.value, rows) + check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) if ret != ddbc_sql_const.SQL_NO_DATA.value: return [] return list(rows) @@ -729,8 +729,8 @@ def nextset(self) -> Union[bool, None]: self._check_closed() # Check if the cursor is closed # Skip to the next result set - ret = ddbc_bindings.DDBCSQLMoreResults(self.hstmt) - check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt, ret) + ret = ddbc_bindings.DDBCSQLMoreResults(self.hstmt.value) + check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) if ret == ddbc_sql_const.SQL_NO_DATA.value: return False return True diff --git a/mssql_python/db_connection.py b/mssql_python/db_connection.py index 4d1a311e..e02bafce 100644 --- a/mssql_python/db_connection.py +++ b/mssql_python/db_connection.py @@ -6,7 +6,7 @@ from mssql_python.connection import Connection -def connect(connection_str: str = "", autocommit: bool = True, attrs_before: dict = None, **kwargs) -> Connection: +def connect(connection_str: str, autocommit: bool = True, **kwargs) -> Connection: """ Constructor for creating a connection to the database. @@ -34,5 +34,5 @@ def connect(connection_str: str = "", autocommit: bool = True, attrs_before: dic be used to perform database operations such as executing queries, committing transactions, and closing the connection. """ - conn = Connection(connection_str, autocommit=autocommit, attrs_before=attrs_before, **kwargs) + conn = Connection(connection_str, autocommit=autocommit, **kwargs) return conn diff --git a/mssql_python/ddbc_bindings.py b/mssql_python/ddbc_bindings.py index 488f2c7f..eea4659d 100644 --- a/mssql_python/ddbc_bindings.py +++ b/mssql_python/ddbc_bindings.py @@ -6,28 +6,34 @@ # Get current Python version and architecture python_version = f"cp{sys.version_info.major}{sys.version_info.minor}" if platform.machine().lower() in ('amd64', 'x86_64', 'x64'): - architecture = "amd64" + architecture = "amd64" if sys.platform == 'win32' else "x86_64" elif platform.machine().lower() in ('arm64', 'aarch64'): architecture = "arm64" else: architecture = platform.machine().lower() -# Find the specifically matching PYD file +# Determine extension based on platform +if sys.platform == 'win32': + extension = '.pyd' +else: # macOS or Linux + extension = '.so' + +# Find the specifically matching module file module_dir = os.path.dirname(__file__) -expected_pyd = f"ddbc_bindings.{python_version}-{architecture}.pyd" -pyd_path = os.path.join(module_dir, expected_pyd) +expected_module = f"ddbc_bindings.{python_version}-{architecture}{extension}" +module_path = os.path.join(module_dir, expected_module) -if not os.path.exists(pyd_path): - # Fallback to searching for any matching PYD if the specific one isn't found - pyd_files = [f for f in os.listdir(module_dir) if f.startswith('ddbc_bindings.') and f.endswith('.pyd')] - if not pyd_files: - raise ImportError(f"No ddbc_bindings PYD module found for {python_version}-{architecture}") - pyd_path = os.path.join(module_dir, pyd_files[0]) - print(f"Warning: Using fallback PYD file {pyd_files[0]} instead of {expected_pyd}") +if not os.path.exists(module_path): + # Fallback to searching for any matching module if the specific one isn't found + module_files = [f for f in os.listdir(module_dir) if f.startswith('ddbc_bindings.') and f.endswith(extension)] + if not module_files: + raise ImportError(f"No ddbc_bindings module found for {python_version}-{architecture} with extension {extension}") + module_path = os.path.join(module_dir, module_files[0]) + print(f"Warning: Using fallback module file {module_files[0]} instead of {expected_module}") # Use the original module name 'ddbc_bindings' that the C extension was compiled with name = "ddbc_bindings" -spec = importlib.util.spec_from_file_location(name, pyd_path) +spec = importlib.util.spec_from_file_location(name, module_path) module = importlib.util.module_from_spec(spec) sys.modules[name] = module spec.loader.exec_module(module) diff --git a/mssql_python/exceptions.py b/mssql_python/exceptions.py index c2307a5f..b761bb89 100644 --- a/mssql_python/exceptions.py +++ b/mssql_python/exceptions.py @@ -645,6 +645,6 @@ def raise_exception(sqlstate: str, ddbc_error: str) -> None: logger.error(exception_class) raise exception_class raise DatabaseError( - driver_error=f"An error occurred with SQLSTATE code: {sqlstate}", - ddbc_error=f"{ddbc_error}" if ddbc_error else f"Unknown DDBC error", + driver_error="An error occurred with SQLSTATE code", + ddbc_error=f"Unknown DDBC error: {sqlstate}", ) diff --git a/mssql_python/helpers.py b/mssql_python/helpers.py index e8e03a4d..cb0fdb55 100644 --- a/mssql_python/helpers.py +++ b/mssql_python/helpers.py @@ -46,7 +46,6 @@ def add_driver_to_connection_str(connection_str): # Insert the driver attribute at the beginning of the connection string final_connection_attributes.insert(0, driver_name) connection_str = ";".join(final_connection_attributes) - except Exception as e: raise Exception( "Invalid connection string, Please follow the format: " @@ -62,7 +61,7 @@ def check_error(handle_type, handle, ret): Args: handle_type: The type of the handle (e.g., SQL_HANDLE_ENV, SQL_HANDLE_DBC). - handle: The SqlHandle object associated with the operation. + handle: The handle to check for errors. ret: The return code from the DDBC function call. Raises: diff --git a/mssql_python/libs/LICENSING b/mssql_python/libs/LICENSING deleted file mode 100644 index 6d9b0d9e..00000000 --- a/mssql_python/libs/LICENSING +++ /dev/null @@ -1,19 +0,0 @@ -A. The dynamic-link libraries (DLLs) in the mssql_python\libs\win folder fall under different Microsoft licenses. -==================================================================================================== -Below is a breakdown of these components by their respective licenses. - -1. Microsoft ODBC Driver 18 End User License Agreement (EULA) -These components are part of the Microsoft ODBC Driver 18 for SQL Server and are governed by the Microsoft ODBC Driver 18 EULA. - -- msodbcsqlr18.rll – Resource library containing localized error messages for the ODBC driver. -- msodbcdiag18.dll – Diagnostic library for handling error reporting and troubleshooting. -- msodbcsql18.dll – Core ODBC driver enabling connectivity between SQL Server and applications. - -For official licensing terms, refer to: mssql_python\libs\win\MICROSOFT_ODBC_DRIVER_FOR_SQL_SERVER_LICENSE.txt - -2. Microsoft Visual C++ Redistributable EULA -These components are part of the Microsoft Visual C++ Redistributable and are governed by the Microsoft Visual C++ Redistributable EULA. - -- msvcp140.dll – Microsoft C++ Standard Library runtime, required for running C++ applications. - -For redistribution and usage terms, refer to: mssql_python\libs\win\MICROSOFT_VISUAL_STUDIO_LICENSE.txt diff --git a/mssql_python/libs/macos/lib/libltdl.7.dylib b/mssql_python/libs/macos/lib/libltdl.7.dylib new file mode 100644 index 0000000000000000000000000000000000000000..e0999cecf56238fd94ca4a84db00fb5a8a7a66f4 GIT binary patch literal 93840 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 BzKj3> literal 0 HcmV?d00001 diff --git a/mssql_python/libs/macos/lib/libmsodbcsql.18.dylib b/mssql_python/libs/macos/lib/libmsodbcsql.18.dylib new file mode 100755 index 0000000000000000000000000000000000000000..f54bd9d287d6495d231b1e733e18dc888ee44d76 GIT binary patch literal 1673120 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 z zbqgJtA&>n|dt4s-Uk$uLa@c-gDSk8_j~$*kJd(enl=mKUVWjIf{W!yKIHzgd*K;$5 zrLQQ7JA*Z2o6+3s9M;G16W@(;7tSinS`$!btMbMKbOugMhB9geXI}Dy#80-gmMG+E&Oe>DA#kJO^1oT zRQG>jT0V*P+2VY7!g=t9h46?4@QV5Djl`Mkw9gr_wzFtkFkb_v`gu43&$Z;W>@Rz7 zaCGAP&*I+`7Y?kQz|!2ukGBAuPahm&VLwCnIMm)4-8qtY6q7qm;9WY8*68eje+_o` z)$fq^j`^CKhdw^WOPC|^E85(qxl-O=&2cAs-~fB!iTcG+BNK z&!bDCo_$^!Z=F{*P+#YS7nzRGr*`O=y}*(u1>=4`vgaR}fv%W5NTQ!IkC7vp2m8Xl36*AOw;G$|r!=`{!$$boxG*_uxRwTWY(|OoR*@Tn`P5?rTfiE$;j!e)&e*Gb7V>S)&1MeR({Al z=-B(lL&2o1!d2dvHwKf&6tyg@drp6YLG1+c&2t^B?_4MH~ChNPeeCS8{9By3R2z^&6jZjSg+)-V+nqzStbuQ&h8lV-v}he`%!Z<)$}@AK^}jG;?y@Swr#u0bSp5e4%%a9MU&HJjz#D zb+7i29%$fQ`hb0*b=^fq>-wdxP&qiMVcxWlWkUCB!Kb&(yU8j~-?IOhBws`3H>GEb z&VIV5uxoTE>_*1meRzZsxt(W^c8m@k*rK_TUckD;S!d4Rf#d9$txoRg4SyXyy34a? z|JSLj^~ju;CNbyC@d4`H<>aeenz%2-pGTC7o4L8cnVUr4s|@Bw@HB6?{42U)L&AD1 z{UDyV;*SBWgTT6za-DAF@Ix2M+|D_k+?{jjGx*Y6HxuL2P5hd7GT-PBnv?k^FGDy5 z+C9VEiyblYWAO0fqoYF~oyOQio8)}r{)^V9Tq8olRX6i0JiESvod*3x3|Hqs2VL$9 znhTJ-!Y6?naJ&D289KoJBOJbsA4~{5hAHDQC+|t)j!%C-{fAOlCPdWPjj=HGg8*;*hgpEbJ0z`Ow&`>O+BCK*%Nk;u;Ewq z!$07_Hyrr1v!{!4G57_*SKgar_4&K;eGc`*d=m1Gk%gC)4l3lae?2 zvDY3%j>ng^yc0fz_?D{Q)%-3c)?>%dgy{x;e##6@OE3?@HggXb9P0m=ojJ2D5PQr_yes!N?L<%Y6Et@w_xaKawkcDgf!NMs6 zabe5`9{GL9EfhL1H4x#>cWZvSq5W*?9fbCafR$Y4pQrUO*c^0E4n*cLH?h9eIDMPy z%tIRe>b;h>wT{@=q+99GzV6Js<|P^ZO15~Q%Am*6nc-u1a?2&$2|JHHZ&kKuuXs|! zW3GA^c?1qzm&CeBWBsPL+!nBNSSn}Gh1*>9(~^wCW!%Sd{lnh9pHi;(+6$V)$izBp zKf_tzimOhhZhFfwWQWfrhcLe%!*Al}rjvVwlp|9#eKmK~JlZ=t^!I7~bd8S>dxp1f z%nK7}&!TN;?=x`N#hTbpdk6TwiT)3X%kcwod8z{!cy(dsxo_Pt&%(>b)x)f@T=8G< zG90|X`~M=@rsOzd+o!B=lY4hPCszj*2f1#U6Nj*L!b*?gAlG{P;~)>a_F8cWJX;Dq z`}nW3vaj2P&flo)VvM5AcJ_+>;9I$&&UMBq-eS?CVdRP)y~B)L>r6x)eaF)jagNq{ zjprv8?vuuZZV~RG@kE~7!99!?PtJh;$=|`+%juv^i$C&A{P8{NHl+8?J;MK6m`m}! z*YFdtXbnI0(${aAQ%ihE_n1Ir9ec{_^#m$@=aHcH%m`JE@NF zhtb`(huDjfo!r?T=z1%>b?ZZR{;!{tJ3Dr+$|ILyhm$i;`4>*4pBYZ>Y~6{44v%;f z;IpTM;Q@+uZ{m9z-@3atUFCn`t}wNBI6F<^zhKrnx$gv1=S4kh(lb7KHj-yP*1z&4 zy6CHNVUt5|-!5`t?;;oWE^=Y}$c1g`KUnVu@mpO7+@a_2fffFCyoPK+9CIf0<{pm? zfp?q>@BIVsmA_-*lf<4(AO{5g`JM&ns__x>j5l*@i}073%=cIL|6(*p>+JisFT)cF z`n$i_`n%QE9@l)2Bg-Vjw_S47tbdVwbjU)-u1{R9_Q;2v`icAP0_y*s`Y%)ey8Wkw zN;%ud)`TNdIsHH{0GuB=aPkxK$ejTk)h!)oo%NhL*p#WWiaNK0@Ay6*yN$J0`5!oK zbS316N}~s({4eb(;)n8)th-NAfd zU*Nz_#N**l&H4-f7dXlD(GUA$-sy*brMIKeFs+Ph@1eUo~3KV^3kvW*zS5 z45E84&#AS2cdE%(syP=d?jXhYGT*u*TJ7tZYpC_Z{Tss7E^8bUTk5A6$a=~LJtby4 zyI1<93THfu;rj6nl8=lD+FP|p3>MF2ji+XKC>(e0c$2!4D<8bx_V@J?H&KRP!j!Uuhomj?0NiTf3;p3w@3ZbZD18n6Ke9~8iO4d# zC)X>xY2ItnFZG?DoM%9p0}IFQChGAE;nK_0ZPHRMsF ze$c6(l~DgP;#fr^BY+`2WvO%SYwNUqvdz>Q%V)7&cKELtk&@$$Z684!Q#z-F@S&*h zIODUiqRpn=bVhb4fG^d<@PPRxCx^P~ z?hEc@uMOer-S_cO7pjTE_qEtBvhNd?y!-t!!bgirUXWZ|AAIkk6gi zJeLD!y*H3cj{DrIQAVz33b3=x!(He=J=?QF{-(9$9cuZY+1vJkH}LNd@O6lIs&5N= z-W^++(V3O&`7kS_Gd0gEJxS9;yJEj5Ob_Xqb#DuP8H4#`#OHeTXkV^j{hRFL8Ajw) z_+uuzKlvub;>1?MKl|byuj-E#8@06G_ig8~>HP^?4(2|L5e+N;eW#sUL~_6OZuyof z-f$0imY>s{)8|L{U-3BkxbGikJOwSF?>Z$!->jIi(!RJe)(`Mr2A<}lF(FpuR`x!@ z@0?+T-uUPL9;?Hp(TV&_kS^HEL7An1$Qd0;^KCF5>61 z%?T;u{{i#DRoMBLti_I3K#W!aYyLxgb~Ha$TpIom@+VjWeifIt^#pf)$wXu{%Eij) zeaxRqWgekSW?JuD!NX3QGn;3#Igd^_5}o}kd(96r&v#fjyWGK9Rzhs1+ril#;A}l( zS>_+Psc2ZBwFtgE=sf7o1?FMlAoK9vCpPU=08@S|+4!v#Ee_-YbMU$44n@H{Z4j7m zI55BEz?3hHC!g4FeBFf8)tuqySD#_w)eVmq&b}_Zj_RE=_&B)#fi_c}HoG1eC_nwy zX)}*D2ZzBun!qp}82RL1;~Xr0Z^^}vJ1|ZKM)W%Fb5dNQGygLvr+%KIx%CXu&zenE zKf~+owVK$^duih+XXpa#$bGnI7>J7rw9(KL9Re5J&&fFcJV+ar&NyVt8x$AZdC>)o z-wy(#6c~G{?-LEPR(#NJH)~FIRkw5ytWC-Eo(o1-YTe40zCe1G1$K_le-70)XF9dL zd62dXo&LW73=ec3W-i!o?hU_e_J%KU^@d+|^$wUDTaOWZeg<=c?tkFAoZPo|f6x2Q z&LQwh{(0fGa*%$_pkM2U8duGIR{gR;>W`=XE!59jVaHI~K0n5Ui~kheAUl=#ciBH| zd3`~JeWtpAcmK`jP<3Y@2cUoIi=hm=ec2iK@zkJ`l3&s;&PJ9$CHyj;CLB4%+P8Gi zZ-?X*@b#!!O~)@XQ^WQ9`av3)*KUx)+9*-d}4`L^T; zWQi1bkItTc^w#9y59MWL_e>{0+za?nT@#INyAxSrD>~*;{C)|&-PYWcO>+-1xV`*0?q1j{d(Cv_r-8HE2xvqw$ysZ~K7}dcWo+J= zM&wg|A4O+S`seeu7u-E;`=yTuB9{^$+>A~$4_ri2j7UCfv;jX}`Hi{2?HUK3k9ll5 z8#@v2v_EBN4(GcUS_Get}Me+c?E*tZ+uDd80p zHn|v^^v;`stMbZQqA}}^1=(IKJNa7j{^*=d%pNwCiW0`CJLNO^mK@=2ciZoY^^xzK zp>KRM<*#DFTFQ8{*z?)%OX+t_a`-nfT8!_O;*yTUH(CqKJ*N3v8U>pVv*_{a53&0}iEkPIhcdOTiJotU=X1NSUJ9 z_~1+o%o~Y*_Y|IsC*-CW1E-QugdSTwYN@}6$=DX$t8e(*s)m&j*Z>q2y;82tm53}E}9-{Hk~`Hkr81Ng?urx4kJ9IWK*WR2MI{C2rd zlF0@4dX#*^w(n+sieb@pFZ^F^=ea%QJ<#Q!p|yv=;mOSPX66I_VEH~?g%9N+_mu2Y zf&WW$bjoSW_1DUNFfVG3EpKEj%rWP)(LI`H`SNZy@k{3Hzj>I;!XbA~k2|IC-Fd$- z&BbqhPEI7wZl{hh#_iy)u@~Ccr^|2oU3gM1<+}K-x%TZvzvsqA1x`GTW=QsS4`U3o zP7O2A`T+MXXe|(@QQ;f$Q2G@5T?-wX^t~JT+|QXR8`{Y;k}Y~nW}L;)s+)XaJ&Z-Z z*2~S2DWeLP&pWm3ntAZ(@+^4tdd9Mubv1*r+)7^*D_V<*C2%58PpC`NnY{2j{o|zoqx{Vh`H| z?);TwQoZDE65h(ep=Wc1-OF*a&e~htxzT?ct%{58bPwO!c^dh6e`)(|l{)uxn()xl$B46I zZ!Ep)f>sayS@Ckr0DPh=&GIy?7!kvN!g=}056yb{c8SO7`)a;Bce+9*c`RL-p#}I>gUpr_;RJ(v)5OSbA`sVk8-D|zx3xt@|{YD zTk^E+OZVxuN%c+m(oM8{>BNV~x6AkzerDE}JgvA)`O;0~tg2jP6I=d3{dv5XeqtN_ zi{%b*aCwiV%fJ^_{o6*n(g{?JkJ%K)53nhG3!K6WVtNawE_bL<_fhH!&;JXJX&&|v z*W~yi-4pMJWd5G}qlqtw?o1xi4=KDEnFPOCkMt?B!N8lNvy9dwQ;kR|bLufu&n%tc z-Y#5A=Pi58ch3q`?!V6+dK-TK&aYjef3J~$&V-gN^m}iO?Xy@izISfdF9WTb<6qRbge0?<`m&JEoc+-aZNxLEo_k!(7kh%G!@Z67r|LcVIj#5JKqLv68mC~a z=KYC!FTY*Y$0sQE?n>UN{_%QG?hm_u|9jEj34A8$JvoY=qJGm|`73=os}QFknwkn7 z66e)&0GvseA{tF{?lqN9$e)Oj`4{g!$jbO!9WG;>3&24V@AAq|m}l3s`}!Ph9mN*c zOZfmgCC$xRb*4IhqYg6Agr}g* z1fO?jO%Z2FxxY{@Jd3jwd`fi4`E1`@>J8qfY772zPM;EWh}SrM>ez4jtT}Djb)KTm zSoY5cpuRjGPZ}DJ}!lK#^Y^)(?{J4+Q%2M zF{{pc>R5M!4!l=%5lpfr&fIJP!+0E>Ku`$Iz?}p}MV~c<8?|Ytv4{bl3GUdx>tej(tx`B<1 zo!x<+uH$*)C6Rk9SfdOZPn=z>|C~)MJYw&({v!ukcy|5^ZweA#tIQRhbR6+b`6LyJ16lUK@Gzx$sZVa?rwN!7vc zIPXf7&w%IuUY=y_qc%^Q*z$jG+x(;YVASGKwfKG$vr&E}=SE|Ab?{-z%ZJ_CU(6Kc z28)EDjq#ag^Q2pn{IPw-Q@IGd8aY?Fs$03&_dmwG6GBTlL}ooPE~Gs;pMF=LXtY{z z8dE}diYE=a4{xyWv+qYXPf?zb__c9M3_tNQ19GL-#viG3>QJz2eiU3vxn~{NH3|MQ zS39sf{t>tCoI1Zy9c0x(`(3lq>cb-r?8XG0_Qf&Sw!O^eJ5HSq)Dd43@6euJ04{6Y zsi|e`;r_~TsnBe;_VG^kS?$Zy$nX4b{3Eup-@?}|KSaq%vW3NH5y^gAr&sHcs)VZ;!LrfU)4qYv3ob zcjwt_;6(b@K@4?<;VI9*K)GFrQFi#9=&Z;oA1Ji_;XlUyJI|e77b~Oo4q%5KL5_;H zla1L1KC}0bp96f%R$OlJpInD)&{0^idJ8l+__HoBB0gYXhso7Cym1e-lwsx?g+@*c zuG*gEw9WmfUs}uMv3D22Z=Ss%H=`Z9J#!G=aY1e=ZATXvtO1-0_Pv4d z$2%}OfuVNedBr8McV8U@exA{)*m}W#UGVwe0Q~NZ{9GUUs*KtA4bz{xWaBU8kEVv! zn#R~=Wu^1{-sHMWVzqofaW7WPMh9gaeMh>#)26$nJVQU4ir;8!JU;&I#3p23Z1?v7 zZO8Vd$H*-rzL)tmr@w2#N04$?k$(c&8hq|cc?LW$v2hT)n?v*WAax}-seapK)LFw> zz7`!Ad|h?lc-EHF+OjzR@GhgmtdPD!eT#>4M;x4zlWaJuzssrL;75*5s8bnN$H=7b z#n8y-#V?b8d)s(q2G!?W72F={!?%0q?x##=IUn?$?9(mBy&(EQFNAJJ`kTO;=yT&} z_@NlyzHRq8exBcmy(=DMp3gB_#RD|Y-_$(wzl3?tFeY1TUgwHZBQV!Gqm~;_#kYHN z9Bhj(Az#P%l5ibZijMWy?pzBemJDpm7&+jiI?I^d`RfI_zay`P5yj^y@qrJ{TV|IYG z+emv_yNb`u73$O( z#S76K^wQS)>f&rNpXYkFpLc;h(HvW5m}H%i4xmr`7w!C=cO|>2ccdTYl}^1^cvroP zcNzUKg@2uqUgVwDUqc7;?98pFe?Qt7o7)n`+X;@&gJBL;Fqgy>N6Owe4}`OzywI_jbk|uKM9a^^-oRT*&Ez znIHq5XZ)!8^34K`X{&9w4T`SMhAAm<8iQ^ItQt< zWJuU|Td+GF*oo_CoddhHDIT_6=Vj`gJ0xu4)#&%GL116!z^;8X9=2WQx70atDA@QG zTkGF}-I%aGzU9DfdN>ZYQ|D3Yj2RO4Mho_)L13Tf!0y-_58JMD7j=3+8){v{+rY_f zgTOx3fgS#FJZ!tpP1NE3u_1WI?H26igTS8b!1ip6hi%s>q0a81V3XHM{l07v*oFh! zw;>L;Q>TzRzaA2Hjm0za9N39`wEI1K%@@?i!?x?3Nu3`L344tN+cya8eGcr>P&{nA z&Q$8$J``-uoZ@xk9N3NH>Ia;GpLJl@-W3Pisgp#V9}Ee5odx^THTIfM#K|KL?54VS z*mj*m)FD6j;B-O`LG7;xC};1l^S->lnj0-X{5Pll#PxMstoe;5bbsk4SUhmH<4Pq$gH zD+hr+!+~9Ub3AOj&Nb9|Z7A3^Aq)1EgTNjco8Ogju$?-WQfJ3du+94{*oy{%{m~(N zJ$Kv?2ivLh73wq%345IdJI8^YNIP#ju){0jVcT_1qE2W?*yPP%E{_|e-+yvod;VWM zY`e}_>Z}?P_FWe2;STIXoz@c$Y~S*D*mfP9UFxp__5{u%%2O>rdie|}$Ds00S-x86 zl{S(HZ8y#nI>-JN`E|kJxo}`1LQRFe$;Rm;(t;#eavVWHt+;eXjTZ_3* z!)t6O=hYLzd~)m+(*6k(*OK$vWAz_f(!ODqjjVBnY-E3Jv2w~q&?h`8|Cp|`jL>!1 z&6JZ#I)-YVDW6Wads4QSe9&b-bTwD~(A})Dc0nt$!(|x_R*Vn|rR;)9vW zPZFAh-b1{hiCAsvJIPlWdMX{imotsSvQO2dn&b9U&Zw>q?xc@5G`Z@DQP17=g%x+Z zuX&ko9)4ek4RolxmX%t1l(J}aw(^d}>g5yrtGeH#ZdK9P%J8hVTu-~b*7h^Uo*>X`7NJF`448J zkCi{tRp2|%@gG#qt4!W0w_7&;gVuZgD_^mm=gEH%A0@mu*dAC)bl zI;i}b$`k$l-O%=T@M)WF$5`sSsBv{LoA~r%^v7H1mp}jf+%j_2X)TEld-=}(Y;$T+ zR%S|ZA@?QH)*@oc*At_&{-5JzZyI|S^|yLQ*EOJvo`nug@vr{?@uQ%7F@1|_5-xu+`iTa0B z|957^snp#{y)k^MS_SVe;N1nhJArq1y5jg#unX>H{fwmUi+rFdqA($QA~_a5NhW5F#q*QZ}|t9i-t^xJ}4^PgF< z{?@IV)_;EW%P*4O;1|rxOH-zW>b8!Wy65upmCH{t#{HZetebDO^TCb&_@}}5(i&F0 zIP=ByttQWDtHB>w)d-%eW*ZgPKzrXEcj2lm_JqgD7kYAdO|XibN-5Z9b87AmZlf-G zvM1vG58$JJv16O=4mR@siE2kyNU#-N(PPV+zGRE{T6L6jZwWZM@J?g#<}+Lsvy zjxiMZCs;IiF}{E?8f=D6vY~-uXkaP+jDGorA}fUPvGN}mxX-HBes*Y4W!ZM&o^bw{pIQSB{Q<-x~N@3;%Jugsm4*}RR<4|-*de=D)}~Yah?46=G1HOTdelZU$ut(`la`qi#_1GEX!Ez=Ue?V z{1>gNEnc76ymWo)>@#Z9v4;-0Bf1ZNCVm0nuLS%xlAlsCjI%FVz9GrruNK{FDeGAI zXy7*!Vs(AgZKAGe-uSDpQD5)B!F%PO4bZP*a!VL|Co_((@w|z98KA4f<;;5%KJ&HQ zk4%LP>ZmIDt z$#)vP>%Jft)L~)_h{wq5Mi$^(^VdupvL}mw>vs_!?blzb53D@)o(thIdF)S_$Q(WR zp6S_A_-rxtcT=~VkCg|8eWkAqdrm&(Ri=gai}+|B$oaXqhdrfulySJI;6p z-7$}?ST}QbdO3G=t6!?KPIV|(&c3$nIP;Qg*h7BK9#VAc&o>pZhrGZZ!Wv91+B$OT zcHuR+!r3phqIP3mf^?8 z+KgyEE)rgl1qx|feK;mw!0S86TD8t1RWD4~RW0Rehd?sjE5iQdVt+_09hne3dESndGBbnNsSAZa%*`F2B56`Q=^Y z1$C1jGzmU4jC`Tw55Ack^E>Sv!n&u!h}~<6y}K_~nK%XQB{TW#Uu^rVTCq*YBJx*> z=RE}z``2+6F``}EgZS(ZUGlQ!pCi&ry@Xhf7uZjE#zu7-6w9R!Kw#Lbp zkLG^(hVBrUKG9uor1Z{h!Y98L-!b{?w7LS3bmES5Z}|TazcG#Y4V{0oi4#c14_SFK zm8U&}I0)tV_g_WMO=7!R*r)vd^iA2LynBn-n~IU$OE~jPCs(#_Q=qkrm<9H)oGkpW zwRd*UvVB|v$Omd)abDT?<>xL!Zm41{D9>h5H*){0>aV%dz{8;i|p2PMz$fTBGu#SNwnYwpq|=Tns8su2jPKjHo4>4B;TRvAeXx0m9c(4o6ygK_&PN| zwfcE7b+rEu-Y;yojAuIK+MtbU_Oiv~oqGN%?g!(%U+p}*kZ0{YQ{0>GqVJqxgid$~ zo4J**`vTU&`K*caSQ`sjBMZo#JHI*Vw)4tsFBkv#bbEh1)MX+Zs?eW z;d_DgpbY^SLl)ZTzfkg8CoG3K9MU~s1rdw^ja_O)}*o;fi^@1$!`-Ob1m54TI_ z7Km(^K5bL?M*PQ-4{G`CCC+YgA#rf5H_M+w`!KoDN{~A;n%T4X79WkBE5pbSf*-z; zoI9UKw{?Hji0oqRDu&!MGkMc^)~l!8v)6-c=cA4AG2j&dFHF7bh(#>TCO&o8@hdvv zQ%8|aBUe^mF0YuS_FWm}+s#rGlOEXlavW#x%iF1C)|ljc~lLwvu_ z+K$Bo&H$$Ju32Ltf3^1CQu^8reMyJa1)RJQ#u*3Q52bf-53cUTorO>9p82CI>)_F| zvQjox4KrG=A7!+TgnylkUhG}g{+%zLw>=yG*%#q?Eo;)Y7n`HXTMn3ei=JH18IEz& zr*8aeKK)*x@|i6YSB8I+-|EZva#sboJ#18rr2T;U*6rXK8K4GzS|R&H-V9s!lEJfl za9>70y337-`q_yr(oKAC-mqyaOvd8XUcH=iDRq|oR0&%_sReS`RXh$QO$>ULWI49%odp0EZbN;uqD&M$@_%&`*6Y za8S$ywbyz--yAGjh(C_@t;l!xPb8%ez7^V+w`X7onlxy(F?P7r626AA+Kk$ zm7iJq2Ksb3MPp?xYHwRsUN*0|#*RhwqwmWzr}Sh4OYJC5kM}FB_q3_^p9nwHRXMFM zjb{q|jMApoVA%us-*wx4yH>cRpNg?n&b2bu#jIv?aaBHNe$L57jO_=^{Y!;YE!p?Q zvhqIJS30e%X~vSz*sGp`uhH)(OQymHpg(eX+Bis|%@bG`T5oIN0U5@U=pwW7tHAyA zfu<4@gCZ1VvS3Nq<@j{0au9i7*W3OF0=K!?+SyuE*=F*dJ=1Hg9NT82O_wTnkh6-`&I`l$Tje_^)1Pvm)s_eNDQ@-(lf2wK zpE^Rk6g$UE#sqy{`x$%{+~yPi9;2}?pG^ZAYvx(Zm+*O=gU_2Be1dbIgU1f$02;CI z=phbOFzdjj>TB*jCiVw(x9`s-*8LRv@UUg8*e4un><#e9BKGg1Gsc99@V8Z;i=}U6 z9ezi1LjMBC(I@7-Cev7Q8uO+;H_qtqb3VUCM{2X0HcH1heIC!Z`pi9wq7$CChIewd z7XOLsvtX*N_lemq0+;$0tjpE@ImThh7$))8qNUh)^j>#WYFuvsZ@9{4IAv3UDXzH;pWWh2^hmyttM z^xO!&NiQE^-}G^}Yl*w<+_EEq?cT%2c7wZcWz&i0HDl?c%K9nGdde*Yjvt!yNjF1# z#N#y2k3^7>)u0r=Q7rh@VZnn)4+)@!(L~Xfmg-KT(7n!+ifMk!yP=);+H-58c!V! z8QUU^e;edI^~XZ^cS>KfV~NxF`%to#PnJHfrevkT}~N` z7RBFLi=D*H47L_;cFKxB35UcV?com4I;|t|$-8*}Rpw5-xgFja<0nh`9b20X;3=M0 zTlAoHITX*1rul1u8^2!F&I;P=+as2+U&Q19_RuZtdC@cA<@z25f4ju)g8{9JcXVE1 z?;$n#+jro%pV4?)dHAoJ)61YK<>$>He{WeGWo81pHFOrue>n^-NT<>aEtI*9%9~Tj$AS*I8oti@uC(lB z&_W@!AX}|9&tn3)@00gia~(Lud3zAPtK9a{XiD>b_C`C-)8;9QPUbFp^&eev;=5lu z?^dx_X}s+vN%jA?oLE_BpYSBip>V0bNRE;GB3VYfC?<2WZ*rbt4&g_V7qkybw(>BR z3}hJ1ZN^8o?EO`qOFq69I+W}r9vRlTfqN7mhmTazb>GK*WzhMSovyu)Q18)AIy(j; zCo!i#!=FKX=zVzZQPzCZv-bt7kkzW`UxD+xhCNQ>6z}35w~9lICHa2W;$puYPcn<= z%d&Q-Ki*IsB-h8XE{z#mfi*_XL)KY?GG4}*e7~`{m~n@ZYgMm2Yxl;VQx93;U>keM z7S4=S_!e{`x3z4!bmbn&QRJ(TTv#pn%1kTIL~bi)T}Yl=N&u z9LRq9b6|P!g(-CYH(qY(M*7azj&8(0Uz_&_^T#)=Fjq-8lHQU}9i7wNPF(Ke|1#@E z2h9#FwcXrqx6{e*->_CatR0i@n)yd@Qhn2!CEL5T_nMv*H+gdo-~*xhde54TyhVOjoh8ETKk;QfltmvAanZi^ zZm;P|QQjRr)4lek)p>JDPXumtblbAa0=WmPGUn*)zu(*YbjA$M6ptCLCh)%ty$mNm z|KYVvo%+1Gl>6YJnCl>`@P_N-fzZ{k)`c_p~jI+oqQici}$F;xEOX?5kN z1S(G^PIja@GI{guF6%5h5*zW)(Q#Y@zSiG5{F2QdnH4{WZj>|nU38Q0LSK5f`Ez&0 zyU^7&XRhDKe71Uqxi0bDTATbM=zTuC?|XcPlG!A$g|`|O?|T#2wfOzSbY;5Rwjh=_ zqvo#QQr7YVl`ihb!Jmh*b#Xp&LyvvyX$CY64JL!{@yxC0QEShS-fA}e8I=Iv;T8AT zx;S!a1OMZdwoNOH&h2IP90QnIPXTDZ{yRzaXI&l5f$vUmLvvfekJhkgsg(OzhGFyj z-t@N0$F{t>QaZvi<|CVa9Gr^I9=Y`q@YfwR{H#H1{dBPgFCZ2~{#tFh@M?U(nij54 zooa4Q*SS&mFL+oZ84jH|`YUUVWUxlsSr?*x&qqIenKN{se6SFkvhM3D$-@T_{?kN1 zm(dsX)pNt~mkb*>u%Fg?jqBqtyMK+zy-8qZA_&TUv$pA;o1FaG8 zRR~PU(vm%NPU<8ML1QqXXYs4g(QO})>>-|YuI_?@PT*C7BiFWr3_mg43DPT z?yA_uI5iKlU;m9YdJx%xJBudI@)~>fT>Fn~{duh84(`WPOldi|@>}OzcZC}nZIO3s zYSE}^sl_$!ie=O(8n!OI%5+yO;`cIagOVlvXOJ&B-@ixr?_~bUpy|Foqo*vKp?(|N z^d0YSbd~y-e|~QB&M|Ym_-jbVk-sy#M0%+_WQ(rn_$~bv@>dPNJ=kM1;GG@R^Weu( zhK%Sp&k6Y|OSenL3ZpaX21nW8sDQO8JaG<4@qwQt@X~QCdAiIv?B|}CjOEDFg3GwF zfR%9(d7%04)A?EdL&o7k#)0gtDGehP0loWdRq-Qs$ zOx=CDG5a%cu5(s7=csF>?|IB@?)kOR+;Ed???Ld@h%ItH4x01-Z%pV1Q;qs;!Cnq* z^Z`S`&OXh7J)^C%{G_(Z3(b`5V$-N7x^&$YReYCUT6e{AcXj0tX!ly${eQ^)6`T!A z&^MHy8@R7$7Wew_y_vF)Bd1@(r>?PXW6!Ll=I}}G=EH7R^ZN@-tDlF?F`E1O`QVt) zLi+hE{XZLANhduO+SGW?gl~#RkfVXTebZWwd@BEE+pZA)5p%M@+uAmIVI;{2M2@&8 zW@Ar4CK%u2t+{XGX2aVvojvNWS7wITueZJaZDPrJA3%4dG9Jnhy-Plw$t`YjES&({ zJ>52+D@num6xmX6^C|BxF+xAvdFl2}-4%m>|I8cGm~6uNC}hp<>5F1%D#% z{)+S2UyN}bD~7jrptI+94t!pBrR|%D?DO^SyRDq?Y1kxMkJ`Vb-%mEj*Aq5qGw#}>>?v+~(yfPbHR z!$xb}V+U290n67Gc$UqDK3x~Y#}m8D0&I`kgKD9X_&sgFoGQ^qWo^)8%r4+8pj_42wm#uVaiH~Q z$a?Yh!nWVA)BfgQJ2trwZ*u#0jBDJS{8pifSrUHbnoo~w`QYiwS1 z$G7H6bLnC(b&qi87G(10@%7{$zHa%b)JR^DuGQ1ij;zSt4dlNXK4ktY*}me(GjOhm z7X=S(^yizLb7FmY_Gomr+P^xXZtYcCO`*28XWj=krk8-jp#h3GZ8dr`y`&pD*OS#>N<>KemTpO%m zPO2!EoG_;Yam6~J+zpgFiXB~Nf&pz0fO($4`DgQrUmQe2IKi(G%0`r`2CDl)- zAKJSz`DE}po{#i1@<)+wR5GsiF8QO#HZPwc`RY#K6N^z1ea2!`n0#BYEzsZv(4g$*S=7liGGCd=d*sxX67DVNerI#A zEc(k8UK9IRnfzhVL$HT>?wo4b9aG}$jwR$hlJA#vYTj6#aYn^__>}dWJ-Azb4e;Tm zJZsowmoItT{tlS+R{av^yW06~aK77|?@s5NE8?y4na+2>`7Uw3tDWx#=ey1M?sUEl zw^QHw4mjT>&Udx*-Qaw;Ip3Ym_pxFDl(+GS6X$Umy!$|&WOF-aLHfIAUMF7wF+81l z=u3V0lCqcPljnu|pT{+P5uI)2_UGMe$;M)bUjGt16NT}`@Wo;y$muN_kuSg*)Q65L zbRP!ihTIHvLI?T1!!^N@!`~wAqX&E=gJw4y#vHwGXC5U(iH4x_zBaTb`r0swc}&Ou z_Xhi1BpOnkvg6@X$e(4$8xaG!_*nk=L-}3EZ}MjD{R^;n%8&A6@TD9ylH0F$rPsB( z(tFUSu(!$g$d2KW?@>9p>jZbT=rg?Sw*B^D$|>hel{>vB3wzi~>VJy;q8MF!GkS!R zoj#wFFis!-n0@0Uhh!sujW;sRS(FnDTlTpI~XtW#@-IbJ2&HSD<6GvlCSHLj==>-9@}TfJ1GfYJBH-(e=m<0wW}O`YFAt%| z)!NqF93c*hn3`OBUe3dZW+6T_3-F3-Zj5PVX+k~vWfNh4#hU}LvvN+yS&ncj0O_`QF{&j-C3`H%O; z!!BiS>4&{JxY6dree~)3sQv-G z|9x%Qal&t0KX7fWb=KBeXsv%9=QEG_%;QdL?xH)5y&rzn#81%G{P`LqBz`0R+Gw7U zYx5iBA-40%{M6~E_{~Z5(;%-*;u=m#SQ`U)0CA~Z;P{tLKW)0Q`$IoM;_KXJjvu25 zeYv1BH~mbazr*MszKm-~7>G%Bxd)*hsFPHLtG5??T8c!9lzC2~4 zLOam84Kr`wC^-A^0el)?#HIy?mFu{dwzlxwo>#>X4r>`jK6~BC#@?5WuVRl29m_MW zv^sL1=gzy^7$^TmwJmzS%vCb?H?FVEeZcs}9Q958QvZCElb>T7{gaH^gkQK1zoCza zi<=66(|eU=zMj(FA7A%3pMQPM-;S4@sQp55ij!NWuqQu*&ifhHNl>2BuHVWocr5J~|@Gbyfyb_&>V2uEd<{jJ9HZG5hAmeYl zneSfoX!0rl{N|zWs#o9D@0>59PwDRG*m&pk7SG+u|L6j9Z*Q^5+`E{2H*=rV{5iRF z9$;^Ijr$wBz@%cn65G?syXBN)EoMumR+-0~GHt9|>3falo}=7;%BhSGd9SYwcU5{4-*X=5drvM$!HCtrhP8s9Ym4A`;>!7eQ%X7Axp0+J zhPzL{6gvwpt#y_0gneJBXPe2Lb7n;cYXM!#6aL6FOZJ+D9w_GXl{dEkzS2zMnY1o5 z>akNo2N@3%6GYvNAH$!)Une>Qy>D>7Gk%N?hxeV_Q>y2JRV$xve7j??^sGtG_{5(1 zl%o|p=XA*ugWOZ9`$+|}4gHC}2gU_}Bm9^=HN&mEiiQV00(80aa`d|JuXtZ+$)owa zn|@Cqw=ij1YF>@4BQLB)4w&t#C}3RG%=t3#Q#9=OFZr*xW1sQ)0+j}OL-nJu&Avat zrM{ob{@%|1g?#IQ2G#;6leiw0^YOd5133-7to|2+s|Ijd{9AWLHFYz2ujlCHxA_Bs z*5=Qnvn6jg(pTTtu+@+U*l@}OobN;&cuJH@IdhK2oc#}T;N6DAeb)lJtMHrRR1= zf0?Q?%!ig-*Dnhj#Kryj8%gyBanA-Z&xWV^+=j2<_b>xLcI>)tKBqTZ`)JN@_6={2 z$;@Y+YFKA%Ypr<~MzY9z(nyZc{j_s0<2aV=*~T1pvX0~X*71e2?+Zo^ch>?VwqD;m zh71tPz3xF*<(Yz=9eqz{Qt#YS^j99v=$b1%t0tb^dN!>8nRHjyGjIR1&e*e2{m-;# zR}*WcceqxZr7B05K9;>S@+K5+{d6NQVKV2#=w4m78dlQ{OpHS-!!8?M?RCqd(U|bd1qD z8M-bw0o!Vl5h-X3RQi0xa$JvpZ>G`8^Ge?diiacC_#Pv-Ff&l;&onCYh(8oh$iq&^ zx?j?b4}tXD&B*6#iL=RQhrjY%@_Oz6$K1QeM^&Bs|9j5_*b}Y^fk40}0WXuFt!TK! zOEV!}CW*Esr1jPs5Um5zw!zvOZ%IT?C&b%etQG7x0cy`AYL8m5#M%+c93G zkhhvrLy7ake`Yx68TwM}oP1&4Sv6+F)|>Ne8EyOduR8s;CTC6xQ0Rz7^Yf zZ(;Ay7(&GBtsq`c`h+h0!*`yssIYMr=SN>|bktvk{+GS|(kG!aCj1mS^6&*tJ&o+! z*$;baE`naCHsXiiGiqkTE6K-Od%JwRB^Q2%dXw>f2pwy9uwq$e>#EdM2|6|`-|}W? zs9^n5>PSt*d3&MN$$sJ5?-WysU8Jvpd)eyNd=`EIpNZ>KmVRhXv+*HcYG1v!|A_mI z-U)7Q{a5kdu457Y)##N|(~bFKkx}c;MQ1|&FR}k!2VZ*kxjBhg?CQZd*!|<3JO%As z$5H1?T(wr@+uR7O?fC(R8fYV$!CbF13Z)m4kLVii1;#6Ihs{T2J{gj(T&J%7OHz%gLdz;nS~I!yLN`%LDrCue?) z_@d}Xr!3I^G}sU7kBXkw;8UmPj9cSr=b7*=$edJz;~^8@3v7w<6^p{N4)%kX1=|m1 ziwPc?H8JYLzH@)|ZMh$d2`s{Qc_+NfO7SrGD$Acqc_rZoDs_%bC*LaW+&$C17v4xR zd>dEk<%B!JnO=A#>E%>kBXyO*BdI>|k9yXoXNfkXmy@2P2p)-;(aJn{q*Tswe~Gi) zUwYw%cV6Nw_tKMgu9NJpwzckdf+vl{#p^%aF&&&sLalV$9Er;R@6o71p2r#P`>qA|d){QImy=<1x=yVg~kS!=H5 zOraj0SKR~6<|^H4)x+MJU$M5TSnI-vs-Jmm-wfGf6>qKeU&Z_{;~i&yrOl?D9^$#* zf_G6r_hPR+F9-Yf)!1y_kIz$I(E~)LZSqClnC0)AjZcQgCOEdfAK&tG$xFjzcvo*Y z%OB{-f#=8_hus|-n!Kh6x2;6PKr5N%KCsGj(E)5pVq#JPgBKn4?D1G1xJMs z-vlqThx?7ziV)vDKrHeN$YCMLB<$k_@NM6}E&&EZ8j#A|GUcS%!ieeM(y`@_6 zR?APlHK&0)E!!N~p=Ad+rT;HN)5(vpe4MktxBSH6BU-i*zX%=hnvZ0OCX{gBO<%+p zy@@P83Yz$Dz~PQDhMmjajyJw|ve&fhi&54nMYoI2;uf!w{yzU5emt{XXF~O{mgDd%arpNbc{-wN z&B8nIfl*!3HSFV==mLQ<&8=6m?@J%kHa%jUR$LqXDt_Bn$rd}KTKtA+eDo@#L-XqA z7g}d@Xs*A*8cD{r5IGVK0aFg^&4gcdaE=(p25`;-=k)F!-tEH{xrM9hL%x9C9AB@I z+(y`u5fXK`R4k+JgI_0?EcG2vpB?vR?pE$4WZ5Axgp-BK0pbO}j(!9BnlXJ*EmgIJ zt}Gc)EMLzl1}-q1g_MZz?b$cVj_K8!KZ*VySmd$o^dZjvR_vS`SGWV*N$&U1b;!Av z^m_;Wj(H37m7jS7aaX5;N1O{e;8%>{XN&>=`HO1dOEzjI9~=`JLY%hBNfFHTUY%X-^tf_`>=BdPXD9X zEZpinh4JHKG61f01M9|Zj_q}){8Ji^+Fpyhkn45!kT>(Vw%1^ra}H4GdFJPJt4%z* z>!+3TguPcp1Rv#exQhQbLbr7uqQ$TOOV;|C%LBEX+qyZ%o)W_sD#RY<1NXzTed|qV z&I<6PmvfBbzvuT`<{uiA1r4fdGHX7Z4gL@-x&gQ!As#jMr3}tb)r;`&`J6zL?Tncec?{N1aE|`5j(jbclY5=lhWF*G(+#&k{|*=gXxDPxd(e z=Jo75fz8I|AbwU+a3TOKwYOhNomJp*06*+*{@eYS2TtK1t9|nedXG<*?bkq?q93m( zo>kpobX2Y9R}LMaO?LVL>%2v^7P>;;)kpDiJ9EDReW}H|5HA*b9{LMi3xb0_>Wh8J zx88b~TqWrJ<;OCUpPo%C#m9v5?z02f-}mv~>Q0GhU;Ae`?l)W3S)6|)d4IqB%gzm~ zJ%@GSV_o=jXRbFJj0nDc9rP=m{dnL)d@c9x8Xb9a)9A=s%ST7pm-n2^JI?vE`55DS z@W#Kj$MqEaQe}Jzr?p(}^VX;P)52N3)O`~DI+;G-4{1TNuk3x;cN27pU&!nC9)^ zN>F%#Kb2%G7bh-a?-jhSNP6bN_KQ5@EU|$DXEXjJn1ya2ztt7&_nXiOJm4veF-LxQ z)7XoP3W+O<9HNiW2^Vbb&4kXH)|{zxTP~l~O6(T-__Vfq@V(Q1`-g6`S-E43jjWs5 z_^W0Lw!X2%4|Hte9GSh$os;indV3|gQlmUGh~wJsvC3_Hq5S7~ZqrKJA9Gs!66RSj z)^|0PDb2*q%vJvbv>#)RvYDe6bOjo-y&td-M5Vh->;v!3A^r_mt>BrvKJe2YvIocx z?C(j5sH|ku-rI=$k%ZWWBve|)z3OSf}fcM&MKx@{s4E=ruHH6 zudmkC+c~uwu)pl5&!r}?*)_Vbv@}rI``gilvim6hSl=y8ly5}mqW?YcTRw6^6!ki} zS0sZ8H}i4>wJYP~kTFxol2fH-IkZW78CV^uEpt0Mf;yW#KbdLK>bh@NobO%(s5@BCal z*_VCLy+*+ty2p1me^|! z&B}vj$g64-pf}ItDl>oS*-Q+UTD^6?DyXpMz?fc;Gt0t&FZ{Cc#Ew$LAQ`Y zDlOpa=58zI|K8t&)6l(r{N9503HRQ_uJPCB9sbm~ofsa`>=kCsCVkIZ!fs&eQ(}CZ zon|~G-vw0n>DlOG6i3Cn$yc5Q!ANjD1b(Y5=acV>{oWX`;S7A=V|^|KPxLN~T&(#j z=09}0K=^Jk@7bqeD`1Zkz6r+~xDTO^2&PP$AG;8_7FY!{h@&kI94w`OOD`xHSXNPj z-?P`2zm`4VX%0*?3a}~dQF&yFfe`Nv)6=v8JedXmuxQ-G$R_Srl7m)d472mxHvZ?1 zw?1dw+4DJrxJS(ubZ3wDbK71I974!B@6q@7UNHvj^#E@oJQh6i2I^i>fAglatb4}e z+tuQk+P8xEl{@#89@*(>Uf25~F(S*M6WAABcu0@j%i4mcDG*&K!M?JbGv_aU&7uD$ z>jggQ{$VoQla35W{>2ICldtCtK4`0GRWdL2=ij4ObKy1V*zlSHyy(Y>@Y*|jbff{e ztmc;utdQ|4TzEAOgI6x_vhdjx44UY-%E}HYAIkyuoqO1Sd^ZF-j>wmJGVx^MqneC1 z$;dVj1FUBA&58IimHdHtAD#V;zH#Gq?7e)CY-!i0df{_32H{mdH(~-W(NVXY=Iv{g zX-Rit+tJw{EGG|5X^OG9=mhdDLQhtvq5C;$XBIXn`Mc9kUtb<{V5BmsDTeaLz~{4$ zxlTqfu*boF!6Og3-3Oi>d#=83%iBAzLq-5+bdI%)-vMCdOW;v1F?#mC2hPQ>_10E0 zR{8xAxA*t5hJ}&RKdk7_zp-xZSiAh#>Pqq-o<$kS3)U^{WukV!M9FPs*+QXC?3D-)%wX=@XPjqhU1YbY?@S4Z>b{PZv zN=Dnf&e~UqfCisXc?U&J( z%cm{NGAh5JSUA?1##)UoA#`uB!_Rr@_8NQQ0sNCQ+b`w}O~E^Kuhk*{&O@2xs$q;V z_Jk>BMw1=S!d_&t7wL@Fy)Om^*1>}YjhW=gozWL&yc(__c)0lE*LE9-i)12Al zz;bF|${)^qHU}CWhi1yBHA)QhC!tGk6GO6e&N1lH>Z5dNKskU}gQDS$j47Fhs}GVX zEXLL`&X~tuaPV>FU-K$?N3^7h_wglWZT!c~KXW@M*RY2Vk!vUqpJmH6;x+y^a*24X z{Sz0p`Eyfkd1Umpowdm_iQqoQ-QO9bxlhbxT5pvcfuEc2#pob*aPnon+?xGoP*7qr+I3{D_P8i)?XL#2v${n$CoF8 zNAN){USD4y`6Fz2e1`Aj#{fRXbYE=C>05@^2Ygob+#I+0r6Bm2%p+~5PwpNfU69Qq z`6ew;{T|w{0$-3dE4>Tg_gJe7$)_zk;nG))aoJ7r${EnVtGqLJ?FAp)HGLXowVs!< zAHK(Wc5x||YNSd2g||w73jMiDce)FX!>5?|q(Q4w6L3$C?G@ZNziKu=;+febn)~m> z6CHaGB?lVy^sgLw{x(ui^0&&_=12c+^Gckzsc(Dv_Oq5c+8Ws%xh+fIw2c^GZe^~d*$MMdL zVJANpUrP*(^niI$0}t^ijz1NtcT8>^UXPlxg#%$oku2v zxf)*YnUoPc1k;iEH_j{qhw>;l5pb3RNj{22X{+-=e~(Vn%-sSmrI`ivh% zEjrt3^MZJ#$~=#)vjH2-Kdyww5zmLOy=Qvy&4sJ$vs~II9f3`E)1dFgjvt8lAy?;o z5q-7aZ@~WcGb7DHZ>1Q?eT(9iU9{okjr`OZzW*B4;r8nQGRs813nj&NCB}HaLxWoE z{ikci$YWf^7#AJyd+dAS3AY~O`>Xi=jN^Wf{e?M;CVj8-+<~W^XQ6`cllvYjw&y$1 z_lN9nALiRp!`cvTSb?On_<3)qoqH*JWMC*fR5tqA+$ik_zjOk8ux?vL(=V-{OmX+>@g>GIB`hvi=8+mFJ*@N z=Eql0+O6`~+U~a+#P2Zwt54{c4})^CW}DMig^6|R+wk8lk!?StJr`W=;eS1ToG}YuRo{t` z*jV&G$6S+lRuto7xi3T=W8ssiS3UyXMBb5;Cf28upT~}Kef1TydE2)}cZ7aaEF0Xx z7&@P})nDmKR_F2TLmrg z0^g$jA^vl-20K$__9XNv@}a@EM)S0j`;`fwn)ox=3ep?1;?J5jnfTo(ZZ3H){P>{C z|3LZ+>(;;nk~g8V2ZPA|7J0ONxK zOVuf#tM}{I5F73A4&BhR*VTibezJli|Tv%MeReXGqk10U^|^RRdOFALq&g}u9O zv@y4pIqb6S-czcJxqk(lH!@^J9=}Fx-Xr<%9J%%vcD%<5`8c2JtpVqe8Sok98}v6X zmo?6cG!4tsotG#ZhR-%A=f{7^F1z!jkCp9$_o!w}=q7C+<`Dj7_V@Umr_uj^_g{@XIhuhI3I*{ixJyMkXjZ6rSr(_S0TZJAdx zOQO6*9X{SkPdcPL&r5kOzjOJt1QLC)=>OULkFqxxa&2K>4)M+!)skh~s+hAXopH|I ztUhQC^}n0{7P@BLFVose)Ti&Y27@E=`)2=HfdM;jLq}!=AIg{Serj5ztmm4-dzg3f@UC2AHmxfgGT8tEL(1v-oEN8^cvU&mS*)Y@c*%)B5btUIkq+D@s-#V&R8^1RB9w*8jsyi z!SoP&Kt6ebs;(in@}ZWj>n;VKL#=jx{wmX0B^%~S;w>eg^^qfp`&7wjx@SGj?M*zJ z$8$EwdC1JQk|R~G-&hQLZ_ zTRXHZ@3!{!dC<0(pl#w;{Tosp+Qu0I{>x%Fp-Z>Nfh}k5e#RsHpvGqbmu%p20JvNa zT*d>JDD;-Sca>lrR<0z|N)7TOH&3d@>l@|7bja?J{R^+X4p~3>{>Q*4=6^Q&hpX_( zu<;5%?JJg<&Duw@bI-1xg5Ic;d3}rhwisU*|Lzn!7la=lh-2a8n-j4i+cx9lb?GSXbf_SYXcCi(A+eTJJHG=^@;lb z-}r3*v-Nt&5B+tMJlY%#IKrdCbX=078LFn8Z=%2=#i+w8k&X`Zs zhfgv;cNC30)(yZk>iuNxe3G%IE*!a?9&jR5_{rw(leDvS?#S)r(oWZj)+d77CuwJL zF+L-k{&l!8<}_!2{SorMXlV>uO1{~V`Q#H6yFwg~r*+lzuR6TdCcf(m|Lf-K%yZaZ zZ}`{E%bGK(Z|T1d{_iX@GLG+4IA(W0`>bT0s2wAhkafIS{W_bVYh}qm7(XeU6)O3{ z3^+cV=b^g~T&eSkkdYS6h{Vc?GdaWY;qN+QLhXa)Da|)Yk8B_tkYi8$dO!Pj|BIeT z5Sd209?433`LEdLec9wSu2D`k@G>dZD}+C$&TROO_?N+)1jLt-FW?8)5Tnk!dfusy zn`qOZy$Q&5@^=X#bL~{0@agZxW?RPhWs6UX^zJj;VviYZrTowP!>M+@Omw36FKSh+ z{1khP6MdYA%DwaqSKH@aOlkkeMJdgmTLWvITxC<**K!VoZ9DoL@v+3__9L?>XJ9{m z1lA~HeiuG@UHDSz?2`C}TQ@BhvOc^8C_n^<`<1l@}Y4ZJyM={im>R zlLNb#J+0LArS@K8bhHtt+WQ&!0Lg3P(;}s%D(mZ$FO%)ZKv_TgTkKkVT9KJ%GDkt2 z9E?YIoZCII{#+Z@ZQM_;Klj}Q#=u3uOMUs>-WieSZ!Z}LlG9Z_3D}4#JDKn8-@+&1 z#~#}!;hZL9(o&<~edb>JWOy^qp+G+2e?K;{F3QS3!G>ST#K@V{D_K_d@Zwwe*3)_J zvI&lFLcOQ{T-hJqg>N(9=aT1HI+LUGdw<0S=J!wUi`3+yWX$}6Z^0C{6U*$ObD$7nAxBe3RD$DSr zER!E4F#_WlZ+Rmz0?0VzW+X0vxEY>Rp~n_1s_>s`AUEmoDgNq}xhHuCLcI6om5__b>$H*q;-2jSMk6-o@ULNd^SIz zjt6eXZNBLLpe${R@4u41z03b@U>qDq-?leBP$BwuvSJp9ZQ4maTBnUC&scvF zb!9gi_W2=_(Urr|&ou_DdlUJ`d!UhunGrnHuM%`T=kas+maO)<4;#(WPpE&Y*Pb`V zn$7rpj4x|$W0qT|=xdDneBk9y>1@c&(UxH>Bu?R=@_uV=Uygs%qr_ZqGmOG+%678G zlndIeL-Q^DNfAC!_aLuwo^nk$I+mgq;tq60o+{?Ka>W9RwCU)-?72i%Q~$T1Q?JLi zs9ePAbJs-TdpR%011zrMzQjI6MnI=BD$t+RTSUC@Xqg4 zuxHgON5Hl$qwqn>6*b}i25(+;A2C%H4w$sQPUa3}q=<~FX|#u>k#qmP3Bl3TKugs_8ZJ_K9MMFn%Ql-x6eb1?;* zuZ=^#^)ngIpQhr2jr^-MacI&}c!fO18DpqtB)Gkc-PW1!nL}Xr9pI*%IohA{>67M7 z_ll8=ai7QjmdF0K|Jp#uOXxwnCwHFP%AO&6hW+m1w1~>vd*&C@BKe$Ckvhd#h(BWA z25{Hby}0$Tr|!QbQP0F-^*o#wQ6KGk9{qSd!ZT#ZLiG=uiE;og)?RQiIA7-_XMy+O zbw1?a{p1i)TxS?sr89Z*SySz-sXW#c-`H^s(!Y$QzEc_7-EH)V7>7FEbwcZ!I7@KO ziu{G;l+T8C=Q4&O{%gMXl_m2US?%Bc6|@h%(Lf8aM999kV5=1USzDUYtTlhhOZfLI zewMxFROq97uF-7zCLea`q7-YI!}UUV;A5R*WOiYPWIsv77xXo}$p0m*QO4!sxdC1T zX#WP<*0aXj*(cz!_G5=l9i)@QQBp4ai};o<_7&?F@p(3_hxYs6C*|j!I)whG_C*u) zzn6FTF7$0A_ot0VNqayFImEOFY$yL`f{)qrU1UDZmFBdW`yReO*4{AgZgS}{ez&~v zNijg;C5jl&@%V^bPn8f2aHqv*m z@-+XP{ISVpV@bS_zhQkv5dOs+ABe;#D}Gn|jOy#O^Uh9bPaD>6^d3p=tgk5Md+880 z#?iydN{_8Nl^d`P{(ne(3b<3R+H zM5ci2_C8c+=4rj_9s5y@xfFhK7iS9^rxQmyxqZjJ_(OpzW1j9Gelz}%^o#Gq=gDVD zc{EkO{5xmCKZS_L``)Z6>*Lw@AmUG!U1D@h|2;X`iE%4p?ST80jl9o$n6t832Vw3N z^U*=RAiwaE)~^t&LqFvE0{xsP|7LwF ze>!WuBPUtq@Ee?)wqh3k=+I?dlXK*5!Uw}XlY5l4z+&v;%XGC&qaudB%8!3vkUkd9 zpdRWBJm>#&f8ypzGkE)3N z|C)9^)I}bwj``H1=leFf^FFox^%op`bNzttxCr0%Ol)kNb&$jSRawSU;$i(76S%gQ zePlNE5c5Kt{D;RDoNfPgVA<=Pm7j-RG{+aX*KWKPtzb;H^&O}}ycz$3nb5P=)LR=`a06P9V z6R?f(oU#Shg~mL^J>(_wMQe;3fUQTo$z=5N)R{v4Z>`q+$WCCkKk$svY?R}7INO1@ zaKK*c#0M=RKG(IcN)t=yp+%yk5I1l*LyoCMC z+E&~FJ$*SZca-u`_q+XP#3b>KsNBLC;#+5Xo>sH9lX1M zad&^(nAclW-w|RBE1z-*{mM$@r?TAX5#-E)6|D7Q_TebGf!w{em-#n`?6X7Vtc}3R zZO4_f=FrxkS)2AAI@{>zWRKqq{3KhQvxeMmT;&HI#O@h`Ru3QRz8y#VuJLNDo#)^; z53cB&Y}3;h1V4rAqTfB>v}nF?s~A6W_?(Plb9z&7f*tp0!{q_?Y{e~=+24~RIc?3l z7_?gSY{f*Qpb;954x|ZP)j(Kf(E+nTY|e{7!zF)%vqj&BwjG4Wg64Mromgtx(b^Nf ztL(RK5zCD&Tx8;um^lO&RDia;XM{gbdeU*MB&wuMFAD{nU?ub9sdE)WsedI zud7)nu0Eldxt1Ow$R2z=J;KJ$1P=-AaPj*Fx6W=-p9W2V)yP z?y^K5bD<@)l~IJwC-6GBtK1P>|H%4t;kuJHvWBejtR!7ZR^LWs^5ONL;lhA9J4F2> zt@UE&S}@rRpE=U|Lf$`djCW`7PUpwDebktHM}S2#97gJ=mDEqxlFcV*kJ`u@4|2{_ zEQvlzMiq^kOxvL|OQh%O>*6fI7&Nn&J&9Z~)s4_QAGEv_x|jnF*?Wh1!WlY)N;bj$ zlv`w4<+&?nEcx99=sm^+I%h-+Hrxyul)#_2)mU94-eMC0!{x4OI{9$ey zdd^VfCC*^xn<#m^*oW+I8a$IC@+J8ubv9FHnD+_U!hY|^4=YNY$`iQz81>#lz4mwH z?{e$4Z7O{C0^j6Pzs4CFmak*5Y{Oj@J(TS@M*YjFUonx#{vO{pzHd9m_e=Qxedv(z zy9?NN+qoD@ku8GA7#AXIT!74RKKW?RYeNRH^S>mw6(kpf+gCrizC(h?X@ST+wAUy6 zO&%BdXx*~8lwC&IZIn4SeDAG@slF2eky^L^!_Lm0?ZTIQw1ah<-?zscrS2I1PX2-T zy!cwPMtL@p`x7I-iu;Y9Z|t^C3PhAwA-P=e@X@;cnbe1G0ks1ebq3S59uQ~y@5WSaEv~_NZrEc(BG2k9$W{LBIU#C9-;<@BI z_ZwH^JXH8 zN9j{zM&fK3?(;e?DCDe=>K^t}-z6^g9>;&t(VsGI8FN zQ+!MVb<8H$PTf{-&9Awa&r>UP)pdGpyG-2+bRW5VlIJw^QSzKVSkXW(L9j*6I03q15<3@%#1Y{74^*O<_;jz{m9jEbZ8|C$U8~%#h@ClW^B$ndHttw|x&a<4n3|`3@ z8Mg0N{WxepwpQt}li})5qLI0r)wi8|ep7*~^b*PCx*VNZVy|6e>mr7{AF>xW*!84P z&j;YqQv8MfS^l3FJb{iA>EB*2Ix2KJ@DA7{;6patQQ_lkgQ7eqSAbP~L1B!XHbHPa zdjq~S;B788$x*;}&K9RA}w6+OW2#jiN$Z-k_4CNJJn z)=G98IxN;m^knB8L!W6BlK%={E2B{BFovzBi}8n%i|l#5%INs9L(>M^>LTCz(YF3i zh4wxRU&PR8*}atSZ3_Lx20b>xU(v4WLhmoyI9N}Zyz7JYaCU+EEdB7Ya&szIv~sX& zy(llI|I&csPv-_054M-cK60bE?a%y^Ba5^G>%;JW(oc~mt|C6$D3rZO<=wLKM{N49 z_(QG0HNhVZ_A!=j@7p$9{q)hA#-1`N5cvkMy`MUxmpgsPVNGgI8^IG`x>?s`U7&JH zNEg^E+(rLk;|u-nCI1Jy06S+^XsuD`b8vmIeR#wL;+bybdE1rs9d=pp@?Y%-_$zz> zujlu;dAIEccz41NusZQSxVQY2N>Kib_PDhe=oxi zFo=(Hh#aSaM=CnMs#1rh`{lDTJulLP&Tky{lxp9&rlsioq}vODcXcNlwRwy)87EBO zJq1_`1_iv!PT13xlT-Uh^h)*#{9N_Daw7;n;;Hmp`-$*Ub05Ml*w!OrA5+<0aA5`Q zX`cus%EY)@{CE4)NdAyU{6SZw8y$9huW+1i+Zfjx<~Nmj*0mhEP|i8ebqTsq#yqDo z&#sNK7#`Zh83jD`@OdiCHrm|&$+Wq8~vPPlX$(_1Bb-T5@%7jMa z`yhRp^xHk`b$-gGqSvnC|1$n(qCa2oQGBzW;~Ux$qm3^1m2PNAJ=Z@i!e;PU^zr!q z$Dkd&v(E?ByI1uNn8igK7GY~Vg6)gku+by&g5T)fBEDN=bnIr`ORtigyScyW1>4ts zc)W*uZh&Zka;#O|YP6j-fxL3GJ3JP`iBAwc(%vIp;ApJG_aQS6PKiSq$ePU~EJM+4WEmGc&Au5Y;4SS-Fd zd2F<6%Qyb3o%|yks6W`u93a~kbMJ4p<22^^?_Y#$2_Lk%xTEwuXbpT&H#&Loeu9^- z@scsvYci3YrXfR32XC^#n;GEEO!DoIi3m>evC0B}wv}XUolgF_ZFPlhMk2@Dh8^Z^ z>Brco>>P7TKEryWyvzSAr$0mJ_UfZFF_*KydN_0G)GvFQr>3yp&Lp4N+(iSW|AD^e z>w&g4teLix+t<&(Cva2mY=bjmIFA#Z+?m9tuO#>28pfvoidCNso`pDL(c-MR5V$2D zk0`uIFR=6D!?PdV{g*EeZ1v-#_9uSQLuQ*ZtMl-WImfi=a1Hj^%HVI2$J49@sw13c zY*yaC_}9@tYR_e@bbZYtFB&wI{5{tr`{#e(YoD1M#y`~FgTJ32*)_qKbZUY|^)k;} zR;O=01V3ZbD|AXB_=Dhba`wso^(ofVaxZ(|wDw$lIK)d``x~>loBk^XGlp#_#6B^T zcjDnw$^EGuB5uF5hZ*?w;2XnPkm+0h2F|FzdcTeTDyy-^^qlL5*c?>POURhYLs*Qx z%_lo5x-7Rp`RKD!Y1fagN$>LW(6NwzHw<3p;kTn)ymuUtzD+(>j?d2bexA_Z4cPqd z;2xyBeSddVR7E*rU6d z@7ULwL!W~yc|7lB-h~^*Z*zVx>*~bco!^1)-rpCIi^k?H**8Z~F8mI0#`wB_0Iqd& zu4-}|!~5vTlut%|cE>Kfe*##zc<-lw_I#LgBD;>nkBRs0{IUL=@;mb*|441hD{cuWMB2A{1>kNLAV9JEPE%p zA5NUjApZfrEW4dmR|erwlx18v}K+wA#m(SfnHpLW!n*>7C_jIr$uX?&ENb2I7YeHw-dRzxCWs?u}i>V@63EVFDd=s37z#9 zvtKSZ2K;H{p~O$lAK`x$SMrg?7GTTWhkxzu*rv`zcAU*KWLJMKWk17z`rW%JrA_$q z;cvBKxLoVNtL^k;CMP)WLdHoN>;GUh&#wZ9rXl|RvVqh>Gb zCG5>8FGVj+j-l$_GaIv%^K?N&OV(j;YW~KF-rbHrBDrpnC$7hTu-TJYuKi!{mwTsT z7oFDLbBTNqGuqGnnPYc0im+|c&LbXcZ0M^AUVu64{;_1{8SpJL+utLPj`*BLuTk9z zor{*x|5M0sGh4E0pw>ffkiEpKs($8g?QG!jgBKpCX!<4k)}(#hQ;h8nnAz)*v3^KD zJFuNezSeWC&FSb|TE?PpV!SQbP#U3r-yb$Co?FkXFk?$k=IvkP@lf-D z{@K;t(4gnwk<|auW@oMZsetj2bGz+xpKmaC$Kpm_FZ0yP8nWjW`0r)T_Cd$rV$ZGI zjXuS4d`w;6B8z+>?4|cRa{BixmO-EX>oQOCS%T*x9-ieU!Y@m-Rs~U=Z5!3feUk05X6Vb9ZzDMt-Z%;r1;lX;Gv;=nu#Z`k`2 z?DbyGnPja+XS0tY`)u=0?(dm>ep@DTjp!OV-~i!t?|WM=FZDuqu$9V3ZQ6L~HfJ>ZfM+jd3r%C7mUkBG)1PV77E-n&9^Y~$^Ce&B zcWJ|}pLVjWz`%6cIK+3`Za3O`Sob>rxGbryHVo3cxM$C?80}oA_~oIg9femUA$lsW6{3wyU(UHA3hYHpS;JuLB0&(C%$ik`>dV? z_^*97#yb{bFj z8jA0?ai(jkQTrPB^$a*8U5DT{6}TOR*%TXQ>Vsf(mE?b5w1oZzuR?w^TUWI(x1zIJ z*PZa?mGGj;@3zA?#<2N?Ip0V;Ty%SU%QDGM$Wvj~y5_AIIZ8gC@-vc6ekXPk+2rm2 z$S}iW59GttO<%RIx^m1{f9lXn`68(Q>TmJSPvwB3P#ZcjO529c~g6aWIq>H`+2^TbtGTiqwvD# znK^M{HB$TTVC{+KxUia$fR)x<@>ru@Yk~TnJM6h1Uq-E6z02aA%TH_WU0(Xm^x(}6 z%=IPoU9_Z=H55daiw=?HQf*moasuAcUk&byoaIvtY%_ta+L?|%pcNg(tSEj}w$1p< z=r^uF&v7~Wj?2({T#C*363#XmW9w9o)`LGS^^8i?b0s;Aro0|#%YgoU$hv5OmJ1dx z&-?byqwA*83oKb1ukjg{Jvy92aal+>>Hh22T*=Fx5&Z9J3I?mXI^H$uCj?P@nPLYuO?Cg*99URnB3 z@k-+N()sE8N&G}7pIGbIytF5VO^4U7Iya?R-)U~-lc{m)8_@^xwI)C5AvHHY{dXr% z%Y)}Qd0HN(zW9z5^it!Qp9##{wHd6IZq>86tLHgroee}z8-^MBVRp5|B4Kaj(Tyo-wlqCYAbXhbj7G^=fWXuPA3 zYC9{?mPIb)K4g+x(N*=~Lsqu_sD8@gT~;aU?kB|^A@cKGdJ2BX%!y(NT;0?q(oMl1 zUBb`NO=a4#Tkt6z4+5*r#1lsGuW$8E>kq>tM~U5%zDBvPt@}#)qr|i+N1MKFOkCeb z=kagczwe#UZtHf@@$@FXG5JO`as@v6!~K?yu6eU>mgEWcb~{f?Lf3P`vyQIkZ^ZXW zcajW4|H>p7Hr!{!kU=$<14D;yPTN`!?r+>@+B9<(`O8#KaJKZ5P8<{QELlEezybQ* zc(!l7eEW13mh>cj=p-cPmy@GFdX!SGnYlZ&;LX$2Pw7M+!Zt4(*HT~{yn=eMfd>+N z{ok;I^*~>O*c!#>cY_0G1Eb_ISXU>F0e>CgftN94F@|8mr+S0Noz!O!eRkork9GMw zat{gDTA8clx`UzQx*xIYKJX<^^EuS5zRCXJ_PJhi3w_k{gq&0uq&|~%E?fv-YoA|K zv4OdlZ*>ScN@cBhe4c2(Y*tlQ;LA80y*vCo{=yyo^sUuT(?Y&UV^&`zQU5fgf)#<ZY@OtNm0iZx z!2rLbWzoSPFW5R5u7ls8i^(~`(SK;1UU1FN*z3NBFDc*G-Hi{nuGsto_J8U@mo$qu z_M4nC+Ys$)99Qa?f0iF$U=^ z0>I2q&Yf&@oiWB{!#6S~vVY9TW#zXZe|sN&cH6s{_VQ`3iuNqvMf}st)u){rd3>}n z>3a0icl*XS)zeNs?bte1Yp-$EiEM8q9!vW??dI`)2*2y??2$$EtCO-t;6}Z! z>J!%>WlEt9=qs8EPU>3cwo}CS;Z$R>=#5>Lero>Io}GJ#|EjZ9bum^wSKU3Tlf6SU z(WZy!hGol9TgmHd0rd_a>s^dha)J6_xMRgnS~%(ZzB5Ont);`}shIaREVxdfUVE+S z8F1;O-E4H6lD9>x*xb`B%ILm;x-x3B&(vNY9&Ie{rCmSmlHVMfE!}knx@(6{pVsB% zXYHPEY<>^i*SGpk_ZpYh(chBj)i!U|R%q5-#!(p}b`l#;2hQ0AE^Q;WX{-2=W$e|` zcW+#6?v_4FdhXvGAP3!Cqaf#up*rrvter4)$)e1*)tUYBHE3h6C8lCv#Vq3S=NR@G zI)ZyX`p5m)W%AKW?mwF=dddCh9`n#g_To2O%A9ww1`eHqorQ64F3H>~p6M`rR6z45;TZQmrevVRW!w0T$Y5}EBEBLB^D;=F4PqYLq|r}>CU#n7uKIDM**sff{y1y?lC9(DquQUt zH*TLrTO=oEFph8XK3a15)^^r9XONalH!6NEii|G4-YU-DC4OG`;_~geJQKg(3r~AI ze*Jmy!lePOoIdv_@rOj8UH&@;eQ@*^4i8>@8#&1nxNs7M=x;fjnNAx)aLT+ zOL~@M3p9x5cJ&vs4c6l`D}2@Yfx^>}t-ry(e^$zIaGjj6wB5VJ!FAa?zx~=!ToaB7 zpOWhwN1fPVHiv;7?GU3dy?qSNY&s0yC(3TtIA&9)i)Z>TU6AnX1fFkT&$Dq29P^XR<|M(|L-jN*A%eQ`8XEV*Qza#6RhqZM!KfD!R54BBPvt(gg z{@+B*ldYSnK*nE;tp5dM{?8-(e-7Qu#ck*U9DjcKC(*w~^i;=N1B*ltz?Ec~^&5`= zd=@2D`DgD`W@qPa`L-_Ve9_u2S+JLTj9@2;!*B)Rsw#5g5yNhaHb z{z$NqPDE>QxL)MT_YTcpE4bVUTr`f)FLd-GODHpvZR&T^FzH0bI3(d7LU)@bM7niLfs3C@E2$Tck@hhaUOA~MFa5f z{P&S>vdElVjo)LXk!GYFV9Yllhl;Pnzb4=RGxk5))}G`y%_i&M8wvgGTY}MA`tAU3EuS_HZlurOywWH<%$zpke=S}$43C+8@V0jzqpz6segLDdqGO`fdZrXm-oaU`UOAV_l(6w zi_IEv!OoXUj;SZhE<4rsr@ROlx&D-4cp2r6?Zh`M$eC#Fy`LCIV7R*%|2Aye2bKGl zv!^TelM^yXF2@3a>%G{B%kZAc5f-&G+8HE>{#8Am;z$EP)Zf?0#!wQ>&sPiM@Neso&o;6LJ%jFn$sI5*X3 z%JF2s1}|Aqgb!sgeb-uU%*PIcA7ta@^&O29jDf|}Cm+jBXx%;d=WK%qU&?(IXUO%? z_ibD^aBZi3tsB*G9#{4MZDgKFjPnh1QuW`s*O}CR=lZfaDOKarvq>If!QadYslPFe z1yA66wXK*O%8d8Z^!GQv{&eI%{BU1has9%#eUqBH(Iq?%4D@X$_$8PfKrSm~tVN8~ z4kG>Z@(zo|e zA3DgVln<;igJuXbS(o_8Ai=&`o}*0HT0QCxVq;y)QP`&fYkAvgV#{=i*3Ran)chjwofa zfv2v%N1+4QVFsLzjVgj_z?;N2$bc47MaAH$!4AIO^p$#WWg zJ9$nTD;j|1w}B(hr9clq&_b1hDe#fr+BI*{7 z^#XhHHI*YzEk-`*xPs?#?t1a<(Y@N_=i%pl!Z1^wF!JipjW5TC+2Gt=%Z@9lS;Joc3G+)YPUM%asXigF zw))_0uZ)mmx@IT!9WTdpDLJO|j}coU9`+*T<07u4^wF_18ZTRM)11?cw3X)?=~cIZ zzu?xm!~dt^0Q1pAUh8Uj&8jr~b@Ku@YwuL?lk9KI!1Vixke78uvw z3?06rWNPG`n@sR&X8Sedu?08V1^*P&!?P^p8ONt@@*IyH$CZp@2{|@F*P1Gd8Pk`9 zJMMJ9sNy;S_XX8SR(79DnFi%C4N{#HZ-0_>?l@Q|1(A zr`K`5ZNL}2xr=>8?^d!uxMkcJ7VQU$VOe8Z3&?$5qqSLvZh35HeMKMfFlFZ0)bp?d z{Y4Z(nwI`X$)cD#s8T$WQYC zPq0UGv6Hz#2Qjcwbcr$Uo9(X0>FwVoE=ztK0r(Hwe!Fwgz#ZGoX7poev&iT43t}99 zxysQi;J=YBKQqPJ-HWdP-`RS(!{`^fJoq^=*PWxCn8?q}Pic17yz~*5eB`v#z&MiU z#P7(A&YVC)*V9Mi9PJBBSaTJuy~V7-FR&IrkDU8C_PkNHoLkV)P*JJ*gFd`QJU{Ih z9)drJ!q2oGA?F0|HNSuUJZCk3)<{=hl6~dE&)WGc3;lneXqOj%a2stW_br%Alkm%z zPAb0I*!|HhCV9H>rDgs5*iRJ;fRlq03!wjbBg6tQ=dK>$yH6u)fJ3(b{f=x${-10N z`rrTXCMU1RN4K!YuQu%Q8sLa{uYY!)z#*F^IWc@Xqcix8`i@d!TYB01Go8KvVDEAx zQfRJT*MD-!z>M1hYl)rT6{|Db_M@AUAHq!exHG4c2mRp9e#*r@?Tjhq;o@f{!#c5j zM|B&^7}L@djCm^C+g>uzmtQh)kvVo(kUC-~dk0Qkaoxg4PB11v0X{u}uC>J+U%j22 zly&&RV%w}NHD@&Krw#U|KHmuSmr}p+DSUaUpZuI@Ro)rZYsh1h3XUJ3yT%+KgpMzkDMX@*JK#3A>ZVe8UHzH{qys# z$x1IWJ#)7!H+%xds!R8RRj=K?Z$vnZQTv>`tMZN1c@A|xGNFII`m^8eOX@B^`MxaL zu%PYa7piF>?nZr4{Iu#vcJJE@?H)dde}9S?&8fz`N8m|?JIVdO47ljOt^WXiL-Zf~ zx6&M3vBxpq8OMHPmQ`w#zV*^y^$#28F5imYA+YL!7a8833$I(p9EF#3_Wx6O{ZwNb z@4!oKxG;Mz<@hj@twiH}lm5dS*y|v9jx@HjdFR4}eQ^j(dV#On8x9w(FZ=ljbqc4E zlPk4`PE6DtLN5v(U#oS9pMRu?JTBd|)z3V}fM+)USM!b5r|w5uJ2wLZ=}IzbTY5$L zDd~SQty2t=%Uk7=C%PEK4$v6p+>2Afk~aYZ6OqW0q+p6?~*dfyTw@@9$l?2L9| zJ?;F7IXWY8GBVONGZw!z`cCom)nVdmdNZLx#8gz(!n^T*KQxJ$y~TB>p_?EcO|trU zcn5g%RmF_qz^3~vt~T}OzmI760c@;A@QHIMCt0BzTpW+?;R$Ru)w#dU8o%SKrF z1$y7Z`=T3-nv1!PBhQNN%ejC2P`p5UT*zb8t{iRDt{|6j8}p%OH*z2TEA$B7i1!_v zc>c>XQ<{|vqQA-uj8lO1DCTQ4es8Ac>q&RMV%VHDU($tYzD~i8ojebFGm*n-;~L_Y zKje&F@j{(5h(%euv@ke&(t_}_%L=<>KhGpr0oMng&5d;Pjbc+jKQE=Z9{F5zDBX-- z>xFmXA?Nc>u^~rwl9}z<K9Tu6V;^96XF}%}by3U+cc%HK%^ngWP#g_M|S4mG7Tv6fDJt z{2qPRIDOlV#UbS8eD)9d$9S1ry$jQCy%V2jzeBc^j?UJDOU}fP9X?a}xeHS%SH&|6 z`41h>9{-9t3s~Dq)b`84xb|5czYEu#U z6S}#-jQRc+`m^j)iEm^svrl*Ix?6bmUHYRj8mAkJH4l3C0=E7iWCd=HO|H-4y8_vg zW7xKVOHC`!8;R}fo!m(7P2bqi1n^5TIDH8wje8&M{IfBK*(d&Ajd>*%DgA;XU`Pnx6mm?Pm6 zbgeLd7*6d6C&jz@z^&^NxD{j0N+pX?_Iewy#IM4Fvv##B z{AdMd6t{-m+Qtdx3D!4izY+X!+mC_2!s#{WivG84KbmMe`}-4Xc2ZwAv`PL4>?Kbo z?@siO=G~&nHq+#?|J5?j5R;_4fC>zdC4`5Ce>~82$%c}T8?~m z3waqpzx@N-Wac5VjQE#GE+px?vqKcoGR+#j;(tz*-)&;DJC97Xw1g5Iic z!*$t`3qR1l&tCH3*G=S15Ax>6_Z02hYQKy4DCs`6hc5(gzRP^QhRo}O58p|if}N@U zro3|l9XaN-boRmm`F|V0$IO8SGcQr_XsON?7mOR6JbO|4r+b~}B_F_P#AAi=pR;{o zPB2#GKx6P#-GlRTMD6s_P8aQPUSEenJMjs|L5JTw+SUhi*&lfxWv=RhU(}P?0eEz!{|7VOs;8RiOF$#y{+mUM*A$uc>Ch$)ED59Q+*vsH$_q@(` z;%ndVOz&%@ugGVSsxys)2KVHvFAT@=b67HC{gj7u>|A~p|GTL}d+6=VoAx>E6I%}R zOnc|GJR81uenE5j(b2v0FZ7xIroYPdCi;x;W13=J{Ey{tHE{QoW`x|vGnE^b!u-=onhc9-Jiq9Ir%YCsn17W%2`jd^8d(Y3lDz3t9K7^zK_mJEEU}WuN+&)BNZDs+w}2r#~!nY zcb6pU=mNJT|Mp=E{uOiTCtrRYaw}`1GK{P%+Q|MquWE{O&Z*i3znb6=cS8eff@zKG zebx3b$^w*!O4zjDt^R#OZmd+1oAcVt@=2hZ;4m7 zzkQ8yv1i+Tx|Hu^=UU3Q#<|C~9mIDSyOU`Mxl8d^hK>*mm+|s48}EzEjB3_lW&RfE zBYLzF?u%H1dRFw56QAp!8CV$oM|__4f%ncf3gzP&sQ|ix{%q8I-}%GtzUmqjP&68ju6c3Uh9$%58@xiUu`cgIveE0P>#vI_p1m)b7T3 zYv=bK0$sVeu9N{vgl|E zbWFA!4`)s~IZVj^8~NEk9C=aty=waR4Dc2o`37gI8svM3G3QzjQRYs3-~j$)Rp7f| zsC$2Qz~&RXn9pQBQMjP@F25KQ?^MqIT7DdU@dSro^m~uZFBW>?7pZ5EU*!JRr=x$& zPQ=f1^%GaEJ`3;FC+&seOWeMOhxOI%qyPV5AAdj}1ryPq?%Ds^KE{{}@hJJwV)5QK ze*`RJj5!E@G!|HVj6bqrIL_g@xxbbE4M0EDNBoQ{22PP5Tc(YxZ)<iRV>R9y*v`Tk^nxfq;t><2+;yL8G-rfde^Oo5(Gh4-}eKKHwN1boc~rtlQjM5{+@WO}>7 zz1I2%wCm*K(3!(o?J;u5)w3Ujp#9W8F9ux*g8SBs%L*;7(_cjQz&AbAVNyo`|HLru zsDB&4?MKFt3yeOspu<%Ely}};$IAO789UFMxr@O^`p6lk^WB2rtY}=`N8ZTe!23Y_ zKUV#9W%a_p!taiU=D~;UzMgeoXO8PbM^dS8`n==YdyqLSYy{fRHKtwAxsk^7W5z^2 zwZSoo$3@rQluErt#1jO~@H+7{=I=E&Bcgh2z7<$mKV4P`9v8$CuoPTXM&sY^mcut& z^PoPoC;H&RNHBeX_B*8?O2{vg0Tw{31k+ej-P3H?s_toaJ?eu&ADp_UwLd`JqT^28 z&RHzCYHXrIiMrvdbhgYMba5FA$dM#?icUG8u|0}*%A2r@8@ckwJYy9}y?bh=aaD=sA zSZXbPom9K_L@HWf`8ebi_!NyM()+VmDeE~Ipv<9+!M$c z>Z|&Abw}Xl?a+iW%Bns+YoK2tU^BdL!QDxHBkoo3xs$%N&@b`vTiI7EbR_4210moe znN#>IzQjNtV81+g9sLe@49Q!&)0pS$dT&|lqwSTRaZT5AzNtm*)Ze`0+Ks#Fo@l+R z=!qv9c*gHH4bHiQEzq%szr`ybVg5oM^7b+ON=mnUr(;${Dr^g)}IZ%n%aIJKFFQu zUhQX{&a*W<(;l!HU)*nE4-b2=nT%JCmkj&d6Xk7`zxBJRPX0&n3EL=}jDOgd>@x(0 z>uHYev3FJ!=V1F`oXKUb3wkngs9$otdmYKAZytNMd|Cr;q znczD(g9Vt(Nt9RKkYt}{*H6&>mOTIDm|*Td|8sa9$Cp8{2+L2cVKh27bav#+VXbcd z8TcW*mM_A4pMO4j#%U=T@nQ0{z7-t4usiWDBg$J#LQo>b{Qp0+wS=~k+j;TSl#GeAbG$RJ zHFw$LILo)yh)nqb>mX`GG9Nc0({hZ+S@<%X&78?E+r|yn1A3i=-Z4F0cJ?=? zR-k*%9_6Wd315Syql?>SF@CLw*W2O`<)j+(R?H%nWh4G?W>)nE=yNu)1e>@je$_{; zfkmuAHn9dlzOzP!?O21EQ;091u1%ilO{%Ypx>`pY^9qq^;ajV7p`+)Z_md8*ZneL< zjQY-@+)~;i<}BY?mpXTDTD$ymH6P3H+wJ_n?45gjRP~wv&zVVJCgBbVA)o>Ak_oj6 za*I`&fY5;2)|A#(Z2@W538~w~dJ9;SKy3rjY9wB<1;ny*%IN``n-BOU{!)9e|?4=3BGL z!!)69-~RwIZZb7dIYnLb&x<|6mcx6Fo4BVQAbF=A`*B;pg<$9jG%3i=k$0iOfRO|USq z<5Mf^BF^r1`KW8C4W+iN=a)AXD~2!DGoEQ)`@^1cOgVR_bkRFvF=;3Jnzt|2 zsZY15yVGi;xMOb{Ctks!f45m}L?69vyfm`dyv?3d_6q6Medz5le}V~pjc1wS8`HLM@wWXj9wMFTkd_rVJa6o2kH%W-1< zHgorY&esCY@*ZmbL;EInwaJUUOdIY-m?Rsu`1=$-)!sgf%D2u>pT%2<-<%I0-t4o_ zViXxgXYrTgvLstflzlvq+eL4}{@(N^ml%gad*8eADEkB^x4OBtoR2baYCNM zrkFP6!q>cTqw-JPGqM7i-aaG4(`TfW-*iS+LThwJls5v-rN<6{yS@4ih8rd4*=I>L zEA6xN-G8;ul6*bhK7_Zu`Z$d{YG!)zwkr?7&AIByGqtY~;1F2X&*ERh28EOF5Ra<$ zwZhwLKR7*E%cu6{Cx*Z2I%Jl+$=hxAojjqQyxsZy58tl1AY?S%&Hs^#aCIfW70>Qd zE&0Y+2S4an))^poLHF9tCr_*KZaW{(<>xM6RUKFP=hUz8Lf_SX$$e^{7yEo|>fX=s zcVy`%Y}v$9Gglw=2{gWB2Gyka;Ynr_HiDSJchTW?@MSIdVjxR-;TJ(xI$K$-siMVAXRk0<1Cc27ExWEV5nzzFy9!a9JsWl+tt>z#&*x^DYww}}83wd=XRX*u#S;^nw|x(pnOEWYUNWz1JTZ=~Cgq5V4AKSev~9$uU{30P^oW=F4Z$DmBG^^WT44r3jX zslD%I!k2o*UTw*?bXZ`L6#lHWXbd)vezQ8u`Tj?(nLOqBd~d$d*K|?|HIJV%8W#W~ zjd9kG&87t(1kZS`|HtvamzO<*-umepyJpLL-pe+)?}jt58GE_fSLj&}+1ecD_BS*( zyhndp$4uTiww&z8S7ye_|BXCZf`(6W*HkHMM2>3s5PCN_W#!`t=i9+~ zVmdpp)y-{%$EoINluy-KMUI`j5j)i;-^h+i_b*Q)*i{1x!2jFPZ0C2eJUBHIbxIminuwfBGYrxqE+qMh9{GbN5^Q2`A#f*zIdJeQAHxSAxA( zKdrtI>An6nd(9ZuUQeK%_WEo-1vk;N2r&Bq{}-^|SFqoDU;VlLH?!Xne?I$N(D5|5 zW5+5EXTJ+#7qj06wrAmDJ#ii`EVg*&9%9|fnS00CbK-2MCpu!Qa6)_E#k+!v~EK^pDsYGV?9m`;Yg46QB0r#8hzN6B%$~E&D5+P>s+c?IE8V z+3(5d!m_VJYle-MKOcN3G73AIv2zz2!iT&n^kEAh4EAlBKfkIDn2zSX>wwui%rk&r zRPPr5B{ex|!G>7tcF^7aR2gTZG4#L4UU=T10GUA|ooWj8m@o9K)a0>tD zJ2-eA@HpVWu?_ksUxnZpv2bxXxR~$YqI^a2h33biAz~&}n+6>`0xnMTkE&Ydz*cpV zMzO9pnWOqcmOdtI+lCNNt+wPOw)5%5&k*Z!aaXZK7~3p*RcsV==-g;c6ZtLfD|k=% zn(i08f0BOfb5Z~f+w}7%{B|t5X5Yv2KJy;d|E_tDr>)@dzVaTY?_=?v5c~hnz_ewce%CnN4Ie{HidF0ByDkSgf5P4S#=PVSHYXbjiEcR2IhxW?nknini z`BvHAvTaCKUJdy*$^{u`2DYNFSUE(>M|_05rz(6ts|)=F}%`kDQrnntqFTb6c?}S#LxW#Ly3Bo$!L>f<-q>Z6lVV?s8vKIk1E$OcYNp=UIgR6U4!23=8K>BPp7? z2-{^P&jM#}y|3f|nQx`u4(>QxFkJttDxVZ`JWSW%2Q?l(cyM$$de*VySJeJ^I9lZ3XwSCC#L?r#LH{*0 zE)I>8pZj<;?RnL>V(;HAO_SfHSojKFi*71E4_`!M0-B;+$9GHbe#p3Md(gYs`%Le0 z+1qaP&NFA>m*}8q-&XEs(wbb{vexC$KG|Q6miJc)-bwduM-O)MjBjRLqEE7^^rBO? z-K85%TNRe?^8KNcUfTC%`c+Qf@#>Wy@b~53-afH|PVAHJ?v)MmN%Gtx-W)t)u{JeK ziH@8~ZQ8S^CsV0FG)3Kj$XIY;-KZAS+8+K&nWu^7zpeca^)Eby#wA4>1vvj;&)G4n6wyAUIf068Dfre&( zL8o*)KQ&ccm`g|AP0Z2*&)fM}^nr;%)-u~)Fh%3NLj2mRLsjd*-fMTjG*;*&E`DUGoJ+Y z6E8>4oyY&WA0|$H%3^fNz*uyyNp}3S&ecUvtg1-xZ2y#S%V)^(i@XiYg$Iv>756-` z=I!j3$En-B@RU;<=Y47DTlK4JD`uWk|G+Nt1NRg6_V8HWwpW?EJ!i#81!JE$*=YJW zbBJ)ySOS`3ECva>Mn#Xcwp1sF59Vm zlK8{7zXohh{jk4D`{#wvCxOqE=sw;(jr8^GDK=B>=|tvPMGn!E*tbVv-xC~8Qq5lC z;`E&wa#h&d<|;O8%LM4=8Tc!S{}gX39vZ$>I*p5KPrJL0ruv^gCQIW#2>m zPF#P>VfN)R&h&cfr>btJYSn)m7`|q~(8kSOoMZW2Ujdd+aW1qr&1F8ah<81Xzr)5+ zYCx2c&!l^~4osuQpx=(!dD85vNlc7jmEwIcLTyNZJDib8;7O7gtYpn1Be`adk(5s{ zO8v%tXR)u*KAZj5&9{jpNw!h4STP72Qk0M zlIy~aA>g9%rN_R)nb?$N{D2yyEm^_vlFR*TUR2H2;sdD-!8O<_6;DU*33|cY9L1vM zjc;tAE}6HU-9ywP&BrF)ruw&h9$sZMb!e|X%-LYSzQlTc=B5Z;<|QMh!|*b$wZ)`Pq2M@)?_FPIuzRWP+^CNZ7x*eJL> z+N}AZ?!(;a%yk>}P6MoE9et0*&T?v2xO6S;USW<`(ZBp(Mt0|9#rGU<4DfaCMbs>l z?=aI?KX%4a|Lgp|ZM!^Uv~hPxGixjduT@WSEq6GTQ*SWt{!icK*!bP&*wE)TaDK(t zbM+qM)?iaM!R5%5A(-|FujHch(b&kN*N_ePjES1YHBt9zGAh}3%ItP4y z*_Ts=96op2SYy1M3ujc!HiIQA`Wxb%cTp3_8t?I!riUg&6Puy=TFZR&7Vo(UxUvmA zFX_*XjWNGs#YkLnfe*YM5nH&V3|tzDtdR?U%0*tPt=J8J@<+|4<}ItZ<1SEDPT!{v zEnni^^%;e(654a^D04+&Au%Y>k71E%)P}`|>GC4Qo`>K~({gR!r25eO>R6NDbveFs zc$xggY2C8-T&bJNIX~N(YvhJ-(vN(YX}-T{CXVTeRYQoE$SwL$a<#Bkiar;QX?-A6 zMqG{A_BJt=dvq^=%j?O_n^=$Uh52u+pN=1xSeRaN4D>F7JW)h^Q#0!hu#nvr})WdtvwA^2?xqk^LMlo^F2Ft%Z}(~uK+=(ke{9Rdk9zYHhNtD>LD5ud zU^IS8mpokT$iv81-Q?jQ@^BnqTYTPt=-#F1Q0LCH?oK_OI0wnZab)6R$;97xW#YW5 z#2W4jZ7^E4aPAHvucz*?W#j3{#tV(WR_awG8(H^QzgIrav+h0I{-3s-D*r!cV!Q5l z)R=-{m~)aiH@hVddHi~OrtaC>gzO?(@*p@XKa=+MLC#&`kQK)?DY2Xw&1~q8Xa~Nf zl67ldTnWFZG&+A=3Ef!1cULZO`1GS*KE2>pn@t1zN ze$YI<@`L_w=j^@w(7?rIoXv9HkxxYMadm+79tF5x7+7kbiUS3c55i01&mng%_j5<< z;Ar!7TkeeC%YA)Mozu8)tiQ31zti_*mObMOv+(b+pYYEvxicTNwx`@VBKB2ea_vXF z=4o3lznZ%Z!Oea7mYjB{o1fbJwq@IT)Ck$WddZ#gHwg}t&?WBn=n^{9Ub#l{3UTe- zeuECC`)noTd+|@tIxWx zS!?o+p}UK*&DryJbRp%5f98B&(`Omi(tUvUp6?8fhNjr?P5^I9_W{;h6B%HQ?ju-R zx)1Z&&3s;?trzC6FvhF!oz5`2j|ax{fN>lgCie|qXiR(z`Y5~-O$)Gh(l_JFsnO2d z_Iy9wLfyFyMf~3RwQ#Zq{`xw$sLjYLHPG9G$W>dwG3!3nAaUo(n!AdUHE$pK(TWEG zM{0J6rp6bNV|b)yRrJE!bWd!~#q6C0k2AZ=myPGy^5rDPl}@n{9*_qQ&=`l1fxg6j z(w*Gxp}O7Hc=D%m?hgH^{(&H4!2>H2jK#R=u_Ew$WY7&o=E#n`@v9%0#P>vv(Q?%( zrvj^fwy%eCp}L(nPoXY^BR`=^R`NE2$^{emB`9IGjHov=+HZXN5q%cV2+^= z=CzN0&VaVQP9K6-q9)v8$(6vgm_Myw^A`oU-;eGTCj<=cFo^&UhI>!h~7WE}P3 z{=am(vEg;*r#ZX2WwA%M+|8cs{*bYu7#UXgE=O1wIjPBc!~>|#O8jcxJDK0E&W=V3 z`8>MlInYDSc+4PFeDzbesIJ0{O zXJBlWgKuib{mAgDw+oFX#qCPwN{t;H-MNr9MFBd+sZ)&&sjFE(v^w!4qoo7b1Ub_+(Czuq-5S<82ANWL5&BZNWe;?+ z6MMAk5{(8&=YgYPJ?D31#l^Cz?0FI2i2f&bVKY2gx>)7UW+Y!@FDmoV`DwQ~&wh6c zpJ(7({2p!ej>eO0D}K?5ewpB|o0Z1UhAU6nUApqdlZVV(XN>=fQGQTz<$P*Wmf&|B zZO&O@GM7}9SuNPd??BI3$UXqea_Um=;x}poK~r2ifDO-?;LbOJr{FW6cHL;oz`&F_ zJdYI{lM0yI8fuw~S0%0vBO}=|OdYwV@|%7WxqdUcs?NAo4<0#l0qedJnLggYSqGm( z%(Do6RqG9!LmNV@Co#O!;x|?s_8`93kAK*R#@T}c^vm7Q8wsY&JSu*;DE&?0MwJ9%dfGN1a*wPUMlXYU%-N9KSho>q5@9XsVBz zfU4Nwnze^Ep3eZ@wjClrw)U4c zp0~Y~n$*59oFso`Lp=A=sPbqG=*TYQt54E*4)4Tyo?u_3uf!XSbCQ0_)kL?s0bNilgVeaw_G#uuA?lFjA zgXsYGxx)az6!`cO_d+~Ne$;4k!K`@@hay`;Jl=Qmd72mFD6Tg|T!j9g#(f6$;O!n@ zq4q`QsE*p#sNIcUshrQ*)I22TZyWx~M%`1OdOs!P6@;G+-d5p4V9ajGLQ{0E@|cIoJlr!Y-DaBMUp$sLkKzDh^y@x` zavREdFTfbe8P$5%uwLm?>MuZkLjs!9$++3(sEgp26L;Mqdq!{CQ#--{7c=8^mwhci zwg;I<^l2@9dFhj5TXSSK?hkkHb+m)8`SdM3j}X_Oy)7bN5!qudd%9irf+})5`c*BO zT7r*l5p}sP9&;*ro4FSt3MB`>O9 z_1};ET7&(ejr@t*xC`aGhf^DK$c0lau-BiM5xoujz#DwuOdeb&a#Pgl=_-n+s%R}?ONZv zk=^co*u<_w93(I;8Z)j+xyAucj=p1Kxzo~H99z&n#`_KZbs#IM&+Cayd6;{bU7ggm2jy|bp9~n2z6g9IN7l2J4(O?OeCG^W;}BZA`V;mtC3RL2N``8&d#TzZiXOn%{V9m%sjj zw7v$scEj8M^V#mUrj5S(LgDY!n$#re+eQsJ_#T^+i}PEB2UC+Y)*scE$7IZ`FyrBhP97gyAo&3YgamlcIqoYEpgYj)DDm8 zWV|!gSCPl2d&WaO2?~Ve;i+Hx4IWzU+X6S@XpjnkvZ-~pBdX_Upl_O zwQqFqhw-;wmcieO4>s*@J;U+0&Y=Hy;cvYF+^NNWEZ-9Nzday76}aO1TXmnVYisE_ z-_~6Gt&DRlf9tnq;1~S3^nvdF*0cVj%ir4Vtes@}=I%7cclld6r=rch{H=fBcgyCm z%l5af_)*{P{?_GY+2-K-Th}wc-OTSb+IHC-y8Nv#orlfgWyjxoPB=Lo{CH$I zbmd-~ZygMD_qlFjPKnF9e6ElCFY9#m-M}MVzSPU95y4&FExr7y=&uPPknxx<4^Uh-^co|9F1St z!yh68J$vT(Q?Fy5^N|f)oAQ2a;yryE3y_oa+ZaBZfm2VODgTamrS&d6L~@DRubXOQ z^uO+$V)4yh{@1n4qy9KPlG!IYJ`&Dm;*4%;>85=#%2H-gUctLA60_ ze6{@~gQqIj!}gPmKu>gS5U!u3<)Pkw64y@t<0Fam@A8qD#7HOl z**=nW@M)Wujjk%=J9fm1I^OB&Q~r*HM?Gy8!PuFceVzOH;G1_{X@09S=z{K0c1v@SAY-9o7=B?)s-B$5BhFoBSZ%qy-z~2yBpkzt^Wg%nh*o zDYRI+)r0=~3yJTU)W%uy$_wrpt`q+R$Ikn6YSOKIPul?D0f*_Q24B&)ILDSheMS#| z`k%V{)8qI)_5|_wPdbJ_9iNl@>BYAhP5U{Qmx9~Vq$eOFxc)B53zlyT|CW4XiS{nv zm}G9Zo!2i`&wXQ-UyO6!%-MP|&*K+k9D}vFYyK|ZE&ms77rboyzuKvTEExs4ahQBx zds%lc|Gw;)e*FK?Jd?Tj3GOZV)2_5E5P&7`1uX|`~ms&Sijm}D?hFuUhN{# z?ruJKXU_k9@lpK!%+>Yx&&S`dIFq3N*f9kfCkpKkua@maFt6D$ozG0;{=^wK?fdtP z*VFf3E1%MFeE+rZ4(Y3cmuvfxoz}&V?O)?AIs2Kb_09`t0F%jd32m@-cZU z-TbcWTJgKm#|(a-kKa}KK+{HfWMmKT_w&1W*@Yur899skZ#l$&=Mo3rk9hF@#Dx!_ zCdxqWdGa@Q;&(lWPwp_jSJlTUPhNJT-X_h?tTo|?(%tQ zq3)g@8C&uUHRgfwA?6C~RSSOme%gv2miM(|5RdS`D-&zp!F97r)n_HK0SV@=@4>zW zlZzGiCRuBJR#Yuz707Fq4_Np27v zh+#W)7QTxyT|Pyvxe}kE;Q6hmiDTPgBDcEoz75xNeojq4^l}5;R&!-u&%1t6jT^}h zOwk`qUEUmxf{52Rbq~ z%7LNi`76NZO6<(pA?9X&kC>Y$nD2CHf3NFk>mVMF_7x_Wf>c&OZ^oWbp{}CrHatQ6*xCZqJO-aW^>VLsB&RiwO zN}eePo{EVUo~=HVnk1WS9NkBz5H=D!!A;?bqkVu-(SuytG0wLGtlfdS)1(}38-ImQ~ zHgQBzV*C|LB%f+enO}8LH$#uTd`|uZd>=NSb7Jkk@3H;#oO8Ki?HMnQ{qZ0?*UJwS zZy$8x?R)cs;Z|MN?>}YRe|qj;aUYux+|1a*InAplAG(2Ovils8PtWgzPxOgK$2xq1 zoCG)4{;c++@QL+3_{5AZ+s{7erFfznZ-2#9c*UBoc>AZo3GoQ=hu_=r_TBiyH<_D- zf9H4Euhd@?=TPgJ#dGOsUj8r*yXou5xSNqjrQeJhfPUeLLFpg{B}6Pp4EYd0QjX$L z`V%8k$=(X~t%`F34vF=BqLGn~oB^aXv+W(gO}i2=$?Td*hK= zAR)weo^Z~gp9`UFqUQEdX|6?+HP`!~E1BqWggUTYdvDX_b48bd1Aem~>>2yvkmBzj^eg_pH?4MY;tlkt zH;~V@SC%aRK80`0@)`13IuHMxzKW7i#{>eLM)hjAuTr z_@%Hzq+_2Y57@T65-VpyHitUafjqfUIasIi4za#1g7MMkY0Fod=btCo^K|8`Omn@L zxq9tO#PDRaFV$jmoQy7T54wQ04%V~$$J!^e;vK8g(S5oC!=ki9PEeo|ZZI<8z-)?Kc={|n=pXx7zNy4GTRu6o9^I6`J})1IC;P>- zyYpnl+VO=mT5~)_eGl(Pgvq7UKUPX!CkoSTQmxR1K}y`!5vZ_MtF!~Zef#^E3E zuK0}$L*yC@hKf_RYzpWA-~Lfgn?hdf5+#mpC?s za>u41y#D0A)JEBvF9*i+`2Ab(KUZe(+6HFw?kMQk`sL_Y%Wd7LOUKHKT|byQUj5SY zK^p$8uX*6%$Oo#UvIJh=f?YwdD;n+p??ClME$GV=9i82QpKVjPlD!ho`+)XabmxrT zaz!1rU>}$K;K&wZshQ#CMm|l9($5+5p@qzwxqk;3x;CP&I4tZj(hIs|ob(!+ZTZ2$ zU0Z%ojC}XG+Wc=kb9MQi4WGia4dlhuW>aYo|41`@B@;claf^+gFM#vVhHm^yv{(4< z>gG0${|I#R66oi}(9w&ar*ok3v$>PPZ`EX$%;NeuEgckkS;HFAG}?nR&G|NsPUN{X zS~_Td`W!&t0~uowW1)X89RiKcYIN9;Un&E6=-c)o$pT z^>$+_`&zjyMZg!DJW;vz#I$X1bLeZcqksO1|6TgpbH2rey<-nvLsk{-@aB7e3p}&! zk=@50xCtGA7|SrYrt!V>qjidaAGnQs;w>5n&-3Pe$9H*Xifop&?>f`@(3D|T{Bg@fI}Sl} zwrrNfA{2om`v0Aaxbp?MNc81F?q`4=r*%@{TNGQzoy>Lrye_-s!_b%!o;+~LF{&jk zS@TL{=GR4&Gvt7ungZoE78V&15JFV}rY|yP4+!VE6_0OSmiCwBkv?-^BX9(a8Na{wj~p%FhQM|M2?^xa;~Uv?kgl z((xp+_hrhHDu|so#c%DC;%U5id<`^C|KCGSs`nh$kMx|ww7nodR(7_1c7JW--1eK{ zIj+nb<~Q-DHBP+98sbH^5Z_$x(RW?DrH|hwyMVVA-m9(h^`E4_^XMn714GY*8?PxY zpR=}Gezr{Vjp#)>ULrp>oOue?T3b~8WylxSbNgNy)g9rUIr99KGkoRhRTbJRcU|g3 zH5Ij|Zl6YbYOeNG?S#LZRVT<Nk_m10y*D;ET(H+#F)r@AZtcVdW98 zA&*$+U>>$8Zys^NG$!k}b=(&tzxo>Vq%ywOAD+J>QfO>garhRUg^eq2wsTWOcVyF4 z-=ay){Qr|3(?h>TMsJ436pcBrYBaL77nW&$ZqZ&__Bj76TlTnnn$bPRbXvIO)%%Yh zW13HlsqFTOrK!)TbDwAF-12qQK?kcHo%BcyD$HmasfZuE^^1Csi4u1nCyTR3R_?zWZMi*56 z@e9O+UPo;p;ZYd9$E$n0V{w0ng){f~dh6Z|j_y4h-8<^HX$~?`I$spsJn80(Ryz83 z3jJID{dc2h%eUd`Vwv>pEsPasUGkS4U)O&3^&-6co7PhQw|0>)$OcLF(t}XtmphF zcd(xJif0Y<^yzbky*~XCwe{pux9?8PeV8#$<9Cy}TKYdU*U}A<8wL+^^#7r@Z28yb zPnY+oDfB-fe|p)^Y`=qYJ!EhGN90e>=~3t8e?JWADu0^ud8cbfQ2sP}{iDVwZ2QIEnm_IB`~A$H?tH?wOK45rF_b@@o`2dd zkr(R^ed(1yeTkz-0B<*cdTAzDzlZ$k=JDtdo|yN6!1y1XKW)L|)7|N9*_k%I{YT|b zpFZQS&!7GcF#X@0KmBiKyu1AAMg8Af{&Ws>S?A^d@~3;}Fe-mKA9xBr%Af8=Q{F@V z^hdaZU^BKXV%q*8`O`P7|L4e`p36LX=1+&FLvyZv_xaN&(f+T=pZ?fSkDou?hrZ=M zR$i%cN{i9=z4_B!Jftgs`sNS(^XE^u&+D>j{G;=y8!r6+D}VZ6a`3j!%Aa0c(iK;m&NU_ncjnz0^QY5#ixW#?_vOi-{u=!q zD}VYd`u!X7r_XLQ*$K#>{_^A9ZDs$LKYjH4>Bk0oazi}27aznaeW;4~QF1PN{mEVTALi|7f%=y!Aw)|uAr(gbwZO5|wLb{`{ z{me$-RT?0F8s2fI@fq89DH{p4#dnuK{cLux{OQlWkiou#&EehVPdA)t`z>ADG*}e0pf5`fkKOOh%newO8 zd-lIPf7-ilhcDb| zAC*6io%(OipUw!E1>Nm^Gudy&)2JS|;)%WQ^u`feewgauh$}l}%AbDuuI}-zkrR|Z zea&OG{P6eApMFmH)1Nqg{`7Be{@JYLiu>n>bwtTFLowMR!h@CFZwqvIsLnd`&`&xVC!^Qg(+sAmyEenq6 z$}_g|%ChWxTr%aAY3vaj(W&v#uXSQby}Tqo$dR)?-z6I>|LDv!>~}QR8s_EBxo2GT zO+2$={hn5Ca&|QMZ?^21Ab#EQ(Gibv*N)8ca(tl^=SS?9m77dkJ3dbGV^_Y}rV`}k zdBjJt1}n~QY&dxuc%%QVyffgc9AU-N)DtVL7zE`df10^@bIR@~PQ;2E;EosWN1mH0 zmhbRjW5e~sGUaR%i$@%Z?xMJ}uhA674{ODjdt}z~JP$0LnBw)!!OBGgK8ouPTy4Wg z^?a3!*2bFWWP*~zoGJNdxMKe-`83`~_10~5-Sf1;QdH~&Q6-Taf|#lIwg^LxoPnf9*YUp@vM z`6%?{BhZygpf48_hkQ{qHKTW~2{3xz)g2|b)~h~1Wq0}P52tm-zf=+%H-mk)V!+8? z?wMOwM=r3=Pn33U%-t?*Hg3$_a=w2YIWHYs$2mU)4Epd}=6v4~R&LoVv@xM8#0a~% z*n8gA-rBL@I#W~FTg^rIu!8=hIm5h(GYtz(|YgWbCsiHP#74ejh5I?E!k6?39 zJH3a$Y;G}iG8MbFmbjYPPCl7Fsm&UT{iZ9Q?7xYfPm+7(g{kn)f+=%T9ar}*je203 zaPr7R2lT9+KetBI*>{>&uD)WS+*}Ohk!enQIF}{VyZ6=zZ02sJp7~e1f!Qi*JiGB<|rhFmnoCMhQAchC{#rD>lR@W0{>b?>Y4{g1s)TTcIovrad5 z+LhO}=46jG@4W+geJuC*R`y+7OPpNM^?euH>n)7ca;K#mr?!Rh^}A@_3p-Pj3Z4H| zBj9nqr(>R=4VK*j8v5%ToA>7NIa>Ao{ukzSU&LN}`L1%OzvINzmpd`_Kla4b_vE{O zYfksMKeBC74zEa`PdBG~Ib-WQX3FXQGS9?Ym8b0HbO$Fn{MD1w{rI+{@YnS{`0I== z{_5s3yE)yj7Q)`@ zLr(V%nc(qP4dB1bI zOV5=r}cUcja`SC7Az} zIo)HSEAun(UFCFl&C!$74WCs`w`3dLf3V^hd{*sh;VS|17Q|x}TYDJ3;NpvN>;Kw( zZ{s-m-d=d8`LuP$Z9Am$sJ}V(*!kYGzHamBY2-E&IIC*O7gm z{@;=BJrF$mXU+Ex{V6MBzW2)i${@dpU!(UTH+8GQav5-s11d_x8d=`QB-GWXSiXZLfT9+COjMi4&jF zHs@7+&2Lzk`YQP&oseDCy}oH|}^zIXa}?sU~%j~kh*%lB-XT35dJXK#D=`QC?q zVAI(5E#Lb))zL-R7v^ve$0FU)eD7M9%eC-M)u3r4=@YOmhv!KKr|C9Ub| zKCaDJw7V}hodC9-AU2*HY(2TyjQe3T_BZaO-sU^hTv3g${p5llaB{)rV^y6Fx8_D0 zHaTw{gy^$f=c15YaoIE78Wo@URqEd2583agbC-M3Eb@Diopqn~F6X9%JcJBb$#>aZ%J@z^AbFAbu_H?_W_=g2&N-}iHtR0O zmi1w5S$0mnmD}Wj*NgNic#S;4@Ct1{I=lwI5Aa%?0bc7*0KC5L!0W%VPcVM{_~`KZ z#ee?o_;p$acwKe^;5FTW*YXn#uh9374zKF>0baj5qxX5tJpu6A51e!!r<`DTMb{r4 zUT3}!@VY$%yf(3>_nUsj9C&qPo!Ijjdf@2rYX9Zmejdv*!0SsV0A8PU;I-xi!z+5{ z(cyLX`v9+f$dEnx;~6IaUPBysef$K&EA+La!)x~Y0Iz5Uc)i4$-tY7H41J1z^*zDx zihlX%@H(>fZ$FQp$pEiAP5``?IPiMHe}d`Pbw`KS58elO4bA|s87BZ+|meynb<7Z~AqBHND^GaVLH1JdQoV@Cq$BI=n`_5Adqa0Ix?*0KD#T;Po4y zeIDQW=+Dp6Yfr{&_ES&U+Fa&P12< zF}|N10E4<%z4cVh1v{0s$L6?N?tA3E8GPYkYUSQX{6&sGTs;S01UAs^!Ca#;CsKS< zQ84SR`P@TNQW?1^5HuPWaVKgKzYh=is`Cr7O7p&AB;TP%Q*EE{_m<^sKEJ+@`85-> zQy=`EQO><5j4}TOU((7&Q|^HiOJD4>eD{wUx6AMM)rvA=>2vWZBMXk!_8pr(}6)5dhE|Fn0WU>>o$HpJvo|n2EIZae&*Xoe8KmCdE|xZ z$)a10doUv z?$xj3zj5}ep<)4ha2D{FKj}-{B`o|svUECYEn^R!w$?6tNI5tKysLHhAindtn)f$8!Y#61&Vd~^>>v_k?Uf`qiVc~rpcx4i&wfv;cec;E&oo6;e|5|1i!c^JY{1Rbk>FMo(6~#Z9-G zO?xfe8W#KA3R8YP#gbLb$KEnnd%;{>NeZ+0vdb7fr?(jUhlR4g{yPDqtu1&yI zFp8LiCP(;;|CeFI=cHl8k5RV__>5T_YHS0aKgGP%_Go)>o3jVB>9z;z*V=>jaozVo zV-TN~-UFl2g3peT_(&gO|NE7727=+F!Cg&}G~CIp1MZOH!S>t)n@{tsdHH8ML+n?G{R**P#QAh+UbPn(Lys)A>sh+>D@)lc#geK%mCjZ9 zWvP3$SL$n)Gq>|io6nT-jCeDvW@XQ~)_0t{fV%JTsPrE1XOCZCk6S%^y!YeI8Thmf ze`}8eAF%fLWniziN896}&K}d|-R-e6M%Ny%s8|P{U(PtHrPdCwxgKBo+S9x5_qxgC z>SsYGIa8s2@KN?PC#$w%Tx3yajXAV~vo?2nmeD91@I3Ch=l;{V={}r&8OA&J0b9|( z+sI$&`8>Uk8E~xiD`wN00mkA8_rWy>$q6g_P~!^27?e|a-PBMpr(v{N^n#0TpP>eV z@J%>bOs!)5zBb2f;tqm|+;z3R>J+0fxLS9^Q*#2mFu3QEd#hvp28F9T_-&0DtQy1o zgNE*3rS?~jaL4E<19uodnF0?4@9uc~^@=UP@mb(#;jwcEv5UuF`l{J9k@f2?n(O~K zvqgBO&+Geyr!@cTs3EG86@{jS@>UdLH!q3&F}p?mjNzSMHJD9;-Szx-p#?wtT#aR& zT4Thp*LXE+bYT!&X?CNV#qXpny19-q=Kq)3^bKtC>ho;+W8cTCzFvg+1p6BkN~%v9 zQe^hMww&5>nn$ZqKBe-x8M0r$H6IuRsz(j+&hOjI?_~Pv4U_vVn0&>7$$|&FpY0C< z6YCu>O~%J1INr!RflPhY-Dy4lBF~R@_JzyM%dhNp_Ejg)KKorUq=&zFNji3PD*LK? z$?STcHZ7R-$<)0jzqzzvhO?G)4VxBR!1E)-8M^YKa7s9qI|kn7;MZo(On3Y;E&R#_ zzb*p5a=`a_4t@oLM)GQl&eT@8@});(UE3gI!d z??r#`>59+qz0&6MwCP5F)OVW4&^FEIoiWn%r?#%b+QvpQFFxOz_*Yj?566G>3Yufs%UKJoZbQ zE{MJh_nSF8A3+T&ta)y;;nCySUDjPZ&+$yOttSt=4*s|w zKIP8!9_GOmE;9YK6<=n)iXDG$QR?2ukzFGAi2~3|ckQ}M?c4OL`mQ~BnR$vaceBOI z=7I|!2PZ1PjZ49ikKsr9D0rQ1)n;D*!pxR-#?aiJV%@3qF}neZ&t8I4erw3GEHccWP~ z*Q+mXi4H`c8b2!;7!xin=eyPypw?PFa)G7$)HPb`yMpztWPN(BT5Mgp}Aeo+yn#eSec-;j5t)YgL_UJi$2`vt>Bl@`^MKl z(7sFc)v0+u$kr|X1z&DamN9-l_vEt3xrymvb9Rd=K|6!Y%vb;~LOm6cPAPD8I^uc+7FQgo)VxN1)de34H# z&x%R^3Oe}aL~5e-ybKxWO=`Ojr!D$Yu=2Jc&z*bQklFA;=~2ym5AfZz?nklTcXK#C zDLI(&{$T*t9P2=x5BXn zoXO_=8PrKKHa5RVom67ho1dBvZd?B3w<6-l*d&VoklLVrS2B*y^egZr3%r z>nknzt_4oN=lRVke>Z;DFgJDYO8!>xC;2JJeDx{%^ibu|>C-LrC;jXCzxbO*6MtUK z`#14-BY*RSUlsu`tv<%EH)0Rt+_Qd!g#Agzqil3DfKO<%@)4Xrj0m%^>59O z?^@rc5IIbI-^3crnA2uw>}3bK#-7i2z2Cmyeqa3SHf%v_$lX}RZ?`l5O+43{ZqMfX zPnj>@Z(}Uoy-?4*0!PYL`M7JU4LQNm_h*>fI_H`23?IA$o7K`Rc%l=+n z@6|f9={L~M15Xt<#^LeMWm_MI4m<~6({J!zD+b5Qdw=&_cit;mGhhy%AUU#gkq zS>p`WIvxI4246HSz8HZor! zUw~~XXe?e2KD2uC(K#+g2HN7-FE3*n*%>`3`)C#jc!fG_AF5ofXf5GnMd<8}=B4@{oVU zdo}!T+f};TwY=++EFd1WUpS6zYuhsKtT6M}UVAm`)3ZPEEamrYJ9xF9z0U#%vcZKu z;Co-}v}U6lN2GO%)}_b~O{L7J|JTS&3ynq}b8+RRFLYpE^1yi^G|4-k)=`%I&zZ-A z6?FsGUOSU{w6Ui9kefD5=B%^dn?A@{<+C3AYaV25s0T0VfrV)3UDPC#9MCqD=g2#) zhB2iMnM%(}kt_6Ub3V^*xvVtmJ88l+=!RtTkh!L?$Sk^cw|@nAS^%7fiMMUv1-@qU z{HL#TP6l;O`RY}}8|z=3Dc&|d-gix5*1lVI)P8V!GF4+lQ`GM-9?kw`uPKyl@ihAV zt-RZp@1OV;wP1LEQ@*nXbaBzYdP~k3HlZHAtY=$*iD2mV`Rb31M)j-yPN6S9a>Q5o zbo-q~zu{q>Q;huDibsz4n-t4s-#O#n8<20!zif`tRP5JTl59M}vMWh97~P+G-uj*M z9rzpEJuCRPGtXk?!JWk!=c;}0IoDy#bv|=df9(TVJNw4H zY>Nd)-zCF7u02|y_xKaeyc)3aMSHejP60^mP^MX!j`X^sE^>n)|ysXzjHze%Bnzdg$46mzhl$(61L)%lmrA zztigX0p6e3qg|knx7}B)c6ZXQq({5fEKfUV)E4IXRoad2(XQOKkvsATx;*V}rroff z?QEN|bC&9@aj&JFYO#6O;pk{if2*wiBD51O3}El~LIc`3$Jbt+x_7>%D}9*rKMOiA z6MAqVy3!2pi1k_gz}s*6U%WJPh1G8b{k{%85uPvLK0)D6{Sq^o2@lrsY^;L^pYz~> ztOzoqc{zvd+&7^zHVkeH_F4Z&TMtG)Fj8OZ#SEThIGjY3rSDtCvUA zA*%z|)0wa235_S5wP+7>uS1?t|E=&i{ciGqz4&o;9~9jif8$ce*2+Ew*e8q69^8oLtn-mOmfhOi6C&Wy@G^+cGwP z%C=?D#8Rxsm7kHC7J5w>e<#+lk!GZ%6yJy`3|#c6+Sf+P4?=+x&KH zK-=5F5dMw<*m3%;y%v3;r6^=nmxJ>W^d^#DC)zS#{~?JoWJJeKx&|2pdBmE(*8K*XJE*8Mtbway#wOIFYr_=<-eppLK$!{_MBZ9fP&?W5iG zv~%Yn`BgrG%l{>HZ~Ix{Bz)cKKby9W4H92hm;b>8rfW0UY+PH-aL$D5hd2Y=KixeW zj8WEO49#Ej9PXTzk+dz;d0B2E@0idxA9T(Sy+gKNnvGxFYz(|^$!f@TMr?E`KJ{*{}S@WF9`xnyB4Emc6y+nRqZp+UYN;j-H8DAKBcBpdE z)Rhy^Nzt`0422J_1Mbtt@cn-K`$@oc#Sn7pL&oAuEPIXayteh{hp}zc>fSP*7omSk z53A4T`+L;CZ$J*$ythMZnvt!l!P{ZT_wV#IEcu`S8NahH_1)mxt&F#8Ea!8mZHIAX zj=8ozzSuw?mpq+dzme0cbQYku&!_$8!NBB*@=q-P`5H?m|EzEax+?pz=5e~o|9!*B z&c61UY{z!86WMG8dV;lHM^7?mhLf_uAQQ8>XCF32lKD%qoVslMJJ#xG` zINTU!yuww+;4O*qY>EIvyVuNJ$*?o;|@f(XKOhc!Q0(;dSnZY~mnC`qZ?s&#M zz&oxku@E_@8Tmdikb9uUvwt(Q7O&%8n;`N{4)hk~9l0wIyOjRCbB+4~Qw{*TSNL6R zV|?F}`u?@`&YE*C!Ir^1-o)Pfh3d+iE@nUaoo3whpXjI`$Tk|KC$$0d1Umf7(7QMN z{bRBp<|`hSjRZ}J*eP=dJv{k~wcO`*m!_KKD8~i}svztvQ#{hhQXsfPu}w7JV@1Z0@25meSb+{8o$~ zpc(y%F+0i_JBpv_^PFqJzLV6U_05OwAdF!Q(iIR9NZpKsOPxSn-+@m)1MESUG{!uR(C^W*I4pAVkc zJ^iiIzq_Z>xp(lJ=z@4-{)6K071cp(z~a}_{KmDMkHW~?L#o@LRr8-uZ75<}M?asM z`wQNy!A=-D4_i7o8`x~yGn(OXvS);TUS`=dWW&JcRUx~QYu9L-vZm0oGd*qMw=&@y zKKO?pK9U7Lffp@B2ZxXBC70(NCznS$c<%0SavWpHjvp8XoyNXY$ylOY3x)fS%qoRf zO}X1=ByWUo7c;JHCzwUQGwJ_A#+ku*)A518tDd%bRl+~KWKnc4M?$xkt{>3& z1+%vLmq$_?zA&_3!)-0$mXO)6K{ZkW(3>%w%X7gyo2C|6G<6&PO71Aw5EwoKd$^Ho z<-P*!-`fvEKcu%x#@Lu+G#=<5Lb#IX|yo&ow ziN!It6`7+tn(?I+8KW$^!=6-+p|3DBQRgJ?H%j_JW8%onZ-DF3C5vuKa6W>Zk4N}@ zHuID%5W2$o2*x%s|2Obw>wIWVq8B=|dfz^?{h>uUG1+3>Gh6P^$YRb*Y2N@eGO#rV zd;Z2*B@MyXh`s7#G>!v)m8a#eKENGnZR|zKHN>lB7Y$j-9>sj&>UsOnud!XtVNLT` zQyje_RA)4X#?)4a&NLdQU1Pkpj`y@C-5;M|K8gv+<^Rf|!G;gOPeQ?P%LgqwJ0kWc z*1EE~>ZV1kRdn_ZeqY2|Up8|sTF}87Qmpk)4sX!f-tZ5E9_7ZyIrRT^=uu^w9`$2w zHa)t})?3p2yxFvEN!ReZ_HqjOre40O{Yl}sm<^2G{Ymp7@(Q;MTYK$uLv5SWmGmK) z$Jz57XWt%KQh8Gq>&Rst7XzPhtV29bG%dk=ZJO3EP19ay?HvvuThoJ&Mc`xFqXg$Q z0326v7DDi}5cI8*GjSf{W8=(d-*w~Oq=Tiv;d`OI2OdI4!S8qOUY@=WZTU}Cd*=vgR_>9pE>vCLgTGE$#T3K9~f>~*C){M6!W=&`jwl}FA`(R zLik>DH_j?(!LA~sMR$9pQbsh6{8|M66^^Fu$oS^1cqi${*`tPhlKNOhThN)= zH&;h6xOdmGi3YIYBSYZt8kU$9PCg4?ja#~tF(D3pwR8shh)?d<62MM+1LvlIIZG!_ zEQ7{@%bnnB5WAabvUI-C^@T&^zm}e{W`KQ%pJ@4+?3L`5y4UU%>`%Lj!Y%ERXTN0c zne@%@t6lSIXH9{EWfeDZe`x^!Su3{dPtr#ArdG%9?ASBYXCjV`D2?OTsLF<}y>>7- zE_r4?_RQZhfAtwz6qy>~`}O})p1f}R$6A)(QnPBe<^%4?UM{`&3$G!M20N$R#JCO| zEPd65;rAafo4(K9)#FPX@#XNUV*iLojPYw;T-#~en~OO!3FxfoDf|Z+=+Pm%qj4;< zC@`pQ^~mP338m+)*jDDfYlv(@`LVC6Kje-8YuL#gt?|(>JE#R`?ICs+-P>r*5!egv ziOCnYxO?EPSA1zc>zxlTTuh%e{}M>nY#-Fp#vc6Us?@zUE)DIDORi6XHou~c?Yr;I zw_Kj(-tS&y1ggT=^xZoI_5bF5mW@BXSCQnvt~FDuMr-~yYyJf=1y3wKvf`HTD(DU} zY<}#!@Q^R?dk8<$FPD_ubTRZuGFC0HE#gx$T|4}v7&(CorzJyg<}TJD!Wj>| z>#+@W!TWA&?5{EQw;5Yw$?j9?&)I7CWxVC~bptTF4ww~#9|6BnDtvsDcWnDmerzOg zl`gFJKX-{^BLa3cz)t)2=>xWn=rcU)8E;(q^>F8G8n?1IUWyDlz`XA!6RDt5Pkv7z#*>B(`o64S)@J^mbI7Vd5Zm!3u^ zs^YuwYoWg5*FeU@J}=&qAM=m5{Tj8%N$SHIn?BVSvduQhZ6#;ste&$VT+QZ9%;Ep? zF~QXVWQ$-O_Z?#=;NH)<>Pg2=>gY#Xx8x9Gx!z7TNA+MIdsN^FSr#%PKwu_${vCLkGi&iI5v9l|9RUM z&{#2synW%Aw~a%S>^At|OxpZxFm~_zS5+Ln9sV=gZJ?bEE6b-NyPg#r``Me}$3{A$t1A8oe2&_dcxbh4r0s@ptg6`2v#m{k92l&wXyv*1@Udlo zJD*=X`2goZF>Fb60NJJ_n;7tA7vHa9KXfkEVMo*+hS}3IaxwhLG zvF$A%=UvGsN#u$`-m%ULdR_>8pY{g4obNAjj)f~zkq<9JmXh2O@dp~P6D7O%X~)1^ zp!vY>P2@uNoIXn*y1)8a-WkD}JqV7C01xozJnHr5TnDbyTK=3SYk$uJrV+=VWBp!t zyH)#PvbFE%ZQzLbxx4ReOYMD^o#`dU5}w}A=Mw(jjV^S&ec8u8xVCleL&4}7Ek)E1 zJ&2s)-IF8F+O(%`Fg7LNyJAV?rfKVd3IB87dWGOAI5r{wac}z8rL6mA{$wNDk6f@5 z8B;bm`;O@R*m+Oc`*eVPvSiJZkTsFBia6hOe8$l+MBgqS{y?F4hGO~`)LfWcw){eD zP{U(uRm+nx+u+UR$Y}}MPy2!G_n7uA+h2+7zPOb4#Zv^g1I$flT=RUP7mc;=`+nM4 zXBjjmenweH^K;wBPY>Tz#29OnskslJugUix40iecMHi(jQ!lGT^8Q$2rd%CabTQ)i zco$ec-l4J0XW6u{4V0V*YtpwVsy__?6%>yAbr=g^-taP54zesQ{7ClYV&?1Y53bzHT5U}#@ zWu`e*J8+V0tTU>y%RT$Ay%3yi8NRpN7+RYi1pXX8A&tvDNR1#|*YO&*D@$)=t`FV`HDz-oiZy(6HMMe*f zuB$*UwPHvsi6Is27oZoFlgrSIYzp4u$M^6E?3Q}}f_8!)piSz7Td<^nsOMYb;Sj3*4+-!vcHQ@TQgeT?!qd2qdTh5~um ze)fzljbIZGptH%A7_nmQi1Eg!uXmc^6P5f;mYqnpbIAnI*}xe7*3BxFA4unO0Xl)^ z;B)5SXAYmU?Ak+P*^GG}F*BAQ6Pnqxohu96eIRwO=FU`$Qexm&r|7fb6An zUyqL4zTVbzlAYL66cYh{>%B>=Q+=I>UC+{Mh~e>#C|mNvvf4uW7(btO@p0tW5D#B7 zz@JT~KUC8-AtsBK}`cTT#B>-&DW1qPp@HXx>00x%7r` z^18z5)s-htucnrGOXVqip2O#KK8d|JD7lh+gZjNgs^?EGPrfpVn)s6gN#WP1*|U;Q zVuww9;cFE^;y9;)XJep?&%#eb3qH^o;!dCh@JacNmJ2zXUwLeTWv{@_c^CY0h~hB7 zyX}4WB!;EpWAM$xyUL(*yXytd75f6-waOkp%h3L{d(Hlk+hcbUoAlbUkwCbY8@wdT)HrD4V zCI#5gmuv|0Syy-n{z34Q+QSoF8D4P${kQ{F{M>}z%SW^ees%%Bx$_l{kA|+>F;uo* zt@Zt47x7hDigm%~%NZ4Kn3`puv(doHJx3Ao8Y@Q&Kduw!zJTXCPZ474^gj0erp?&B zyuMtGTgSMq9(lKwm=G7|<%cTI!Vg7GsOoU4A7g;gbSB@u`l~_wq*s5fC0^3oXEE_3 zZl7c5vy47R(ucPV@?N@4dR+7DM#%x*IcpBLF$dZ8HGlCwZ$I5>G4(JR>!ksw z*0|-Iri#hcX46Id-&6k${2sovc?PlFWjp4C%5!4Gk*zQWO;O%Mx$jd`Dg?7GOSRE55nU&fRnIs2=%6^C}N~YI5aMGc8_+Eqv~x=VrFd z8;l+X-I<3E*ZLd-&F23_kB3`wkjEB1gU<_^zRuRgiIKve1kQ?%EMi`ZerB{R`jy?! zTH4Ixed+Bhd6sVTjL{-GAYOnR!8ykkwf)wX`G52!bIibmKy}|C^RG3M?E4P_=1MDn zNwQ5dHvgj0{{Id*IizD4_hjTvYYohI3;oqR!yXgk5FwVaiMWOVf)QsXPJZcvokbRH znGRjK?;z(3zS88YEv$EKXS`q3NKB7-+v%5u@K;ogJ{I1Y->9g=W_-Sdcj&>JyUX~m z-DKyBMNa?JyXdR7VjX>zIDMI0y7%>Kr>|PepWl@qotn`H{cITil05t-`S?$U^(10r^OQO!-CJ1*80;mp*FCYP7Lpa$Fh_@ycqnRelk& z+Vi1co*R>6=MfusRG9v?*Phbfmeta-61=tEkrj{`EV;yrQRyL%|NaBEJPuu)J37l4 zIDeUWqy~G4MK`g9q*fU%pMXbM@-Xw*eTA>_l^H(bYGg+s?mvc{j{ipaG6sFb&nl}9 z8iCx_S)qoQFW4cu<=H-Y4g28ZIu8NtaU1&>Z-wO}C9eCT(~L`N@{GkZ;P3P5(1-XO zrgnlyp+yfLwd@XcNV=fqG`i`;J4THtACVtb(78rp52qh_^60Kz*rJ~{8egH$SDii& zAEmGOP;Xz$tiEofult?8M3X*#nA)O$rR*vD^EZyza$>E{C-$o>vuKE7;2e6t{b}fd zWYoRw`1s(b|3aK>q(_|W{C5#2+we3oqW;b)qUXWi={^IqF>HSMhtFb*^!;F1<2uGz z&)DE9m2H?8Mq@VuPo zMT3k|#cFHr@sTs4S;?9miuHYsdAV`97QY+C`s2$huF(9miK%6d5n>x%o+tfJJZ}Lu zLG8yckrjj&;;(JMv=#V8PU%x^#a%(4r%T?zhA7=#eOY=2=Oy68tX<{k1q*mjat!>Y zqU@FKaqJ5vzW^U>bsqTKUs1;T|J2XdB))IK&$hog>&M>D^VfJDaG%?{m-GB~>-oz( zS1gxew>qv&-P^qU3h7;sdiAb4*0t86nV*6-UIvZ)B((Aq_?73Pd-btmMvHE@^G+;Y zZ5G&im=zN}c!Kn&>)|7>!JqX!Q3f2Gm^C-X&Lq|;zVq{?t%rtN@pbiwQW@jx6dQWy z+jhL9c;4C%cjc!)!Thx+cfV!Z!|&%=&$xcemyYj6Iz|v5`+pNttQrop@wLl7F%SRx zE_m1??5}ff4JTJ3=ge__e+pXE+@-@hcuL+JK8D+Yqil!0pL33Rek;#4HzyuFZNob2 zMw3|DH5Okdwx*)?eC6bKkM)4$+ueMe2j~e)E1UvWZ{@jw=un}K! zTEErb#eVTUY{Z*Njm5P*+jPEd`?=;XsY%M0xc&3t(re&Jw^xQs|MN&{;%(=Lt8Y7! zn$&CV$e&uZ8*=@s}aE1?f1<1efhjhzSlvPOiLNN$=p-j=l% zVe4Os{HU{Be3Gw4?XKrM!`G^2kgISb`eG;h`6M>qmOIRCk2jdxv~ThuEW@8MKPjw|ElNu|44iL_^7ID|Noqs z1ZENt2@iqbH3^_5P^};&!KX|BZNRo_#H#i7@?_fy++GW{N}!qqv`&atgQ+NZOCo(p z(sIArf*NfvLA`CzTU(&Dt-ZY@1atzmm8y_I?EK!Jea=bF1kirJzdz3F%$&2&epq|$ zwbouwdklQHX0P^%Z^93L@Z*8@YVgnS+FOL~uM%2OFw4oSGUYz}9iVeYPIYD4`S^Ee zZMJc5+c&OcEcSl9zyTTPZh{ za=)QIH^+#llXBPdBc{H`DJR(Ev$qgmfHoUj!<;+q#uzj}{`>uFz-~0(Jis@SN&I~X z`Dr$B3+n4y$_XF+<=nlPJ0^51lv_nP!DBXf9{5wTRpq!_0Z(&pvkAt zL9ewUc}hMZH(u?F;irz6L!Mo*fWCGH#$?K-Tt^>f z)HYV!!8fK4)W4oQ9j}8kZqAZfUx!DwK<`Z431wCPFc)WRXr&)#p82|y-y!CfuMM2t zV5=;2B1E6!$nf}77@m2@Unb3(Mqd_X1luFDYh5mWaQe7C#dDp!J-|9XeN30=Xb!Yf z`;ihWH!F#chx|Lr*PLcgvd>DPpV18V!^Z-NO3w3}W!qBk@O>EKUZvIMc&mtIl5sA_bDI7 zV|v#Tc+TWEv3aJr#kpzt_wl?-dP94JY1fY*DeJ9vL&aiZ<(|mU`o%wtd11|wC+YV^ zl~dpcKZ~@lXWw36+YPdD_XJ~`{QW#gdxthTeKl?VQ(v+1S*Z$TRiZCZ3}?t5ZTe72 z-MxR`xl-}{g2g<>j-Gtloy4oHMpiBkT3O+;qu$nD-aCE_!2d}$s_w`N`|Tzic1Sx>FZ*%2JMGmx{q3|Xf*%_>&8#rQan z%QAY_3c*3K1jwls&jqcST5F-Iaaj+;!=1VKIGCD^Z>5EyTR`lR;4cC0wVs;!s;?v@gx+lw7A7rr)n zWL=Kzo1$eI_L!{tnwpAC;?N51%#3-+x$GBahT$KT=w_sskuQzLp}su18rtCFZK-|O zV)}3_?BsYcaIYGcCA_I-ZARB-D`vMUbj8^>=$U+OPTZ2*=;$|2jqf^n`|SQ0uQ)zG zG2|(azEw2XjnAMP5`C*0B7DeMp3lBxhZU;YgOR;q^ z<2yFW_|N!hyVp($?fA#Boi+#YVYmLrDr%|!S?V|64vOVloH}RjH;*8wI zy0>B;bEZ5TrQyhm#poJ@-!tE+t@t+2L&OaUe$sP!w4#N6dGbc+u#tD&Hl8qe-9Q`j zsbBR7HsuF>WopSKMc>8eMu0yPD0k=F0l%FF=15~&{uhVu-p;#I^pj|08+5@P zHzB8-T^y6n8hp2Su03TpYe)PqX7FirTZi$fwN`vhIypBMDMl>PqCq;Z7_=tT{l!`F zzh@W6(Dk+aJ-H*c+0T|Hpm}0u|FPeQ$;QE!5rFI^<*UR9(Ijbe{P@A zPHvxMu+^Vm;I$R36X;1iSTH3w{hXE3%L-?tC-^>jI%MN30$)vh9c}B~65hEod`0ko zoHG6KE9@oIf0w?vxctqEX8QHN^y~QTk*a60d*+Ldy;x>+mL_iBE^CkDYqas@M=Fj3 zYt<1Y-dy%t?IokoE=TVM&QsT`)TMW-?|1OtQ`?MH*w`6%QBHkU%#B}GTK+Z0&E761 z{HmRuD0lD-{*HXdo~IZ4fxDMj{oAoyay&iDQs5)Kb2H@M)qIEtD&DVv@rKZKdUi_T_>a&v zEMk7mx9sn`=||^36yN9A;zVDyzVBg;7~TdRha>1Ct!Bg9GOXqb*TwUz%S~w@&Y*kwI5D$#;TDOimk+R$O@kAO}PN0 z@bveI(Rvqu6(cX~a_neEUdWr#(6!ZW_~{VV!0F@#bSkpdy;FXQt?pELfwKMbg4;%l zypZ0svY2+hVdRB#PL&tXi~8k-7jI9M7bF)7hPAArO`Hj-^Lk%rZa>Ey7@2|g5AJhf z^4C&EHlJgEaLRcy!yMKU<4lzqYVWIPrf+-bo9dIEMz-NX>hOHOJiiJXz2Pa}+sFxg zzl-msmnBC^BKc*j{T6)0K0t0brF`xE72QKP|BLeZr53iTep+bsaSM@?s!Oev&EoOI z{6o`bTt>apd6|92*UvJty`K-aQ0A`ZlrL$l$(Qsm&l98W@oDlT#*kZX=Y4?pcBH&3YQs_LmoIGY;wGHj@LBSRf;B+{vCVN`F62{&)fTtj8n#LH<+xxuA$~XwLk6aTa{>9-f2$59hjmA#v)I zoZ8K`vE8hV{&%fzIe$*G@4B`L>HNJlQc6Bb)(A9cOxw%kid8J3_Nm5}>XUoL|D)&| z3Wk;xw}kNZlWb02Onf6!#{4UEs2YFl-&pVX9b8sj{Rn>P4W*wNvclw&d|J6A9eU>3 zcJ?7Vi=RfIL*6^>$$Nqm+9uPNGWT>voqX!{p5qR)mdZ6(p#&7VT6g&VI-k)R<+dqCvoOM*iJNeeJ7ukNn5$45RUrEY% zzIB36oNvvY@BdY6C~$GHC%+4qmn<1-_Im2)x%AVc)f18R8OsXk`r_1W%x(Zcwcw!8B%F?CN&MnzgF&hQ<%M zLGvcN9_xID)^BUTDqeFOz@6^gU2g+;wn z$F0UZ_HRaCz}}*_lo$wT2zsicOQHSQ%nvmED0_G#lXO$p0eEQNyM{)u=(y5ZXYwH+ zZexMB-gfa@I1`Ha$8}#tKI3|tah+gX)%eN@52E1!Q5{!la5^8Kj97bHI3+K&HX z0*}~z@d?6hY{6V3s7H6LKXV5+`h7pLAI~u{WB4UQ+Zsd%EAPQa8K327Hv4Y&XY-&9 z1^AW-wgq-cvDup!n)uo6%lNJk|J*|IX|h*e(ShApbJ;4mBY%~Dh~ETr8fH$J-|Zpp z{dr&6kH!owCP&Uy*bSu%0atT>o44X6=?K8r*pQ3OT>c$hWY#`OEsGGBS;4a}GJOvJN|*8J~A#%Sp)HZ~b=zEuZ7jH08u<2Cb+lJ&nd>{l$%BT#FQ4s8a{SYvA6GOV*jlENyZg^_An=xP(QqHH0!pV7}^mDf%d}dwu|!ax1CKN|iYmyA}0E-$||i0B6GbzZ+ctQoil@OS0%P>i7EjN&0N& zSw22)E-B&j;PJo9_(bpZyvzrew;kWU71j~rBc)qr?z$!n%v~+HfM0XJ^XBW{-Xr%8 z^Jv;&OwwWW0Oy0ivI&3K)3vjYcKozyb{=bv@8Yb5GSO3D8bSsMK^K<^&v~bHwVu3M z^KEz?zrz|Uc5iTYd+0((9&CbdP2k;R-c<&`k0Gpc)=)ISowXCCtm+A~egs>|MsaA6 zH;0@lMb3wsipzkl{4u=ejA<{=O&;)c-sNFC>*0Ipu{HMx=(F6D${W-&$A>X7= zFt$I#v*e@H%lusr4^!V_yGIQ4jTq2c`hEp{yPEf+Va6_T%<%(jId-Za*qTdXIf{`N zUS7a@SDhj3{R88Dq@s*E3#fA<;}wjJT*W`uhqvt@&0`8 zJuwLV-*bMG>i;e8wWs^Ie*clNdE+$rkH1rn+wYdRzu%7<81AIrQsz?qPJtb9wu@=^ zS>CJ7A5rgyc(746I`QjaT$x<*qY=FjE%NkEo3BW2+{E=bSBl<=J^GI;k{i#o-~JYD zX)f=3E7+Jv{_Z-yk8$14_3^$I!Tx+2(rf16-+5wrurRsMnss87)qXQ$7>~ciIXpiG zUFtFZGRl9hIL1+J^YICm&Z66Weg*nKFK(k*durB&^_i;^5poi58Oq)Y+S83+O%FZ+ z2a&fAEwmcmoMSbRv!pFXu1t%Z1}Dh#zL2u;!v!Bqh?spqd|_mke#>sXI`~+Q`gRgq z@DtGaMb+acJX8>9d}63|{mES9Y0A#4o-kp4a6+ca--_*F><7sid(7I)CZF`j*qE`| zbpwkz--tY-{p10BtN%kh;55&bKQp<`+S7k-T^hVM(`sd(vjG~NHHq&h&uFZ;i~XPS z3sBbhohE}e=XDJ}b8bNYCm-K`%zrS||HbdyE}U@kVUKQmD$i;(e8KD^N4K>ebaKRN zA6W~W<*yZi7v+*8w<~Bhj0N9hOZsrlz}ay0+4TMB<*rSba>GoyQEhL&>EPaB-YGu$ z^tqxOTvL3S{A03Byg{IUoH694xG&z|eexf+xbX%p#2d6g$76=C6C>ry^m+Ixx41t4 z%_atSOxylEhc86%H{3s)SRD2U1?b5_Wub<^@aym$%rMt0juv%AJ*XIT-KgeGREM1!+p=<4>i=95mAm~Z1yp1_Tr7l z+3U&%+M+(W=lO-sHni*4&fdJXVljDFzi$T`R}U)Jd6vH%@#mC#f^uJ_oN_SFhXyG3 zmd1UEcAWW_pX6x#Zbr53zr^qjWO>;N#~E9l?1fGEj6=(iZ&IIkk@H36rc$rs5%alJ zcMUL=j^tA2LF;`i?dyGu&u82wHdSSJ!9!b!4QxSn6715#tZCXA48N_TYbp*Q?-1*^ zw-wkmh19k)SE3I+^#6k%2lr+UhKs`+T=?PF23$S|TnYx4b9jVP4jwM}eVTH4l)FLw z_sK9FtP9WINAt$|SfG5w{&|byCt2>sACqI=v|B=bqV@iAE{|~gM-F$|y@+yx?Qd8+ zCeJanp@jUOj?Y7Cd^KyztUZ67QF0vjw_SU$$yYv}I^PywqJ8NX#9xfU+xLzikB?zeu0HE}buXr(-Y=iIK`aT-e{v2K#xmJx^Q z=pQnU%&V>2wER0f!$+C?H+#M^Jd&utaQJ4D#WZ9>Xyta;By)ht?xZNq<-o^m&7EqFTO zoy~zpYbbjt#?y;0SS!9@^5Kz=wA}Rt^XjVwM*a1TbmB}U=d+*Kt8pDpBxnAX`OGDk zg4&kf&evE&H((o;eqwOjO|LKXs?it!zUBvw&uD$7f)%OHi ztIy&LPJ9Qz?d_igKdQ+=Q9T7+G;{my>pY*V0Y6Uf?1hwdg557=o#^}n*N&M2FL!)? zoJd(0$_ENgM8OH24W@C9I+5J*C&s@3yfk=Bziy{r!r6H)&VGh>9~G+|UKOi&huE^S zR|DSw=TVJ{>`4Yk>`{I1WkwnrUqtW6`++a--_5 z=*s5Gn*N7a_x^@v1Rs!;fDA-Z8KDO|u%KpD)*5dx!qpI+KDc$bMG(?oj ziFl9IFg~C2398dtllT%R@u5;2U-wH^L*_M(46q0t<$OwFJHNQf4PN>VVzS(Iv|Zf^F7Wj)5RE)Bgpp$oKF&KtvMUH!=0;#(diY# zuibdwwV$>Yy#LoodmnnAl7O}S7`ZA#lT5yq#i%QuYY`TLoq{^Ff9j%d#nY|E_yv?fw;I2|N_=~4Bry~Jo7Rbu)(mo9 z-Spv{M~I_-x*6Vd>G16Oo1uTX!O)Q={!hra_Bgt%v28EWhc%PP+Zmi-av0yq_^N|e z;?87pd&iJSg4`L2j=v|jKcl`f9*fxUo&455M|3T(#@fbS2RangnJIg#=vVCZ*{xlr z9aqF}8qr#_cJ1X~2VN~Ydy~CQ$nF(P%}0|31`U;AR6i+vW;z1-a6=(z%9k4c%612dZ*UTCKU`tahto-Q`xtyWd%2CY$BJ zrDd!Gla?F@9z0L<+)7UA&s$YZ&sznxyWiu@xO{MoHMIne{zQ6V|&2oLvtMZzu2WIY0$e@ zj{5Q<@Lgagv|YLia)k7te>lK*2j`Ic16Xwo4K_w*;u8v9wa{Mt)ku3UIt+XnGec$8 z$T&3VPw0yLa*g7w`ej{mZ`R^FI{oiD2R3zI5c2OIYU@q80?J80FTi>(%_>l>u%}mRa||oa+^7JyIt2f=cpnFH6RClWNsOM zA3_)V$F#xp;lmH@#?|Qi{pC6@@|SzWlzW$QUma8~=Ggt*y;!3u*GsuCIpzA}=E^@| z>U+xZ*X6uvV7Z@i|2(K%XsW*)XG~M>x0I_GRIanoUk*Jkc;3z4nUQ1B zrID{d&t_ib${pC`l%t>pU5cK6#w{Dkf&b4Tx4}}E2ZJkXxg@hhu5@J~>N7Gzhbu4f z{(#HRu?_7l@|U}0psvNfx-N9fSmUT`(m+Rp2NN}K56zWY<)8hv&LS5ANImil$ZOO{0R1f@bV)UaIVX=^_%A3 zvb=9uGPxty9&chwGI%c^*V)J(DnD+|?AAM=%`y0C$iB4C`bllY9}hUWa&3O+_3(QQ zIcShwyfVLg@#@6y|8q#`pq`?>!w_ci2+;+w_D;00;OE666Iqk^a8v6Cwu z`Fr&HNw;qw^tHT497ca1Tpx5~oG;S{ogD;y=wHt|E2kXYm!s>#X2Ci*a*|vw4$bQ? z7jtYI{pFe|*G;*98C0&^v2nQc0ow)Ten+_lgUW@-!!Xb;Iln3QOUlh3RIW4RFL$3Q z_Y&pUBa6-r^pAMnf%?{(a_y9Jb$k8g${o9gI}UupY4`t7?h}LRb8SIxx%*AI?@?~z zpmK4Cx47kq_oBYdlp9Yu%~3b8zjK?a5J=*^iy;uH6o3nMdb7nB%PHnr!s`l;1tk$u|}c&M>yf8qS9k z3`Y3Yy@j0V?F%N6f5qRg7q&3 z-RMu;d}Ahd_-t#2?#$N|tJ`Y$6Yt+cw$Xm}c#?cJpDjoy`4)VMG%q?6P31Gu<^4I3bIlezbNM9b z@$wHB?K|>eatCK4Ovxm7TYVt2KG(`T@+7o0(+btE4`kFYv@?%v#h*W;aLtBG?TpOK zh}EETTo&C|z3su-h4oG8);8${InQ9^1GUysZ2Aip(ysDw|ABTx_e|0#C|MKuzS&2Or?bn~woQ&k>Rd>j7Ht&) z8C9ojm|hOXzkbOkZWcah$!Cka7nYS6ZKMBQO3Yym=N;1iL4I2i@+`8JWw(+4N_xc9 zv9}TXL>@L??af4cEZP<>{Lf|hjQjXS3Jd6 z-oAxDC5A55mg~iFDA&Y~kuine@gv{(F?OUQYvD&*F0zh_e%mzpV>&LP0Z5c;ST3}H9UF?YX z&R4g%_a9;7;D3a^$Ui085j1BM&K^XIQgH*D8?wZ$%%^N=iBvZ!DkCe1N{&+>*2hoM(=;&_GAA<>cMWM`WNHVsBh{5>NBwA+pV;hP@ZL;S-{W0WQ?_EZD1U!*2ca1H{PkA z_|Kj(Ux+&nd|R!=F=&2cpr-wK=U(+3_tUMvH;7lsr`~6tYvsO&P?^Vy@Cr^Dh2f0P>qDH?8Y}>iK-&JLbm6$0RC5n6^ z+uqY^6Z@LgOu1oYebT>5_v($Km2oU%9I}7zqK~bNV;SSn|1$o!F^)>c@d`fr_~af1 z4;DO1ovrktkbST2-kFe!lUYaK^=voor@YH2AN45eXZ(e>l{N2V64f=f+Ow@4(10Bp zQwVupcRwtQU6^N`)R*#(`pSvzb>W#+K&-CDt9iN8%*)s#wX73jHTKHaKsNU7b!Dx{ z8^6v~49NAs_g1U*ypZ+q_xgr499V~J3y(m@QSn%z)mY43u!tI1gpNdjMGJISeJFR~ z?ZpV`oXf4WrQDZM;>N+j4O%OtDb7-x^V~KIZ^WiW%)Dvy;^8T6uA$B2f!yi+cmuqJ zH_gC1rH)(hNuP(I6;ivwpDN%nYVeIW5{ zk~qqVSGTu(E0DO0ctg!mxN3Y>D>yG)5*{@JFU?oT&Y7;YAb6Si^W!SAnZZ@^q{CxV z>_bT6Z@UxIL683(xMig7$i@!@@JUMd-YejQf;H@Fbdbk#% ztbD>0Z&L7fa%OxhGKgLMW4o-T;-&xPY(M%Rzrm_fenT%ux#XYO7Yve7@kjQ9ZSm(U%R>8|r{Jf>T}Shs?Qp!BhRel$%QPbR*}sjeU7yz2=sj6eG#s z)X<6UTjvy5$Y{B}_|XIFm}290IrYB8K1p(q_kRxmYkoelz8e}m8(M!kx$JVSQOooA zUUey+NcGsPZHw`V?{Lr3oaOP~4}Z_^>!Z)aN#_iZG-LuVzd!pE>MOUb_9#~&b=Fyy z{Bzq2@T)8N#-c|Gt&Y9pU(T@7_MIkjMl+NIyj@j>-%u}4vlIr=vipa zYS;xW4kZ^o@`rmKtCxMQknaoi{ZRPOX}xDl#dWh2C*yXnTnwHnrN z)vaE$N@rYXjg|H~Ypf8uD%=uY^{}RN4zl-usaazM{dl?*e8{!NFK>dc#HdT_E1&fh z`}w8y^T18%K?cv)=Xvg*FRjH}!Nu4ct5=~%nd#ye>oL_IZ1DM*w@^X-@I2~~-|a{F=OpJ0-SdIFkI-H^MP?)RJ^2uRDao+$6AhEkqY`|t z#9vIhZQZB*6Y>gtx=r~se-Li1#Aj4%w-TSxO4mPZJ~}0xe|gJ!nVV;hnBC|3lR0N% zW^67-H>7;OuIaG>yKoE^=&7tBJl$n~akr1PPl??0Fo3WhSVTdp_>J=YxJ zA6;=`Vx+2jt7BgY_;PhFtaR)vHQ+^*xgE<{nlbqs?H<#hn9d1Rcdjb9mE0i6mGWPa zKZSFq^B9A-2U!~<@za-|W!|}*v+d*K<&Le$>Ap%a@=vd@f>VL{&Mb~$tg$f z^2L-pi*nNGuA?kIeTh(nH6h=h%dC{V;34w2#J@%^rdMVs^4CS$PwtVwY|Y-@o zqnc-BJi8qJ#yZ`5lJTST*!}@F=;#M`Z^#{EJzc~6e1QB|VCE>ayqS542G6Mv9o=72 zKE028XEhZ+WL)0&1=u(WFPS~7_Y!+noR|dZipK7VBy#tVJ0IV|rRWp-sK4NA=xZ;r z@Cm>-2^!oxiCpMGavn?yG#tJu&~OBM+nZbU-)=oJ)yYF@)5n9sbJ`BEhKBO{oBs}6 z(cwC6SjuHTtqVE%1Y=lOZ5^$o@6m~q8|DSa)z`uEz^fy(v4xcfN7aY&CpXmbTy*qF zY)87>^wP z-*eik(F2FJJW^r&kcsKJi@8g|laYS8aBW31cyjMCyD`QbuAgF!Tv%zXkc}%2tQ3oh zocgrZ%9adkT15AW)-+3Z_(lhF`L8z<_Z@9ox&FLYa^{m)Za(yMN3@!|^7kQBQOXhts zc2CYbZ-X~Y>o^ylHIg~dog7KE+~1;Yz?i=QFL6DCw2Iu8N zl>b(8K^gqz0Q&JB=IS8+Cf&4kh&I(m`1g*U8~M@5P1=tnZ?Y1y(P?c}(iSFU4o2=@l91bWxK zZ<0^c8q!xBXKaD=Na9K8p6XD{_$@mXW6)Qu`P0~l3)6b;@0aGQzhC5*SHB*nUk?0J zbC_Mai08Bcect}eACbkD1{xZPyVZRIcjffhExlf?&zA&!T@5+<;Nc(bN8W5w!nRPwSGXBZRTKHjL1@gv%0@{_np)S+fqu=5$@T(&c+LzxE zdX5ECD%Xe}?+Ib!T4)E2yf`mBA#48dbFvoJ23IWOoB8SMb4qzPkKcuyZz7o@W7?LS z6P&jh4d%Rx{vvTBG~x%~%Ek2IEpX?el>Qag|DOLJzTw#RwQrLQEBwm5*!7WSzRuUY zf&Uie@~{V_@$RE!Fh`f`$jQfDS!{=e{w5DT2H(=%)8T|KutrYNSn_x0OckA-fj!2~ zTxOn)+>%qen7#Nq#s&?IUs9Ko3|L1$7!@;el44GwRSubOJMfTOsJ_>DpSP{ifSi+-*y` zhD(XJ$S+Kjgo;nYF6&liYqh#XX}0 z+{$yt*u*%VKX%WCHRLf=xi1WQU&B~76W6MDPw*~xlr=4cJq=V=-mp!%cJ`6%X&X1` zeStluKFL{w0qA-+XQ9e|ARWNLtE@(J@H18BeV#)T!OJoA4^UtH{5Lk`PPL|msWZcR zE^D675GF1U*A4SqGD`8Zn5nZ7iXU0)BUM9;4SzkTbDgr>(q@)0W=9 z&wI7k%D3V>2F8`(4lrJZ+>n9XP<~!#j&cgquF>x(e_-w;YntG1eoL3L=z**___gQ^ zFc{;)pga>`w)Yp-%twJ_nt@fk*iB^>x!Ng>?8<$yM!7{=ICUIYSpZFJCPAS&8N+ zuwDOtY=B%t6IA+-1KfI>$>gx-`-T1zTT8M0Y0t9 zrhqO#>vZ}K@4UK?i%IpLUpnq(@)31e4T?KLmN}}}qvPbU_QxMh1h(hVpZ9)#YVJ@! zABaux^TLNKy5WVte3$&_j7{epgrVK>wd56KpLi4gUh#j6R6Pz~Qcl*~^qiG7z*D&( zGwx@NQ>L&mbMvLhBQt}2&vs^%6qR2By~O`aGI1F`83l?NC*Ev;|JGI5p{A8j(WYXO z^*)t9Z!&#q;r-3z4c7b6m{1Y?est?t_DdtlMFK5yY1F1RY*6U*4_iFjd6xBb6L=l7 zONvgdx7M_~fqKVbAJhBttWc5GxV~G2Y`JqRKIYV;ybqnon5Wipuc@P!Ivyjhi{2Ly zv$*E8u)+-NSP75s&Gs-lsj{w~?vE&-DCH@Ga@R z$|s@sgjeiFHccBjZ*|zcw`7!^$Yi|pkex)Y=8+R`KKUIMA{R%R=bgxezJ9RQYPgH< zlSRn=Uhkv$NL=W`B9srGI79tSq9ehXW^Yo% zc<$gV+8aZC&v-B`M~6RvTWc%wX=gm`ppZNbZs7*Y`;ojaA!nVLKYWj+(>tZl_9jzy zi2D3}r)&zI){=vYy8iw*PmUayk_)%x3#>!tNw&kZImjX01Kc}IF6WPqy>bIHS<0Fc8AfrJeObQm=i6G$3mWyy z_nxiey=(D9S%Yr-C96Sa087u8%(PpR*o#BhWIy(toUN&G?h82|utw{xF<^WSV$d*r z4xTF9cEu?^2W9m8GU53*>>Da`?yYDodwyjI`+n%dFYenNWxOM&S9^v>pJixO^T3?Z$FBT9xJwQjkSy2mq4F$g>m-@@a{q%-B z7b^GRQOEDJK)xUBgSOJ2(wM!X1GtoO=Fei*RR0(vX~vgeIel1UIp;oz{?Nu#-agu0 zTfcVflAP^H8wY8_#5q7m-YIkF$zQl@-|5+@JR6nU)>E?=r8Nj9*U{D?*2&AC7+53w zRR?RN{dH%J{ETK|KVx$?GKYNB_22VL50Sq{G0e5Vn;1pK)ohQ>pKJVTkD;e~TznE8 zLk9JDI`7M=XE*hG|D^-hdhR9Xk?d;XBgzvO=2;fMVFnbwoX^2ved$1`-O zKDcw9H+9UXj&;o-O-?1AXV*LJcDRXGA zHRYb8+-1mE_fqyo@c1(7o(C?KBG2Ie(=WeIfnG>{kMOLQHBgD4k8=O@rhm1#4*6z1 z^kP2rqH@T^MGJ>oPqTM)<_-O|dZL4N!eSG|0)KRjgnuzA2!6c2|w0Q7Mo%A*Uz$ce4a~so`R~8M#j?mmn@|I#(}+T z6zsDX#3t2L9oZUem91hee$=a(yYH>D_sI6ugTCe<_;Uj?(g(~fI6FhS8rg`@GcSk% zpD20P{Bt4y>HdCk24Ftpy^($y|7jQZy#0f>pD2U(#@LgD3X#LVh%Ny<6s?i&s1hAS zIO^zYBqPb*QNTU{z0r2vrJoO>pO^f8fH{#q-_B2K*ovN1Ygqaf#moG53G1Kx;5m9> ze{yCfFiQfL)2)lKK9E2>dDpzak@3^V7TsO@5Sqsn4q?1`>Puy>scfRXWp9F|S?0;I^*pnk(*D z!dZpTq>a>bobz|e!F7jrjcyB^J#bcGF5{Psy9oP8EZ~ggd%!3@37fzi*Tyy{(9k+5 zut#>amcQD2T94R!e$Zp@(OH1K*bSU|Wv3o%{1Am3I`8j?zF2+bu+!K>jJ^4Wn@gTt zcT=DG7hLT43IEH7PR=9GZ+_h*%Hw01x`w}5u^7Dh#b2E{%a{mmTUFY*^KW)`}oBMYiZy*h3d$rzw?vj(#mfcVkWFj*iaU(cN@|d&ki8 zRqt=PPd}jcv;Bhd1fXq%|Kf24(4H3JeFoMddHkqnCG}j3Zaa1va!aPQz3zU_S40+y zpyvcmE6TXfqn|%;`x4^ZrY%V)?Xp^e^xq z+WHwe|AdRr)5opUqp=0Tv#W;IrZudG7bJgZwe|)r@|cELW;GiQ(MRb;Cw-5cN$4%} zI5*CpQ%f{U{Z^ev@TvF`_5P#y>hE)WyC41!nm)fwpPT7#EB$P}VO)v&+Pv=Oz9*O7 zylN|S=DX0DL)RduLu+&vXz!=+3B{K87Wfor49C73Xslts0}oVOs<9*a+f0R1gPE5f z(5A|2Zd$k(yq27SK4itB*OCkFr7wfW)&x%a*P^!;7QLM`YZ70u>|@MnG52Sf=vF?(Cd39L=UI(oDtiZ5Q6dJ4OzHXNp`&adci1Ktwg-RzQr2HSef$l&+C zjja77efIfQ--T`W_=^P%tfTfye#_t3%O&3lK8|d1_IuGK&^{}#So%!iqW(v%Jd;m& z=uPOJl=IjgSFHV;vq$@RRn+8IlRezA$d0vvv|MdwqDHs@13)9izz>-Vd9 zJOF%kF4b;uBgK{s4mX)Sed-?O`~?u)!TeeOl)oHm<%eZjrZZ0KGkb0qq=Yzk*;w@2DDp|{oe(658fO?7`i$$kPI zPyd;`F3g`YFjsDNV7r|@#Ne$1Fh@Vm^Z#)BHW=nN19Qc!I580ee$bwd!}DeP`gs|f z!>&#sz}|i9l8&m|R+lBbxGm3?B%h>;s5zr6(Sl7Q^p(-*Gqb0+{F_zPLLB0oz)-%u zedJp_c2f`^RQylZq_=(u{n8nJ($$SY$B|tyJ2BSeY_wByHtM`7`N=c?Mep899G;uA zF^d14@C5%Fa~7P@P5fo)tlVAjdgP?eDOa@@46|lver#}Vzs^P+6a&T@e#(gxM}M8s zv~n>p8x4*s?m}y*6Is0Xc_(js26M6yodo(Y?e!n_bV@EQaO*+0O+D9Ak8E20axNWq z%ROw$T}8PCw0Gumn=8tw?=p8T2cMIEh&69?;d88pGV-xHI`FH2@myd%2fts=wp?eM z++8(ic6SRY>F$PYYTe+lf3EVxEH*B^pM@y6R;cPKO4f=@VkK+ zKD3Umdm^yB{chsykn2NcU#R&WGd;w<(9At|=Pb)KbH43@Q>eThl z3Vg3Q6FEMD^^NbA%I2p%Oit7>ZD$>D^w*l>T^;hSd*pN$)Y`1*CS3blU zv!WXpyJZBo9DGHk50~!T5ATrUTjR_NIpXqx_x?XSzBOvQ7yK$s=d3|sgg$>-gnpbg zikPE}Iqe}UbdAn!eNueF#j~qE63^C}`TPa-kLJA9we-b1<2b~AUFUio&q9C6Ime#^ z&Yf<)DaEw-`yAt3xdIP&Ymr^)^N*=hXO?*R#LB!r{jZZ_`*qH~JX3w4zxe7SrHShM z4)u{^B76Up)=KH!i|EgnR6pkhMy+whI@3hF-Oy_H+(5xVu-^Iif&Q;IFkef1pWz$HSzo=trLo|3JvKGf`^7yDjjiO}$N6f%hdxzwWufr*DfZb< zBjb#WZOV>D`{L*%!{}C}-;{j-y0LvZ^Su1R%p0oh(dL{u<&f2Skv?=BYorRgHv>5s znQ3nnpI=WmItIPyIe)Mkc47l07wdv62d(*Xc%*-vi-D{BeEhJ8x#vdSk)`u+(fzyg zT7V24rMzul+;ADN(K=r+(wbQ`65AsCj3~58aM|`6c+ETbhM`$r-zLy+^=~IRQuDzD z>22fUJLqj$=QEa}v&}{ZpMM2>h_PM+JeC!PH{Z&4hk=p)SMpypLiYM^-0F*|aj(@RyzNKdw-{$d(PU3qzu;DAluX0$;2K;wl#i#M< z0_1@L&Z-F|(_3?~wZ?+tBeIL-OpgVvsyo8g%+MKZwYAtTweKpp4?YpHcI31Fn&3!S!mIMR@Pn{Hd@YE&RmENCWOyuTU7Sh z3}c_294=eEm^qhkac=%hbDnf1dy9$rott#lj&!|RBR8Vs^3Qh)AE-qpWR71tk{U0p zyik&pzVbP{aXU1bn3e264RRBg=3IK8ZtS4Owg+wS_HDWBMel^?I(*=xefrPXC;Ji8 zr|-}w;nfb##QL?`XH2hfPp;GX>S@?A(%~;d;4?$vHz9a>7@i*BOj;*qSL;tXn8(4} zlgU797&}}6{`E2Rka0gx-ycZj>Bz9;wOJWD7ayIGH5KLf8m(Ry?b8?wutjAs&sQ(D z8s@@}m$4R?W4~Aq{(jov@377C;Vi`WTDgANn;T#IdHLu9*jK*FcqWg$W_6}}SD9L9 z+dTFUTdeSr^QPUq$=fSRU!wiuyqTQsz<$fyFK!|SD)=))XN&vyh{xC?YHe%Iy}Q=4 zU#H>iq0-JSUtNYj*ykv#`TXfGk$D+Mn7D!{{^A7VR%(jkZaT%-&b@nfsJA-UpVf{xYk2+6Zy5|X<*&Ff7p?~?eC=SE4JKdn>+~17{mNR);9H)S4CH`K2~(Q zb!ir6{TEJ($YMw~KNWXT4^b zd`SN1>tAus^UOt`CjOxMb)L$9vX0`w_;fU|w0cNu!6&VR_{?D2To}2n5W0w7X?pl8 zR+ZMe&fWn+&VbM(d=*{oBlwSc~oSGst3CK&C%XGm)&d4_e~tLEU(|IL{MKAAj~#y(oH z3tU;o{ED7!=bO5$NV{ULE@ZtpF-p$adEv$EDUnlSyqCSxR_@`k{049SZ_eKPBRKOk z?Kp6D&bBXS%sTfZ1h0#7=Dj%s#~N28Sm?|aCl|T&`r}Mai`V~?y)NgjXrC{i2PeP2 zY!~C&(!e>b**B2wB-46zOHP*UV>P+0&3Q>fZzfMP=S8DSj(+y%RpBtP2CT0*bEa>W zp{Jcs+KBnmL4A^~Q}oGCzdE1=9u4z!vVy4}_A$r5+TG_oR$*td z{|EM;10Dw+acB?gYwum~wkGj{3pf{PZcM&6%cW=1TFa%6EmuB})yTf%^&wkwWcQ2F z7tx*&_eyYR-q3J;L3i#d$KS>|ziJDzY7IX7{{FbQ@UXMbtFOqXKX3KgjkWN1;f`M) z(XfELS@cu1)zex1a&mH`+O@gF)3nas#4f0BJ6>~S(w8aoaeUF+>&oA7EPjXbH;l{I zusUdXW8ufeo?Q@3jXlem(_ReUlm1Kl^jZ1Yn+tA_RINgPB)xnK@!+8$dBtxa%iW59 z#*(#j6SIk7Tuf|``u+^L^(DXc+bh5c>2=DUc2j z=z>yUT+1GZZ@$Gh+S^Kpqk2=y*yx8Tb01|?&)|LSCz%J?ExdQya|W@msK2r^jNyNL z*#zUOFl(LFumxYyIP)^vZrqe7IdKL$WN@_$oqYB5pgpde-yOPK6+eTWxtaF-J^|gp)9b(Xvp;tG@4-6=uAc%I z^w@$+sbB}s+W9Twf#8KI*W&CY%)G>~bG?txQUQKNq0fvpdf+Gjx7y??vTGhRb$lgG zzBKWNm&l1FeC1xk-O+)4G=GR=7l-B@%{&3m$6hY}-b5V5;Q1eZ+WE(?hB2JQ7&P}Y z;2|}vsRhWv+MfoQKdqL{mlEF!v6m80Xl6cQ?4>%HpE~wZb?}P`?4$k%IISlWo(Pe&DZ{Dhq~t+S1opYMYo`LtIs zV9R&c{J&S!^8P!#Cmu$z%zM?pn_0^V=F?wq>YBz5H=Ot%zH@kLs^8|NHz=-CYa074 z^^HKksy_SMhzDmmXMTy#uqW?Kj})s-oz;3<^EZ!E_^ENuM1v`s~qdbKe5b8H4FJ=MDUZHK4Pb z&a|JEd>Y2rdkVhZ3-R^dg&h3~-{+Fw)8^eP(4YDE6U;~cl+CP=a+4n~d)_8L`Mbz$ zy>rmx!B=BCV{iDy#p7seBzES*zzsjBqpj#-r;z&tTV$d`w9KWI(g)9&hWvOAdOGN1 z5c>Fot@a*gE+-hdz`Z@txo-Nzn-Z$Cfw13N~6MDWN4t&a|VaK6vXx!5tK3kVUX9uqZ&UEi)E&LHY zklZ0$lz;k9wN71s@Tr^ypNTF-IRZP#%jea1YF(U-OkJJS<;QvXOHTnO^eo06H|Ih6 z^&mPBoj++^T%>2&bv&yhzdJN00Id<+ls80rfQkp4u{CiPo%6l(Z8!5h@V%8#{o04@ z5?^%J;6?bq7@H4gmuih`tyjS_CexoY;b$#2zfSmS$n|L%>?h*+uS>@g!`~o`Ze=%X zG{n8%2cEsdlBs9LjmN+ZjYa!Q*`XagK`sVQH0CF7amJiS9bUP##a2T)W&i)+%bUp7 z7rD67bd8HEH{$QH@1~L`gE#fXu)zjtNBud#*@b?ZyY-e-nwv@+>nqBJHLaY-+-p4w zm$sx^GvV>0{rD2~(`lP?fWeo``9^sm{5T`O`R`zZ_J5n&9(ii{_CmhZyl$gx%|*@` zTvz@?y6XYnkn&wEzG!@x>+7d*zWgey=pVsP%|+DE)@$*j8pyW#x^9Gul*@(+vpcNhV~WR!vBxki=4ur zuJ*~YweU6OApR!#B7wW`NbQQ3OBb>3+(05WaW?vh(2+Pi-oZJCmQ>Y)Z}N#D=2|?q z*U;ne@@8=S%&^>0v6%M$oA%T%&BF@XjU70` zgtf}K)=vh<_4P1+--Rx#?b4uS&N&zS@}R#3r9SxKljHA8e6GJQ51GDvgTBDWM~AnT z%?j@xTI4UEg1gdNg1cX(ynn6q{nsNEd+}*7Yqrzj-}Y3KAGG2iw$P4Y*7n>`peiok z{Bdcsa__YgHLnK}=s!kxLcf-=R^%rcz1Z50KeO>E>VQ|2q7&G~eI9-r`{c)EX!n_E zuiBT~vnP>CHzq-Q&pak_X)qs`F(ywA>!PhQmgii`UBKXzl=tZQe=v5fzk-XwDc06( z{2yjFIsWTS|A+N;IqU24J|idi^_jxAAbh~zR&26=e!f$YPv1t<*17aaG}2EW8S93} z-%TCsx+$q+EiduaXEzwyV^QBvKWdEjH!I5U&p37nd#(@WgL$3gcdZlIHYCT(mQxEZ zPeCu`=|?9bj|UfbRNc$oP%@7v?|3rK6N?S(x?0yq7--M2|5Kj_&1HU?Gdl)#V4V}eZ2RsYWuZq8~H*KY!#a)LC zU-#in#Rd4%mJj88H|RsFU0y7Bl+l0bpC9N+Zd6`cy%+s3u;MvBA{C$Io#U%A+Bwgf z=QTWoj;&~7Z))~Cz`8>@G3>F+^LgfnWo)7kmiW+h1Is9|Jj;cl`ZonxeLb?e_GI$I z*SW=+$kxlDtC{@QUbUXHmFqcMc|GSU*K-D8HEVzVnDsg9p?|%cxz=gjTvP{q>VQK5 z-xRnoit;XoJwx_VJ&!RDE$B|6o!jNVF1^QrPes}_);HS80iWJiEV<9n-FwV;MaT+S zu{YA&9UY*~MIF=D!#AD|@DG3Rtugu)g1)OwjU&dn^||a37Lj`d`n{rCbX)yE4=FgW ze%-MR&mvb#?EJE-kZnzmoo`qDf-%RS6*0yWx)5H?w>7|4yayd%icLe${W?Kw&>TcL zbGaX%YacXw#G%Z=HtO+kS~4g3l??BX(B_z@jf`^oHNiZVF^|U%4#-mCuemQIXL|LC z{y$26{&n}YJ|CQb$s};bk1OTG$_(@qT0|RvqK$j0$CHaye+~b4uO}}WvQ4?WUl{oA zF+;`W1sA~Y1LNv%6E~y4_(Xpdd>BL#2?b{1G!_9 zW0PBiFNvwscOI(xB^X@`jPy=8tpC^WUw9|ltAbLzb&4tje8i2 za1)v3*OFOUIUn{^97U(gn9d)Bqq)t=naT+w_z3>C6-g|{U*NzEk@ktm?yn##Ag{MI zao%j4XLXdB!hQ=MhkEE)qI`+yUeik9g7hx_wbyt&b?q$$CgPE`=r)Z0z>R^G{y=lG z2Kbg{vPM^@(({&o8!@m(@qf!_9Pjnmjki<&{}p%62X`WjuLFDTnQ*7zvE)q7YEQwR z*v90{gFG8NNB;;O#2@mH<54poFEWlQ&hz%yCs;P2U-0H!|MU2-x!&l=W&^b1i~c%^ z3kNpasIvgrcz6;52V=MS%i%XoxvAj7xr54;FZGqf7e(bBr@qmY3xj8p7i5?5+e$p$ zZq2!lZdW?9&6hZ~lCO6~BuzveuONmj#8q?bldqHiwX zJcuHPk4FNHvhT#JJK)#k%tszc-|gj$ET^BJqQ6(8 z@4Kp%{u@2t;PMH^D4qYM?pTvA$yXvB{ooM38_M?~>cLN9O$K@MHQqGFtDL4*+kv5+ zGl?xISv_!Ob(DQz3-(#bK)Q#qh2zm3%?OxZor$dLu$|0 zGzs5V=<)Rho8k3}C3&CtTK2c{XE=Nb ze$jR~Gjvs9z2a2({c7)|wAL8D0+n1>B2RVmTxEAnLbjp49AsGeDqMywY0bLQhU_aG z-D=a(2{R$*SqGE$sHN=HO_cS zKP0CbK0L_vCLiaIpjoA@P7Ffn_pB9*vERG{+<>?x+Zsv_*L$$dup?Cq z$rri{c~0=Rhz-g|e%Ck_6T9_$)z2JtDYqZKlcoPo&Li}#rFD+&tCjgK{3Se7`&;;K z(Ac^KqwKcX%*#KMpOM@=GXx90pCp>iymg}k)B6RyZz9&oyvH7!51gF$m+y>qU zz@fqL-g1@$Z_l<7Wb7|%?CsdGwJ({pds9Z>mwR)Gb!=vg=6~cx^S_Hao8VLav%odB z9`^du4SV}M`7nR?G57$no?T-HDst;(06mt%PLRP>Dt&bJhhD;@=I@~>|odg z@=gz%F8~|l#2Jy}$)b&Xr**D*?A1K74tt@=z06&K4USK;5}z8(oBVs)+9xWyM>ee- za)9;D_o5+jzKwF%K2&{*us@OyT;9J28s&%Jr$2GpQhA-h*-cyOOYQ$8cMPse`4If; zPI6u^YiysRH+^c*e*4#Ezs(s-KX}=Tj!qavWtCA7jy~vZhJsI781vbe z-`$t$)7T?D_$ct3^Hw?op@!tuLym^w(-X;W)-AlDKb~!4Id)RRv!QL?JG19UUXjlF z58iud+hXx_zDGB(w`+~_T^GKqtI!Qs9gZY!&a!6Qi5{#I-E4RSHs-s-n?rZ+-kel! zL3_&^zXk@9J@h^_l6@fcOAn&5^U<5VdKUW6TQW9h;y1MX#@5Y|^s;TUhtJ-&WVpR; z5ocaS(&ucOo!@cA{CSj{#hHF}fo+RM)?9HIKJcpQgcnxBvz~;8DL+%!C}+JC{UX@t z#~pXi<*osI&X~i$cRBuA@nDg$2`kQZk!S zI&6|zE^%~u!H9|(|>6W-P`B)eWd ziuoaO+9N+mE)b8Ja-Ma)d=Sa!xS+HanSs0boni-t57Ko@KF}PlmoK*DRcr*}sRz(+ zAGjZxD@d6hi?d?whBw`^kzb{jeNnn_bUra?WfZ*|-ybcx=oHOch}o=1;MqA@+Tau5MJ@@n0l2#^r}n7HS9#zm8aH*u*lLf^1 z4bT1skh? z@2auE_TL7H344=$HRCVfx7OrTF0IL7tiuObhs#-;pFyYHhEGXNdSu($;aZmg)}y_x zCVlp{wc|UksGo(Nd!Cgjs|#+6jIX(ZT(?tH@29C(>v9YB>b0y(?HM|0|91zI+XYws zo-~MN$9w!Vmb|`PdWHkoRL}Ip_Qc7q!;35B0~EezhFmXq{O?y`pmg$LCq{bH#uB7&^^b z&f!_k+2rbApX$-SNzfqm^Z(=R-Q%OG&i((rXSmEH;eJhmCIOY11hvRDqGm$8B*7aI zwc2w|0@!0Ns3)i`QE3vQc0xkSNURmxlOVMwL0hq6iM1z0dI_dhfu7z@TLO5QBv6ev z5(MV={_H&ilK|>@o!9sG$GrBQz1LprS!+G(xvyshIYTu9X9{^tGKsBulz!f(wS*1c zZ6?HIv_r9bA*$(2r;+Jp{~6EH1$qPoZ< zm0Dfxc}-PCh^C+c>_p=rFd}M)ZgBHADI%d$bJn z2j!I8WsaUFev!$4#p}ArQB(+xmL0W`cZGxOr+>V}Z^guV=!as81;@AFI=D40t zXofXsWfR60;WsHfe#5-3$_n=CxMN&y;}XS`3m(zu={K;CkTn>Y`$p)u>i(3tE6RT0 z0{??fqyM$<+jwhMtj}8tZd?Iws*Rkiq%p(^6hohvD1On!`rHoP^otL$=Qo0{S~qX= zjdDmg4chlx$(Y*w?ek-{b`dj{5im=k%S)O#YpRHSZbiqE=F%^#PcH-aKKk-9v_W<+ z7r#i1@UP-SPweFP8b8UIvX5EvCNTfcMQ4Zk=fJG7`pHh4-n_{7Tlu}fFH|)YnRE>L z!&vl)ap)7{u^UZbkIm44&K>zAY&+^hK9!wJ?G2zo?1vBK8!Z+c!apBPhuXt*=#&3( zHuWK^LQ}21@fN)pIw{chxIG`8$QE79&sD$)Zk$e&Hk;Po__E})(@bEtf@P>$)3l8Cm%*_gC5P?6}{_mTc`*Iq%$S*D0IgiCmi|eTrNX%=fjpR+~4qJ2>-_?<>e&{!RR z@Mdsm3Al6hSyHi*`@J)6Dq*%2564X zD4&o8O`FjC<0l+ezOe%KW!#4h=SR4)kUeaj@?Q1UB2;>VDw#}>ki zkCKn#sPV$eVy7juu8-Iff-5Xs3fG05h4DK;%;qfSv4FCTz&A06To<=tH+^tSfN>85 zXANokGxf*Aa}$wOJeA+eYXk<@OkW^~P2EFGSfT!p;6LZMSn+<8*B&>GNy<8Vj$gx{ zKV_&<=li;yi{uctooe={DNac-L&1MDmK@`ZNuIXPAD zj8Q{JS zyno(Hd>tVjCc!JcT6|J4TJZBiV&|r9{a21b#;LcRGDZBzTb^*O%C?xLlC3g+Y3B%4 znMU3VE|tlmOg1_c`Tcu?+QVCV&Q0z|A0@}{vnxI1gkQjWedE_Rz@=~I@+=J+zJeUD z&ynM`Wc71Tm5}50cjS02c_uFLImWz}9Iqp=EtkxE{;3Bp^fhG!9HochHQvV^i!;*A z(rjq)^^Do?(~UqaWA+CAmRk3SnhNc?N;Brfq!}+QBmcRLdkM|i;8??rtS9mh2U}fb zozU6+*gl_TuCiEfg)l#xu_d1Q<(*ijZ4pAPa* zRowi)8=oHH6&w0PbDssij3)MNY8`9^kJt+s4dZ^w`LYMj&1b;3pV;$A`&($gfHKnM z^xVT$dv{auQK5qeyv)m5=E)E2p3bCIol&s=fN#5)vxaN%N0^B<*h9)5jOC15%6nA4 zXu+yw{Ey7*FM+3mvZCQXgkN?+H?*D_-U%(4&VSK|e(BBe#+=;vfq3>4zU{pFR9}Lu zKZ97TXk1$bJUdhdndr;n+V?d^?}z3p-ZpqQvd$!85dXm#O~q&Qb8r{^_~^g;(rYf73a{q{)ZKcZJ%& z2s~V82e0sz`N_=?>EG+LuQHtP)wCqiKKV>|Y)~7wv z-B0!D@yM9cucS!ZgXZjO5m@P0b)-Cf8y6`*XwGhkl)u#1vN}?pc85pG51O;AaR1ts zckT=3Y}r-zoLxr$9;ScM>$jIP?+Q4}&Eo4>VZIJcg>Tn2{3SH^appL>{5w3am}8gE zTzIPdKAtE4IW+fq%16s}jmUKc>{Z{7k7&{VKnI{@uNZ#zSiG<@<+%-c6M!eWd^`L5 zR6fN-2avoq_T*|KlZj&$9 z#_MNo9B^D=_vIt}AhOY`d^hDA<*OC`=o~t}6TYljVB<@WvS0avvQsa$%l@6R=_(8E zB5%$A49baK4St91*C+cXz0bzGfQ47m7p8+-;#nCpkvZFlv(-Jm=z>k5C6eoN zHic$qV6VbozT|pfDRe9(UoO7uU)@6N{`|%lL+J$d#spoazdYtl?<4E8vLY{qdL*+BuH)2LK9aYeG8)T2{8c$c`{piX z{U^_`{a3}0JJ8i{ldk?kbdI`8&Rpu`8}!o8J@0IAyRPG-!mwB6Emgbl`@v$Ge0GO6pAXDF9# z`7NvY$9d+xCnff0tMia>qTydhkzT4--CW(U__6XT860rfuKBT&u zIFouUb<6JH!T0$IGWSQUt1ji5;QaY6=Y-U?@14rABRz8pyhl9Oi(VMnACk)c5HI__ z;TNUHoNG5y@8WK9Ddb|mh?GG$X}L7T6T9#;>230TPHg_Gfjmu|Z1;DuHDI^s`Yw3` zkUR6kwhi5P;XjVSwy^+Sq%zR^GQF2=!^{4IjIeFPOTYBajcvn?ZNrUi<4D-HVcRLx z=A`Cd(q=JBRY6OZW3pZ}1}@ zactN_+VEpMqJB z#8ij*Km{>Q!3~bORO-+eoe8fzrYo%z+?1~>(ih>^Li$s{UJ=#zzvaEre77JEo`ijR z>Gk9-BmPzYea!nc|K+TUXC0O28SGgy#_K)^--lnVkLFkC!0@YhY|Eb??=*Of!ZAhR zF{-o1UGWHm%Y|c#!sGtKJQrhWruYKSQFaM1_T|5dJ=?^ted_!lox?7ltnx!ll>N2> z++_Ug{}5wt^;lnvpLvJ_PgBjf4&pm{H#5$$ysu3#`g6w^i{&3yEKC}|war7k zHIEwU%F*gIV>>b^@04xJBu7M1+IH3D*1IvB^F7q)7hY7LLz`dm^*=Jv*RqB>4l-|d za3#-HUhVztyCWvz`)iE!KVj1;cTDP;##mNN)j2wonj4sdNZiWH-Hy7~C=*?u@{~mC zDx)shqy6Z-^{GZnJ$2qoOpAON+Z>Z>JhbQU8$M5YSS>hHd`-#7j&{ridx@}@d&tkL zwkuAyOU_Q(HS}$yZ=4aWzNsB($|65)Ne)#Rja37>je%|xIWyL`_*e}K4Z`LW+QNX$39L-|V&;xl_2y1VS} zoYQtwR#OQ6(TT=4*W7Axn6R>BWa+n&km8&Uw z|Kum&Td;mddONcJG{z^TZC0R@@8f7AQvWn!(}xh7zMtm@ta>Lj-~TuE|56`1!x`&y z4egtIKJ{5Sa8$q9XPvVa9oHAxFQ7bgOR=rp%p3_8E3TdX-SA6iop?|oF_$>dUQ&Oq z;hE&#FI#U4w0>~C>D1A1hWN)w9Fg+D2oBG&(AS;J@Suy?0@s>;%s9 zsZV}}$n!?U&S8X4V*eoJ<9X{E$+<%_bSl4ItS$_`pc`z$kp=quEQM{6Myk{3GaqVmSNY37X?p zVsoCp*WA6iO1Vw!c=+@E=xABDZ*PCs*T0h({-Pnayt05j!-dOjTecPd4h`8)edE^H z{@?~;FvYWw9rIQ*wr!lL)ruc0R6g83%cRQjeCN1|%U^qqm{H|1IVgWRKlW~5zYFMG zh~}S~ySHrNJd(}kZk$&c=M~k^1UsPoT zJlN;6ks(qaVZQ=40nuW7Sf!h|=Hfrmd^U4!zA1jbx7wDa4bK1T1iy9=ueS+3_-TBA zn{T>}vkt!6_f8gh1HmurtON2XS^NALvmkb>U(~|uuxsuZ-8avI|qhq~tVP>=|>)xbJyFNQ#?|JlZN2EUH zQ*w^hO>}*J{FnW}AilpHIzWOv=z(3Q`d`nv)y(k&9(bUgXZ}Xk<_)aT>shPUv1YF& z9)1z~sD@ba2d8k5GwPU^(0>cxCpPy$BTl|UN7lPO>s?~=+q{!p8o|jQ@c%acNAtlQ z;9!IoM)DPE?&!-~5nF)PKoDKi)+cJMHulkm>eXCJw+~f0p*1exb_0J5{fMPManPC( z#N#;0c{{ZEvoplwv{ohbwPq!3XYGe`A3+b$WuLwY`m;Pje3aAr zk5HHV#eW=Y1n@!aR{Pjx7b}J(X|$0}doB9r$rHopDYj1UB?IGw50InQE|1^1u_|Hv zE_74x{`^(iuatuQQ0F>VgFD*aHNlK8*}=Lwf=xkVe}q2u@w4Ks(2={TPrCRK$J&k3 z>5Gt)x*0F&<@waN|3qlXF7_lHW1VsSj@3pcd6Ce0$2cur(9Si8-rOua9~On@YdAkj zZ8mYSp& zG3$FaGgg0skNX*i$%?NghPe^Ek(?Ket1f7IG_L0IUf(G1(KD3a^pI~u#*A}%r_sJ* zyr*-14DX&a*RHTPW~SJ`kHIQ zF;TI^$n&kvYgg_bx3gkwF?=AWtvVqlwqk4vXWACGtxX6y$VoP4ZGshxO)P}su&3cq zeh-`r#Tx7@w)T=+vDnJDbahSm%$?x_v#{ znl?q~l4NwnG2BK!69@GpXhLV9SA(Aqgqa*=^zTL55-zFyDC#*mKG-$%zM1!Wr?Jvi zYjoEzS4}taT#gC-=4|$Ccx+^hlAOdwFb758Ns^QNkI+)i^++wme%8sn{rVN;une7% zdL6XzT4>@TXk#ukG6&k8O>CLdqU|B4Xy-7V59hs$a&F4A|MkIG@;EvM$Z4O33C^R`4U4=$J9C3$UPbIT)~{kanwG(53JvVv$w0=jqbYv`uXr6Au~^bz^& z(?4pMKQssmzPl#Sa+Rt$RT6+x*)*1VlKdp7}B2R7Q&~_8NdY2=y1KUyuW3}7Q{|hK1`fxLR zaU1!%8_BipM`kDtuNTF>=za9M@nAcP;FyP;93Iw?_>%)3WrI)GfM-{ebJ4~# za#Vj%@g3RyAGW^#C*RYLmI!_{!sqSx*qf;TUEbUCHZV`+`YX)3K44VbGV;mi>KNkt zpN9EIasHExZwZBUC=L=>V~zr*L>uvkM$Prnu1IQ);TiI2@0CHt4*pIl-J% zW8pG9Q@HGsFS0r#U?3~*2gfA)&3q;FM1EFs&ugqp(MW%ItR_RVCg6*f3@G}3@Fw;L zf$#QriOpA)54uJ?Ae5>A5UYco;IA&(i>K5`HeE0ipRqZqLvbpSBNTfg z+ws%z=c46bTXm*=QG$cKrX7MIe*-qMbBUdSFSoHby3mOp#r-DMWWhA#;VLt*ZU%PQ z$;Rx#xK)^7)4fjGJwQL^0nZ&y*CK1*-6CiLYuAXJ6*;Zqa^;s)UtP(zE~2Y)4Z0Qo z=C#j_))_*DoVC#pj9L?AT>Ceh>FDyM1@Oy!_QIn}FUco|wq%|C%wbA$T0s6%^-FzH z-bd?sLux>_FYCS_Eui|eCdEHxZ&L2be}{ig=etrbeMD|h9~;{?Vg zJ?yb8)LI(q3tVpD=(y%heCMF9h<@_k<1niuN6t&>LHR_V$sWDkWCI@-(E+q#zoMuyUSLr%0>4%6Rz}v(f{f0S@$b=F3PvwBP`GZ$>T&FANd&!*0ZoVOMkuiK)7F(uvf zJ;q#{AlYvsSLW@7h`ptenB9|OP7W-Mc@<-+y(MQqCr~+Z?0p&sl8ly#_=}{owv$T_ z-(HVwjRjA`|D*Q}v44!S)y6Jy7;}=^ILib4v2;3MPQ1-NPcsQ#--$e;y=E@Xo7CR5 zU30H(K{ig+y+2`1UU{)+zU1Tfxp6HnXfC$y*|Kpc)?n8fOZVuNeZtK>%x7nw5uV{vS?nM5NPQf8xs@l8H;i?hNxrn1`rHn;5bC~22tix%2Zf>nKPda=x6U+#GVvASBlR$IaifW z<}Dr9uyQhUr886t*ynkKu@KCK#f9^mxE49wHS)D?b5w6sfA6^EM$4X{`~{u=!5%Si zlMT7Et?}k;(a2sw@Hy{gaFRy(m$ekas_%;MAw$=W$-_`o-i-7>oKvDQ_nu?(b>2U0M8q-;r&I7V=&p?AN<-j z+XwL*-W|K=bRTr6Dt5O&dOt8eP4+1EkH;SzY$cwtcT}GxzgD@P@2ncmZy3L!{D$!3 z{B!vYs?6s@FUoAe)=?@x zu%Ep28q;Nr^Vb)LbyMCIa<+GHv#)ZJCki2_7&LN3tk@5Ul5Djh`y7= z9$!Z#edoR8*v@G~17vl>@c#!?9)7 zdI{&dJm*ntVXUk6->%79&boSMv)!*0zCS=cSJKx1>?C%FdM9F&oy&9GkK(%qWWGy(=DuO% zn#)=bjOuG}41d1CF^u0(ena><`8oKR&o>OKxI7w0;$+6k_kShrYz5BE*h3@lGkLZQ zo19>1);nyNk#|dZ7U|z+-u;pID9J$bN6!MMPtJXWW-#|j#<(7X{*9aA>#wU~On7!= zmBwaV^BY{H6KZTs>i*TwSQpflOkIst{~}rMt!P+02^oMJ~)gqFxd}0g!ndl9OUOzPM3c62=>E|k8nN0^;f2Eo(o%i z*Ef?c(RnV7=%D*ze5K3bi(h5UwK@#WVV~SAd;Gqbi7QRy^I6Qxv**%}M#ERuNKE|w%&X4z)O)pa zAA9e|@qQ^d+xoz~RY7$5SI~0f9sFl( z<#*BkRLxB?ZOT?5K4G|goNJ1m1A1A-bJ2u%v0Y=Yw9cLCL_RtGU?w>9njN2$rSq9h z@XEn6C-rkivs33YpUQpY7-PIN7oGi&FFFDvsLxLf;ykWBz)Jj@<)i6ltZqf$IP8pR z?!j+Tzc96@2>;8B^L?w1qpY-0#^9va# zJ!>ORDE_iBYFBu~SnPh1YcBS2Z@jVld)zlh#d0=c3k=2@Elbz zio7STWbYSiThHZ7D`X$LaH$R$w_QE2rjnd>!UgL+wt}A{7dBD1@-KEF8`nA99UpV{ zv+B0$on_ZsNxcQwiS(W7Q@z6D;}2d59%g}$3!!(J_=!!+moPxiz=kCH_zC?uDWl?7 zGbfS%>-WmtQIYpg-bH`oKM^g@5<5DPGbAZv8~a;dt^A#GL_Nw#h=+Zf!^i%J=XQo+q3)O*Slqp);)CTCD|Ol4o@t<-PIq> zQzP+qgZb3Sv*&)~Yf8oLpAomVrwJNctoDgnm~cF6L!)DSP3-a2d$&N}IVZOx_4vXK z`KGJKHFNF87~{la`6H@(+{UrTCRSE&yoElupIE(@7>I27oY!hdfHXR(5(L2$T`xxSe4%+Vfq+=Loe+{Bt1zDqS@Yi3aPFgV}J zw};sSUdw;Jx4ymqB41NEau+h(k`?Rn`^qUZqcW+Fx_7s-o|jVpeYb#P)crAIS(Iut z6~g~p9pihJ@(sEmW2f_*PVx5IpE;3Z$lXOB>Kzk$I-vtU`%Zoze5ZdyDD+YR@sH)e z%k!7MMH%5s^!MV=`u;aBI_pg0a--?90S&I=8{rUfY;~2;&lGgmHCz`$qxIeQc&}Jh z-9OB|;A^I?WFz?x#~*Bk4r9-C8E>Whd2FDS=jatLxbA1(GQlImVE)@I8XnzlWWKGk zODAgYSCb>oY#K7!=y#1=gALPF1Me=?`Gb;0jfypw85LFh9_IH5zeg`iN_ICT-3Y(9 zOgzIZOFA~%>tRi~8XV~!`e5uJ)|FTS=;DC*fyWPGKUwQ*l1vwg4G7XF<%@Rx_f;)L zS74LAgq$yYmou7JpSi^HPa$?TUU~32=YuxNc~&%aq*r4S&8IX@kr?H3!(){n9xK@n zj^1fPFC5Sfe112;!yZINf_AuekURGgVoX_!YsnL*`H&w_^1WgU3SV2OH5Q1J*#{5E zhG%rJ?o!Dckb8dYQ#oGx3J!QpVy5{ngR^n9A75wVVxwEKg4nS`$3rizqm6xz5j}q7 zp>=$_WoGPCB};u}<(b4Mz^87lgb!dJTYD_@QZ6v%b0$|BXL#KapZN+oHk7lycMI3A zQqSx#e12f-N>J>vufN{m?)ey5qL}=XUj;v9*V<2gI&amB%oT~VchHWLvn`MXTi%0? zYb@Vp9?02bo%Q<;aRI^MKINI)+R54=ANSTRT+@dWW8s|KQw03lMyyzUSb~6m4NB(I~fstN;4M%oN*2DPJrAE4P^Fe!h#CzQQFE)+z z0%T1uYtFM2+X}fjJkZ@(#GFck$`TdcJauFK=H>yEM7clUHtr+HgypBKF{MP=xdm%e)$ha~!{ICRw=18l^Hyd;=n zXjkp)D!9v`>w+x@*wDxO-MkY_%D17qa;V3ui?Zr#3}wDlU9=gg>rA)+ee5@|lg*FN zvC2sS7yI{XdAKaS59Df5m+y|ZC&$x@<%3h>)V}PmEF|ntCHSh=M|32t{9qX%t^7Uc*e}Z<- zME?t@`+myw^WMhQQ~c#);2by>MzfcBW?nvUm0dtQldA`wzNCOWh{9j~cQ^Atx!?Dg z$?wO|x#Uo2HtTRt^w|7^dP7yl?uahnQU0S5=me&-r-?ow_pFcDTs`bx4Z=e>moN~- zzxH(TLpLU2Us0VVxtGL?eaJT{{0fmhvkjxH&_#X>a!~GMZQ)ngBfQwcJJCz!W)a*6 zXa^ZKpmni^`|Ggxk1V`v)eN3pzskF61oy4?lcxio>O~e`v}(pGeYc$djcSK7$@rA> zS0%4nMxV8>H=nknVb7NTE(-PoMYir~!~S?)C1(L$(qYMa*7z_c7G1LHPd2vufcq%) z>5KNUX?&S z@r_S`n~c$VZ;CfCl^9UPTnaB``#nhP=22n|{%gNk_YO9H`8fRd2&Tju|2>M~PpsL7 zZ9kUrvtZ~lOMT2oQZIT4SHV)a#@mIW*Uq!a-}s-e+ECx*OJR!?;d5nz}vTA+d~E=w^+?a z?ZdV1hd;jY4emAm8aw2I^jqk^_PCCQ_Iy#SRX_MGpJpF8{wX+qG_2n%-l}mN`@6t* z#j1pEFj|lgdp{dpzcB;(q#GIPCSsD|sl8px&A?@*e`9%^u~oPw8k#@NnAryGqnNvi z(4hoyOL3cu#a;tlRjh&VIsdz+b$+h*L1RqDQlr#^4kDQn-n2e<>F~gosB_4V;#Vs$ zlm3{EA0UZ(JY3J=TF6!LaQzVe?9!P zbIxz0F45d{uCg2SBR5EHE#tp*h$m^oyTM%Sz1(qAYLatt#t$<}d$1F)nE7PFI`(Mh zaE%8SUEHsI#9XYLRISx!X~~58gnTzK(CG^wC^Tym5-5{>gRwY?{q*g?^xiDRvMFXv zxryV!zloM?rnUVpYdw+tH^Cb!T7+xp#QirB&(jFrH(yL%lMJH;nXxqH*^0baPi5W; z&T`E)Yc{@HT)h22@rv!a_c+Gn?{}7J9YVLs!HZmh|1CFVY9RO5m)7LowXkdpYpG|R z(el$-JIYE<)aP+_X-Prsl}EQ=UoOU9mv*ncwp_%-&R}k8y{^FX%*}Vm@$|fVWX<~v zjFtxG<`_P>Ec*7o(?}N{$o?f6^BwvyoVKfPG3peDq_v}dBq#LEji&95@s_XP1>=WT z5w}&B_ZwjSqB;u~46L(a(!e@hlcMXa%G>%S>U8D|th00cz&Z=ZN7ZT8<|)tq7r`0( zuLJA!jU8BLJLgRWp&?e^%_sA|{Uz#*n?113hEW6S^o%-Hr{ajR9h@)pCF;F2ZD75f zaRciu9J7~uvS#>LJXDM*& zOykVgZM&9-yj_YpDkm;t1@xqmwU!-<9Klyt&wcwuCJQ4etg6+FvMGsY-qS8zHsF2lC(U53A0bVm5#;i~Uc z{wCV_$bxHJiFCC;AcqrQn2IbhJ2cITvF#6X_6d0gTP*y*x6e5)R?Z^v=WgiV>3G6^ z3HaZ;&`M~`o~#q(9|yPKO{Il}wPTz3S$=r-pyXUpJGS}C+OaufsuRkc<4O$TP7QLi zAAj)kV@ZXhXQRz8jWg<=B#&0kINxGy0HxEqu+f66RzD_%`$2y$5M7*RlzntB`EE|5 z^^+}G<2~loLw*1AfB1e+j8WIY_h*Co?g>WSUBG*$_l#qn_|1$-M%^8h2{PU)cRIY5 z-5@V(qEUA{}+s^?@Io$+%?&Q_iZ#`8z)4IC1-*{aX>x$fgEKl`Mp z_LoYI97vnz9YqF}A5U#6_uc{U?R?rp#-80UC`Rfiv`O-w#=?Syz3wMr;a;%#tQhp` z!L94Sv1`G#Mc`a6G3Ys*>te^CpX_gCWnLTOeO)_a1RV0e+)mxmaVa~n1xClE`1r3m zi7q3*QFNId_=&zvnZe`uet^CD#MNjXe4c^vU+SCes_L8GpKYwsMS6SiWeM*Zwbuz9 zKr~ypD?8d+Y>e;b8!f`q9{%UDW}2M|+f#|ztG$mL3CN+{#AOSI6kGT>@oLHmo@2(w zuzqsAP9v|H{I4F<6BE1>zvVMkdDVL=^Ptrm$uZXNKli*qa2nSHuEbYnQ|~96hc!(G z_RUqdTj%X6?p-+l{Yy{bUc(gd)iI@}+&Q7A+F8Fb(R_U4z4)8h-_o}Wyh6veVp`qc z6>wN{SuVY5p0EF|Ui=YvlJDJV%nhcYo0H#s%FGQLE9k3YkENR^u3GV#jmwFV1rKao zngl(Y0zI1o9iPzrZoaSOy#>DhhGU^8?w5G%Xg3oX(ft4+`YzjJ(z>zudK3tfG4-Rz?hOc}== zrG?_pNP|9tC<&1%6aMcf?LMBp(X4E45;j}zR)&nj}khK z#(V^0J_4Q+-S-sWX;j|J-hK039ZzFs_ovM2&(-wDbFx42i?DZ&Reugo^7T)lo*2eG zpD~wCrSTuZvm)YcbuYMDv1$2$S99RfI2PSC-y5C-jq^e5T{+A_E_0C292E0S?$EUf znjhN^M64up5HpjU5zd&@S5+VJ84+B1mA!q!NwpUo$GW_M^@*%u?b$=N*1iMlEMdmP ziV0;r-dzq(B6r-%eiqT_ia%j<%i6e|J(zvM%cbvxwuz2B%{o!O&3~-7X`?YHmw@Pp z2bv@LalskrSn}HgX;j0(&_G(e*YdfBWm)oDBg?)5-&Tz8ENJ$<#NrlWYih*K_X)Ck z!+#>H!!O#QpXO>`;Mi~QC+R&hvEC_1y6X6p=T)3J{V@CWZJuby;Wo@P>##STMsIz8 z9th_S#$yTPg2xv(htoNzAzU(%8}G)vi86)1J&N8RJx*=kmM<{4EE6 zOTgbE)7=p}!8d==1VeM*yNPwT4qRMG8%+})e5}yvt|`tk0yWFd3mgJJeUFqsU+_rA z^SStG5IO?2z##u+D{Y(jUc@upt86<-J8Rv-HF#(4uDH|e7?SrDuPYnAC+Z%0)f{|c5M^D;eO!E^j8E#;$$!9aGCk2+^{(m44;l;5zL zoX)$5O=w+dly135{+bD?vh#D^VRIGlzWO(_PITZN>@>tv%`RdeZj9-!$?eUbue@54 zDMb&8pqIj-sqBkAxYq~>X8EeFB*&L@n)Y|iI_IjSn+~S3&zSd$|I9IV?Ac{>ei-7c z)8!ADnzHBe{xZd_;?IezEf{OXwA_9Sd(Us=l;Xbmf4gcHZ_*bBYxb?NzQm6k2dsw>^-Eo5)oTJ|Wo zR>wRgxISim96~l<3qHIa#+5Agy$LVM4;X#r%lIuc`$}SrvYK3DaS3JWzXi|sVmF~o zNy;A*M!edZS8k3d?u7QN#g@2;IaFLw5ZS)DVS~OJ1YKlyN1L;HujuIl?x=e@-ozi}^nI$AEKukNe{+Hee9D9&K`|?YfjTQ1$&z&5Q{w0 zXyFXF=5e%FznYvNBE{kfBoU2Y5PCSUET3i zE^YK2G+#^`6ZkNW|Fy@j+FQf5gzGxSykzT$#NwZrUjL>Mi3DqocQa4OHofiI!%v-F z>fA-0)zq0oo%R?2H*o#aDo@{-Lvkc9>7pGk?bv0m+FLx9J$%;O7wpX)MPGjG@TxE1 zJ?+@z>>qjhINM`$Sa8L&DK@cqs_AWyt{>h%cpfA5yU#FYUdG0& zF=L)en5Q&rtghS}NBu?QrZ2w0^hWp7#W<=yuf~<}6b!_Iw>)e0+g=NW$dcXQQYyIg zI=J*YxD>Pcb>`;Ay|KVBgE9UcV_eG^U&|Pmto|MIlePB{FsuNE75uNI+z4Q(d7k;Y z$n<{EoN7Kxfa76nEbKY;K+n|YRN8x;_SVu~F70`NMY#Ay{VIOi^ok#7{m6IOylKOL zb)3T)w)bh6Tpvyh*1DLSo>wJ~^)dt`6B*7ohxSq-hs-Q-Rbe%-?VAbS{~ zmE%QU-Ov*+^u)E=owy+U&J8Wmf6GUPouJyHBkn}WtU+|InOyzU*_D<>+IHwEb$F;l z|2?Z+PwD$?;>f3e&buz^6@BuM!$^LUv(=%tIdj>o`dnsgjr`#*>hIcOx25-b7k8HD zUBHW;S0lfPpR!$PS9(2Omqio1(#TT|pFnO_-VBR=XJDs0giOi17SZ<^yF;^Uk&(Jt zhpDVX8^>(C%+}ffAG8Ls3B2Xn>J1cKT0v}o(e`}K49?E49UJo%e?kCR>BeT|Dpd^7 z**E_Uh8w-$sN4|`gNRn@%-h!mb*q(%)M)+rY8*%7Um7`;{4Z3OpJbQQ&I+A^`L`5XuKQRbj)9Jok) zrwbj{4{kll@84*nHGvpr@Lb;>IQiYU=2uL^z{Ug44JUNep$VXSJ{)N$ zd#Lh-Cl(HvgGJcm2FyVsvH#Pd#EwT1zvy~R{Wz^W5f8%o^!M25jb{X<4_Di6LxM-n?K=v-dT1$=?scd zM?YBxjMeOSDIOM2-Us~p;FQTT;auY{@ZnH@Cc1}w7qU~xp62CS*1%rT!DZA{Jq|DpxiTxC-ejOZHB(9`4IS+7>C#^;~WG>kKvw04KGR_#1) zvOE4_+K#e9)}jk~?J|A+%Ck_9&st+V#e6g&IL!=9G9TU;Dj(Jqx|f^*1~JRXd)XEE zFLoh!(Z_!10J8C0-mRlflZ_20d504#F3%m7~Tr*cL_9XL;d=sqa*Zmg%A@-t$SeF3r zT5{%XL?3gXRhPcJ(!JV?d{D3#`&n%2YS*~iR_DZ4Usy4A)--owCu{tBp%YJF zM=N=KffX~j_}-U?j!~RV>o@H4*$T1ghxQp|q2qW$33K;Bz}UD+v8Gqtez-p)TkMIZB0F^_m+%cu3Q}X(Q53O>aZ!9LKZs{~=P!jNTVlO*_P09toe84fKBi@R=!La_j`qi%r-^thGJYrWx2D>vk+N=KNH+asg*pK~GM8 z_a}WfY`e-geucQ$!{8+Hp6c>2=RxWX@SOz%>#L%GwyDF%)xsy}Lj*@tz^9-yvn+`< zm3;~8W_YHxrh+q(=VLR=^0mIW@2T;%9AZsf%bF@T<4S^GVa(oycI-9Ex`C(X9-~F@ zwBJo`M_{N1Ch4gUodJiZ!pBwCHJ(^aaC-)R!h)|EbBJXf?-b6?1!tEc$I!0$yoIm3 z$DW3-?UW^s&>A1f-s&%Q7wrRL9ukNrVow{ghWJe6fAoA22b9`}u9lPnUuIpph8v5$ zUn^Y2b+_;wd-al}G^14W`spZic5JA!+q$NKCqr!6qMfzmN=XZJGp4cRk10tqW-ltT z<+BXav}|;0`(x~Y%Hb*5w-0zclfXA*2h}GT#j0mh>dAUKu<3kJJ&N?#`(KD300)GNUg<-u57BR}yH$)` z;|0bk9?II>)Wi8>;A4b`-jPC%{Hx)iTf#habC`$DIy(=Q>_Fn7NsZ+FhhMx@)b2Rx zr&inUq0k)s)c>!>{MF<3m}9#eFy@60V^J)0+NJ#*e(nAmWy;S|M!s*Ac?y2}4a&F_>vt8geyo#|>v-mj zleAz9F|=Pq3zkuj_)#^mc0y+sH!8N=2`)PVb6e1_!Z<8>F9;sf{uqsU@J)C!<1QW~ zyR-2BdgyWIMc_TMmiU67`3oXzC9(EAx<}U1eLLkPt3}IN8Z)iaJ2hs%MRsJ4HHH}% z!e3^6&xq#^U*fJo~(Qe!+Ld7o`(N0-tpR-gs7fe8<%! z?N6Hj0CBp(iy3n#c0mlJEX6q{}n<0yId z)Auu*O#TDYo?X%t_S<|Tt*CH*8h-snMV|TeCy*58KV85eUp8~GTf9*J<>%IW_1(*J z>?|kY-4q4ynP8m?Y=dD{tdC%o4k!4Ul)DUAv1>`+og*IFbpbL5Aa@>G;VSOi=ca3Cki{{HmuXxl6&1uM9Kc{}lYder3z36JK z4tGf<@@Hq_j?2651?RCdbvi08uSPz3gtEHI=Tm=^QQ89y7+g+%r*76$59{a<>qmWE z2cEp4Z)TBq1Deq7fPW3cFM!QIG*U5-uI4W6@F4Ga|5)E*t&z=)XFd8vfv$7Wy}4=) zW{)xElqVUbaoB<_8oxL-;6!(nJg;?(Y*-eYew{Zs&AGjcc-(rYvt$djY$^Ih=T4m` zFsZru*oh~~Xv>o0MzFVo@zuJj9|e5G7DdKs8P8`@_HLC${|J5(I!zDBVlT4v5Z5Q8 z<_WHAu~k@b?LGyUV5k9)Ef|;s!EhNe!&j+SdR`a49O-!A%pB==MY_`09PmLttghw6 zH$ywR8Luwj+yz`y^(|#&H&i^IV)%l~uimcj8OyRD<=Vsjx`MKrC(Waq`IC=FupVMe z?J-O{IfjC@o3X864Sq#!P-i!F_RyBv77UuR9_Fi>c@-{b{$yWCgKzf0PvhXHzk{FV z&WugW9kX^^34F5zzNvU>`GIoJUrU^YyJY$ALQ7(RC);!_k}RE_(w-1g{5bk{Obm3T zw4Ji9q5cHX)h5=v*4eTSzM(B^t{ErM>qcFH5qdR8IO6XO&F=gW`Yid?ibOZCg?O=r zShj0?L5g(@RSo;xv&4!Waf|ZJDJ5ESCNgl$HOVz!y~2d;KxPu zD;h_Zf+LE3>UPGZmN?vtN`@MX;;xwiDn;pwz?jUw$aQ58t@;W2;=ZuH*os^)eenTv z$|BeBn3{MqvE#F2oPSFDvE;cbHd&wSHM$NNrj_=i;neYsVH4FaKxWWw7Qq9S$vVBMaLynK$5Ky{5X` z6SALiCAuC8&51!4&KLjvb!bT}van=d5BG6lS-776jfzP^FUv+RV;)O9{67pYQQO_f zIX%e4hmdn5+gx#+cA-!Ei9tP!Eo6X9E}K*PH$!utV0=0cvXA4(VVQ#a6wYInOyS11 zBzYnRd7|e{`a-*s=em(CdXOvrlfH@vUKsh7`?29~WtaLqd8F+nTOLmxkAB!4n)5X9 z_b@lP;714eTY}#8JFc}$(*mN6e)ct3&(Wi<1&-PYwF&uSIE$B>(abo|)n7VXXK71vfvcm0Nd{7Y_6s^gIhW0uA39362KZ6y! zj1S$~n^FtTOOLy4;%Tr1i3f3Qx+1WKHj|w@(nV`S;-`1owom0&N%@d{i`Y#)*gu1t zp_kJuF7M1jRvByO8#N9YbM~>%Y5xv*+y=^2VV8|H%Ys=seZl3fzEBeP#9bLnX9o6f zc92Ka5pa;hWC(K6U5Cisgze#Ja=+-gY>2f?)CZ(JFZlzqk$aPWoNr56Nh-W#hASXp0RhR1zWoOIIPn>Go1K&-gCUz^yHHt<^o#}a2|$d`SJCR#8=wBH71dq zc$X9wT{yoHd9vP%--!Mna*k|nJ;&L*89M4Fj;J->*$a{h)i@IT#!edMm9)cGsI_K{pm?u_Y4!_Fey)>s8u1K$H@@RjcI0v~+5_oADt|Jnnb zTY&Rg;5OfHBw-XTjJ=z1hIH4;UpQ{nI(BIUgA1ix-@`hzVhQcMHZXL*X&N z>2VulVt}7=);>G;<-QGqwH)~J>BAPuj=;h5$2=$dQAi)u7Z3eNRqUkl9Ph@zIG`V0 z^y3Z-_anIAI}I0hlIN_G_I?dLQU7nHyztqTf*p+*?#TTB`>y0D7oXkKQS_=Si2f7YMU+4dnj_@4pSre~I=h4HT(UCr|rcr~r9 z>@J?YiLMq(xv-?_O=HR7H0*|2}@y$ONvwsTy{gkzlKhEfFgEo2KZC-d<48Daqt78&_w~qB{T~+W-G~fW^ zlERocSvQXmQ`GR5F-PBu9*5p{q(|_j5IIRW<7Vurle4Qi7Xm+o>S}{teUYEyt6@Jy zyyd5u+`OXy#1k1#qeS+T$=IyYe{TCJJkFE$ll4*dll9)P{lxwMpZ#S0Y4(#uM_Dk* zQPw@pQPzm?m_#I|*Vt zDO~MJ3?`Z_?bt|?*kg3G-^a|T;LZmT^$F*-%4&3|M+{io%`1hPPt5@ z#!o%}0Y8c0o8UIVJ;ALQ+U39)lug^xyT|psJ|Eh__;fQq<=-%RV{c@QvF<$Rv@Ud7 z@m9sXm(XVqeO!ax+QM(X1CPnkn>20*_6ou1LEiI@@|C6XJjglR-N5o1d)ya(d{IF3 z!=w*8@eYctHap0usC8@p#IX9uws#NutiwpLGk@Y=1_8}rFMcNh4PyLH{hVl$>g ze2W;n-ktcORi>6Q_2DwLlv!cMb&wZ2P)m-8+Wzv#Y8`Pk7Y@I!=6RmAn&W#aDsMX) z#9o(sJag}LJp0MvhaP*Ad=6_JqiSY2N7j^>qdGd@8*;<`cg-6d{0_cj+;ASh_mLew zV9g92)^^#Chs53U!tCU`-{bwWQ=GnEChwSf?o?mOxt`?Y zb2G0^IahM1pL^c;spp#5trkLKzHP~*zT;D&TMu(D zy{rwKh|sW0kWB~6p~3H-E{A6EOtNwka=@m$!*b|~FCmAP*mCG{=%_{4kOBH+(?rMh zWTB5B4`d*tv@c{&1T-(7`$Fz5TDK%AAo<&Ok1cnTh02n{m(srK(wPpyS!P++JhQBO z!705U1dqs|uY+YJ6In?#e8ebQ*J$vgYfyjkZFc>gU$yH`xeJ{5U+Ny$!*@iBT@U#- zh;Lj3?hNj4BXJOs{$_I@>2L5-;(M_PMEqOwwPy27d^08Q%zZ6{FBZZV3s;NhpW=%r z^&?k!T9@(t#{;!52jA9&C8wq{K`~hzufq><9a5q$&($d8^6+jQO-Nf=OqR()k7>e z>!#Ozv;VK%=m5>=0BOW>u0Zx*1l-ln#3qW*b!~Q}SMywPtuwa9Cf4%o(6f&889ZCZ zv!+P7E$}Oz&EQ$}w(z$9Pkw`7___Kc|3|9!TX4>S z%kXb(jbUv0wrlgk^bDSDlB~!#ts~(%=z-SrZP?CK=2^Q;CHI_x^TO?kU$M?~(OOZQ zUhX1v2gXnBWH4q2s0Tj1$i=t`_vP0pMh0Z=EE!OA^bj5+66IfPO-1lSVkGO|DvOBk1_Ma=zqr&(5uLztQ zxi>Qc+Jj-0Ny!Lk-=uY)nGu)}xnG(QkUz|NUYQZl9z5%QQ$|4Xz1DqO207Wn_xm%f ze5ySE0GT=9w4ZYl`LXUq98HBmWX}a*%S@G>IqVx&aWTPHvK=X-88#h`9ufw zH`3N-&Zni%hv~c3*3ZbJ88uc`TZ~tv-;b-`jK6SeKz*|odeLF6x(;!+t?G)dhuEn2B3jH~g(Vsb>W*T36`-by~#Jzdyn{Lo9$swcU6oC!7LdJQC_hXyC_ z*yE~>{_t@o!` z?>Wf*jpUS!ye&G(q2YToDF z2dwLT=r5i0I|JEXHr5-9?w>uLG zKsJb+`zK%XEqp6Jek**uzIg8ZR!2flH}kcRt751<&WZ5ti6{AXekFD{o~sS`rxjZ! z8-e)xe{t2^iT~Iz*C({_Og!nmqoGM(qs%t`$3a&Qu@(+7e|Hi8RDOlgTidoSp*+>- zJ@m8M1j)b!jE!aQXCK=-`1tSPFTcmW{rd}NSg~tA{g!V7>je8gJ}YeA*jvZH4zJ0r zydnTEdaGpV6@d)+7`dS~E;PvpDcVT8(mQ)trzNb@;wvEt z`=xwd@aiRpuwTk%>F55R*e~~S@1Bm{L|OGK4&2Sgt{9|0LHbj4H~o1O*`ba6Ei1`G z_A~qzQT?e*K-Z%`Ct<%ZwPp{n%LX$Qzs_JkZ5n>sk});oR^X>yfuB~gcn$59oL`er zZpM@>#}*rlE>(i>a|U(Pq;w?2;it9ygY>^cWrx-z$fn;+yo&V=daK3j{&umY&or=a z%Hrv|%4SKOUie)o%gwQZMoZT;beZX=^qKC9%`(f^0lkgL^uK%C);EOn;~2yLZ9mp9 zzJgI>`g6wN%l0XTSV#3~C-H~TeKLf@=%hP@N3!XX6J2GPUO}D=%K@wVI1DwHwtg^rCe1&Hmekqcd-=zCHN=vG?xrRaRI2|8o++a}q8I zcY=@vw4MW{fP#>znuB-=psga-)|ob-?bn3VDz;W4B1Gym7|=wpR+tV@>of_{#uh5+ z)G=u7fLD-e>$Ecl&}l;CW>tcP=KKEa=W?F&UecL$)i$@o4uBd_g&X7eY+YQ`_TZR^BK;;Z_FU(3nj`|y=L>WXQj zp1tmNJ{doLV9lYi>2(LEq}9DQK2&!a_eky-u>kd_FTaEMKF2 zs+D{gcT?w5^bL}8q1QrI{#&BY@i=!jqiLF{2c<;L-^kuD!+B>t&!JqHg4)S z9C>Z>bKrH|#nv6o>_PjdgzCOPJ!dT$ytjd;_o%yqy32{Tx|NuPx=r}(v$hxExAOza z`{!l?bEA34cIF{3#XKBh9<=Ur(eE^Xr+IuPtgp_QNM1&K6$Z>?oxpb{9ZBy|cVK#Y z-PQCF)B~K(*?8`|$>(;_;9s#h8yhpYxepw;{BtsX7cRUj-nw&ZS>)v$&9CN>HCh*D zEPlF`zmjA+BMVVZbbQ^7#Qa2TI#yqQq_3bI2AVf^nA@nA@?#+`f3i+U&nC*`4+GZ>-8n%g(I94wLn>?BP2Za|7#O2xB?2EWPe9 z^mgd;Hm&-{HI8xR^=zM_G5wM;O~8NUF#apq_^<53f93YevxaB&uO6@fzPJFsn46Ye zR!zHEpQ+BtP3u?o_$Y@sS!adHW$!-F5B@&@ zz1EOW`Fq0?dx7lVLA&?Q*$Wo4#%Xisp^8gtcJiHd(1L6B1b8rJV4nCjFv(UfTIqJnnCOY?fM%LPSmOIkr7cm%I4*};x z!Tm7iAP2vQ;oRTct41+Yb=;FvBKe_0wiP=Tt7A!zy26lR1g&Gm_zG zYs=bIv!SnnA59O{w3FXu>(4KX)lP3J-%s4yy6=Y;%wU~-CiE{k$GL-`{pV@;%Hc0I zI#kn|&Sx}h+sJRq4V7c~?J@j9UUanM(GTgXBO`p|=mkGmvlKilzD?&5 z$>H)@)9)r=TZd2QG}f`=-tbH*m^{u*FC{^D4j_Db@?7YaD zpHO{~Ki-Z!G9BNyXp8v`liLXRmRP;Y=JDMQUc{;I&=1V2Of{E`u`AYV?y9Xfl> z16SVjrT4u)#yOMW(=ulo^E{b(EgoveA};4FS9m{iBYdEUd|K!RcFtTpq=tCRtg95G z;lw)?$IKlp2>Qe$$Bcr zo-=Pe>%hp78J+z3j^8$|u66Y9zS)#s{N}pBwoa?~GT`S97=w$8I0NvzkH(v2#{;gL z$$Re9TX!k(M0~#hAE>2o?Q84$9sQ^*ehop9r7Yw50`a(?{T0<9~I2R!)NQf$K&xK4_>e1OLa2 zc;i&(Su^srdDb`HsJMBxXSW|OP>inc|1rUx++X~dbke>uje^_v-{gh4kT$pQyq5cE zmVmcy%(MJY!q{@p;rU0mu#WjC&*9#yxx19RTIc3llRlDM!1L+w)qU`f5BZ%-j^qu% zv4lG(@8e9MxG0_N4Sdj(fu%pXGh*j74$ifcT%0L({$Z!A_(}#5NQE1Be5DIwoVrt+=SWv(qozwG8)k(|2Zc5A`S!;PQMY;awk%O0cq zLu&`)2iUXnzcjYm9NX?CKeA@{_^s5NM_!ud=~m6xurcf*mOc$T$v$8f9PfY^=@lfy ze*O<3gO6q0`7NA$2%eU(H%NcT+`Ya(J$(%H-+$x$(y2?}9iPo!cO$y1iItq=%R3AY==GRU-Pbdx z?dEs*jkzO#i#<;BIFEM1yt_<(<@9HbsQp47JT{y+cck!TWv|O=PLH1m-_!DX$h0$W zaI(C(1jnDHp13I(@&*zWAMKg^kinuzBRO_?9Z%Oas!E%0;}<*Zy^qnc$P_#6UDph zGOR7R+oElAS$ALJj^6^>O}zi&?mA+lb2miW^7I}Vev0!xcQ`gap5>mvUjzEr^S6;1 zb^pYE+7}JJ_w>3P@sAmQ?3i3i3{vEe9h2~#XAbN;drceAh}&Q8iO`WKYbduO+9n*l z*^@g($@?A7pPHHb6?BZOQ{fSwom0nmBy8e;P!-y340gu$C17hwZ+{xSo$0H;^IUms zV(Hcvo;OxfUwmGDN639r%KdOWFE8S`u|e=08a+}A?s;Ai<#`G9gu@4s+x%m$6rC~V zX7;5w|JE^CFyBv^+6}8_FH>1);}+KSj~+{39lXavdvWsqJEDCL>!*Xbc9$m)BHmpw zlV*QI_Zh_p+}*#;KG!W-8AwNV9c}P&saan>u3FO-q-%Y{=eAz zNmf7inf7GLT+I7>&*yj4Vy$GfKTZ9A)f(g73Dq5I|9(d0qW15_`YpYp_^9M0>NbkM zuy*^$o?5p?XP9DgOYR}hhIr(2*Z@THFp+^v^6Xe9(;w>uMs1Ikb(zKQ=!AHCNoM=g zv4(j2j7)2b#&ZkLV~j7#T)K8gJ?C1B*Gq=Byl>Xu(0L=9&$3Rib{0sUTQ>^-PiRMc zOY>Ii&_xOJ$vPO=d{+EK%dDG!(Q?A6pEqx${lDF`7ykXck-ue4X}yQj{$j83-_9F( zj`QpZ@rSgd_H*if6Zu1ZS@D}ju1~X`5v{$;{A&(xq`we6G0C43p7|bfSRed3H(|s4 z*@leavOj*SG=D1Nt|1Q5_;a>kPh8g+G5(xU&eiL-M2?iucPsS^DJwap3V6e`AH$bw zKhI|&M_mP7T!l@~jW?1_4|&Jf^t7LeA8Fpf^VYn>@!x1p^Fud}j9k+4`Y7?U@J%Dh zL11v2e|!8l`Mh_Zg(&C#7S5Mk#a^Q|gZvfVGqxtyV`)LCy!5!`%tBQncpKVS0fcL8R z0QJ{{r@r8+mVLOEa{|1H7%h096Q{Z~t?A+>;$uX2Va~ClZRw^&bIO4fJWEutC!Sc8 zocGqvcY7E6{*noy1urrF$~5GK1Ni3a_Ye5}A@LOA*=ww8mrSJ$v5?Ep57lT-jbS?o zV+$I`voWD~`K)s(Gss#n9iJHK#4WyG13g)e6}$+n=>i-bk#-$_j~4DRBqyW?*lJ` z{*(I-xqrPCp9QzQcG^oLwk$ZF>27u=0s z?7Qh1W!N<5><35YJ+imk$I$fDeT;En&R1**?aL?gmBSr#4D8@}9=~1KD}X($b`~d( zbr@~r9qO3;0r85G2}H}^1ILvIJ0`E@nRr3u;qTcp{GJK?w+2>a<2MRVcxnD;P5hzC z?xlFNy0BmP>tkFpWW@3^z? z$mjox&&3z6r2LaSf0pw5IIpds{5r~y-p_BIub})o%3HjE$W9@y{-5)u(6rsDf*Q<08Y2+9P)ejQS z#daO5$mtXV5$3#;OFej&&W#PR*x8--)8@3ew`VH;?457xtgl>+2uiy;_7*or6hW;m(viHii63!-e_&kgK zcu?7V=C74DV$-77B;y70RjZ)gnCxJRF?Pzy$6s>ggS5vOjZC0>Y+BN6dEyOzo3XP8 zyl($CGJxW|%yaf`!7~UM?`2aDSpps{`T9Tg{}Ox)&b1bNle=)5|M}8!X0M^Gx+mXy zy{@3;eeE~-LvI?H7oBU`Y2~~k-L&=#wcGj+P34o}1zVi9>w4F`Ui#$5_m}@^`}?Kj z)6~8Ot(Y@$3o?K3eT2LYGl$*x`u;CJ{eH&NyWW41I_NFhYLR6Hx9B9oIZD3Ek{7Y- z#B^?6irgYOVk2|NTE&)Z%a*M9fjs6x3Q%kc{T>MPeBecXJoZY?&(Ig zl}FsE?D>0`Pw9I`p)bFXocT-1w|P|0_|&r(>5QrKWeEOXvM~3KJb2+?);~NRz1d)+ zH>(>BPvZ_>?K#h(9~1u`GNIE~4v)No^ryI|LhSPJ}luv3Rb(FJ1_$p2xTDBhDh~&y&LF>(#oP+$b zSQwh-eB$Er2kd={+2Srn%yHHn^__tZxOkqmKxfu3h1TT=NB9NJ`3X4EdxL+*u%7>W zr`tG_|MyQL*6Q_V+3W1ip4OJnG6r`JTbcV-WJ<}2rapUCwbP#T(j8-w8(0s*zuH>H zGi?8}+ryU8L%L_JIP?7_&R#9&&5XIUu#J0h3pu|w@oon(n_=$x5I(ODSz9vsCa>uf z;r0!5nP>4IS~2Gh?a6l<9p9k(wjZG5TlSCImv{PgeA~cDlhN^YzRLpsX!Lu+aaX)z zCj8X!3iyP0lz4^wNN@iwwkdEgUNPu+$Cf?d;#cTd-{#xJ8MN9TUmHWCoIvJWrZVg& zzvmmhrS?|CTO#n5sCdh0t5JSEPeL>M!DSJ=CDw;n9f!Z<^Bmq%GX`I@{gj2*WEW0D zFW~SP$tR~mGq=$H7r}ccP21|JaXs^0e70?OuZ16$OlY4X z+(lKU$||TOpEZ8CCiig>{7?0G)+n829`qdU*?ytQb8eZ{azWZwGqaF z=Ox@p<14rD4$2jO-I`d!Jfg43aoRmr{7v+c@SE+u+kfShf9e0IEa$3FjP;ThKT*Vf zqj$A;FgA?`UE4*JNqUB^P3Lz#i}7g%7LAWXOz_#lFY>HXWB$HXAbz(kitg42Yxr1) z!HMc$N#EjI&6El9twp1dTVmE``M4zbmV9t@XPdE)8ou=t;x*<*tw|xyJ6fxIk(K55 zdI@sA_E$X{3T>Ql#u|0LJ$R*iV=TaJ^j^CAKyx*MaDMd0e%l- zh_T%Gi%VnUfUPzZen~Nx%Zd5bow3+j+Usc#9f$D?+)sPar^3T^?v+01BlKske#VE- z_79;&(a3T>>{DeMpr=~y-doN`|C`9W`*dHcrhPg*j*lI;GNfMlz_zg0w=k9n>#2~K zf#<0kDJzluru@^B$itPb^`v`1ew`67sO{B6yG^FuP3�w8#3}<@)Bzw*TZ~kIi23 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 q;Hi$#iO~)^aC~XPkF5 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

I358Bsiy2i%)NB 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

c>N6kI+{Wo+qD6 z!6=*3ga3{0Frsr3^j@Ypu!H##v)1HU)|&h;d~ahewV&e68S%fByl=>|%e`}EsQHP20>!*{!^fxa~17r{RN;+}`tiuYm8(KP9OgeDpfiM>)-9$*=`E z&i9Y}^(FAp_YNLeV~AfaEvYHxEMI)NlYZAp>zwo+C%wOCc?>7f$+ulWup?-#Y0|CwUBPUHbY1$MEPV=uGJp}jJ{HpE4uR^!$%JP}h84lgF{@KeHcWnC&U0>zy zo|VKdy@PvDiBah@Suff1rSwl;{;)G&@;X&7_CNB9uZbSbJzhTM)g;Xk#q_Y|=d0eg z@ar~g#`~({hgKa=G$z)3R&oYiKlI*L;j!5Cs9W~67~fRasV@Axy}DZW+jTX(LtVg* zT`ZF`JQFrLFokz{dBYA)LjP9%(Xyab|4mQdOa1bJ6rAywz5K2ZW6Rrull)Gdt-ts3 zwC;7d;JftDzA-zC(;1xQ5Bl$0RAl@-q-$^Hun!ono3I5LM-)q9# z4;-F;)6?4PmyTuWaHPVybSz7UBeirmcz|eg3aO>Tky<(&siniA7g#zRsinh_S~?u5 zrNgntvUE67ONS%1bU0E=hr^e_(&0!=wNGm4aHN(F2XFJMebRP#lK5*0JU;}FwDcg_ z`3}!*_!R_+PZ(e0FKS<-e75arqQ0?@t@Tlybm0T1u73)A19hjs;ShGJGw@em#TsW-QTn=71)-YttZ@|o;|gdSXbpZa2&GMW}z-u z-o~Ew#xmykE=2w$TD`OE8sJqs(am0-=x-eQ-y>SBEt^Z8wi%(WU;ORpn)s#Yk@(Vc z=VO=p?6!3yHs7WGjDs!Qoe(~U{bAO0`1x)!C*-UPTplV4ByuMPP7QVK;BMZ6_VSto z)H5Al$%E9J!MgqccHwLD*?0B@styrne)`#UYpdp5+llYc=6SyCgUM}0ST9W{?>zEO zxG| zhfnxpjJ4V1;oJO$GrwLGzU#|M;0;&A5^HwjgCV$MF)wed+0Gl;p}Dxu;!QE~Xj-V2jejV z953|^uR6$h6r8 zFQ;v-k*#msaU!_%ZJzT@Ygy}Cz4xu$`PSfm+hBhaZ=30SGg#xRKkbaQJ71?e-zv2J zr=L4CujrF#;sfs9#O_~amfT&|ab>8P^8;0-Jg?w4zBalxK9F%@A0s}=o?AiI7+Tv& zFAEljnxn*ymw$xjo%|#6vRJn>*8=39Dq zk~Ox2dDkL+Z=KHGa)ysR!DN^M_*TS;Pgd;g0~h{3%)NPh)YbL>|9;P~ye9#XB`iTr z0GA22)`cwsG6^mdaAQP8z!IdNc0#m@+LmZFLvWc8T!JWq3jwW8;>RwEOSCNk?5|Ni z?Wbz1b^90=bwb)&L?uD#{GPA(lJ^kNem~#eKfgcbF*EP?x#ymH?z!ild+xdC5?`@^ z_=*#0^WssjtUIwV@mel17Q}0;IFlF)Q|By+v1mbONxx2WV=Sg|uCI`1(}=NXqaE^1 zOykU-#^N;An-RWKLzn{|;2e412zQ#|3!&}u;hWsaP5jpct$ziR-iD6N>a+LW!G>f% zJPcpu7tuJ`L4SGj`xo99y6>ax5m@Mto-+Pl!ZA`h-RIZudDdV*bLe=VGtv!5IrW5I zUQ*nSJ#D^xO1JF12z(3ss0X0a{KF~r`F~ha?8((8;VN*-ny;QxulRhu`#H}eh3@mW z#&_dN2^V&@+GM`xKi|mnLTJ)B)me(-8_oLmiIFbNAr;4S_f^FWOJ9Mmx%dsFXA61< z?DIaF6MN20cc~6L?nG@KfsEugt>BqG*7sy45Fe+z>Ib%;$Q=}cQ00Ek{Fk(6X3IYN z>;0JtFMdgU{jI)kN#EhWKYu2en%F{g)rpU1)_7y=7{=J6 zlo1W-8oyln9tU^JBhqm-vE!gkFs;jcnATNp{TpTX)WnkD-stMUWWt9_);n7zUbw0*jtseb9^2MQ*X-}!Lerr{l5WD=gd++^5I&& z{g3+ux5|cl8aU3b+kG0n-iM9e>hkYiwRer(UzfQ3WnJgPS+_WFZTI+a+N*sCydzv* zCztr}$r=Z~d{q{_dF@kdI9_}(Uu&>`O0naX*F~B? z$HsX-5bW3m?0)7{XU~6V)A7GXj(Fc5AO{Kb)`AEBUtJPki=MZVYeYVTCV~^HnjE$4EEJ?h;y3Bo^Unvk5P^d_B`8&`OC#l zUclV+Eq*WH+k1p*Bw*X3RD2J7Gf8E0N;GeE&cE zx7J3u(=PAYvfRWVi#wxkc|6jn`u>CZg5;fSV^48M(78|PB;up*P#OCAZNAli>3g_G zWvVf_=iL+seo%`4N;yfKJ1TU3|8vUpjQ@Q!(D~dx&NyqoeiZifG^1BX5Szitfv)=p z*!w`vb|J$}w5!!_&)~XN`dD&6A&G<%H4 zaCb@HdY!NS)XsHb+OjMkMEb^y?AW~2@{ygJ$#=3pcR($Uhg*)ZQO!Y638E8v!pPoZA_9r+4 zy{n(vKiMdLDL-RnT|1_g`63^^*8pAstfi|^m7rxF(UfUS+ z-EGtO_u6I--yY}pL}bG$KdfV$TYe|g=3hF!#iVEcGX3G92&R| z-uPYQ;Bw?)K5{V+S)Gfl_O*Sj?JHQz5r2GWj&~VmGGQGx$({S!% zcyxu6YsD(W)*`1$1F}(TM4HDIYJHGXSwr0+aE#@{g@@dMXLdw5PqByk+PM?2gT0TU z-u61<8LcI?Cf$fE?EAoU;x>tLBb9%Hc#Atz!fq<$V%ewF|mvGvhr}S;KSv zk3&n682cIEYh!#0Uy1$O?Ebwl>z!y^+`pvrT$?_#qYXTwwIkTietsUmH=F%B7DBhq z#wU2M^`h>b+sf~7FLXQfJN4z*b=dSXM+Co#e*6Q6(2qXPrvFd0D{9l}46;I!wP zV)Yb@r`S8@zSvxHpp3*nRaJF~?E{z3rl6OxWbV`V<_~}T-u!}Ke&rr?nib5?u1UQJnk<|eSh);!{{^3XGg4b_Wj=v46bZF^`87dRl!BhJU66i40Cq@d4pO47u_)Z zU}p9Kd`^Ok@_U5p>L8yDJR%NZP#*s+Xt90}ejv}ro!7LV@`@?Q#=U>ddhSWk-oTKi zTo=D}tbuFtMQdJg{anF)UEH|(UG>#2aoTSEH1&XeFC}Glca)t^W(xDC z`#XA#0~ZpFg^dpwt}G_6KJ>X2(p_D~V9u${Fn$zSW#i%A#yI0Awb+SKBBp6l**xbr z_s@1R-u9%qf7;948~Ukr(X=l3O_`jl9JuIZoEaycpv?W2-4uTSf9EebYn{5l?mx-- zE0oDKL)~}tR?=Tr-gNUl=T=;~lye1@__=1s!6QGL#vbRH#_NCd<#1ioB~D$T9SbJS zsH*6Un&yh!!kSebndd$!Fmv~mQ??MfQJYc+xc|7YhW+c@6=9yOH*-4-WK`?t^=3{- z1GYxd<;qWB44Q`TFG<-V;EF~qWH@tQtA3xdFh?|R(HJ!XOEgB&&#`uRtQd-HKD_e1 zf6s@-4gcTy&`)=Z)8;g7jvCgA5N(`kgjURW`CD}}$k)8`Jco|+-0$<@)m>FTqz?z| zG2wj%J~i-NEnP-?J~l%us?7l%B|KYT_U}*|BWFdH78qvb82m*ZKMmS#%j6VeP>B9` zMZ7bOLGn*rdCC>=sbA&akdew!`kh-Td08O7lK&Z9T-kP7(w14}P&@DglerV+IS~Tjx`8>S=X>2rx5JM68*KZ$HgcD41b?y(*WbaT z^HMf0o*%&Ojb_SUPq9ClCWa)%o~zb07Wm`ZQ|Amt=wSKlWyqoZp8eKQ=AE$(2KS*& zF6r9Iy+{B32(%KzCtF`ItwC$zXv(V{JJ^@}589%4ilcI2ilg2>>FzN_j?;SRUfcKn88meJ3652nHJl5`Yifk9uhUIl-nMXIq}W^< z?vzZV(b?vi;=k22>96Fj;{Pb*Vm!Zl+NGX;w}20wta*q#Dv^~?Rl#YaWEa!+6KHqD zB-ZC_d}Y{v$|<(2#_8W|8}w-K+wJ@EyS9F@6i@E9(>O-$ToD@uztyJeX_NY9*%8PP zb9Z1Mxj?8ZOg{@p3-aN#+0XB$wk;bP>DpoMK@V;UuoseD|A;p;!;}N>6ZAti5BBq1 zWq*=1hp3%)8#J!GF~nUt(Avy;uZ#BYRr{^HP_B_@3{*LNuzQDiV^9CT*W-VA)_>jK z(KG*Cf#UlL9eZ1MYtn{sseL}5k~!AIPw9X8p0uuwLYvjgXdX?Te62r!G@A7ZzO6QF z_$%<`PUrJBIfu}HudP_dymSM(4#3%Xys>nK^1R3gcFK`^ORzI?fSJwQ{VDtEjog>I zfHrn8PZgQ>uA{wG?St39JvN6sQppoj39d>rXZz|qjah#qZ+kViN|?QgTyU)9-AdkF zMINDFFrW1&$IP8P`;*y!`zdSBu>1V)!2wPGz}BgD_ixI(s$U;Js2U&3LnJlAk7TkzPeJTC0lYZC)E&oFquV13O{IZrC z=TO*NI^dSrLVL^%X?mP8uTn-l`xw6dt#?k{HGzJ0{kUgkpqX2DN}xZVP+d8F!f@K& zhP-TGJ-UNj``dsI#1}2y$sSxV5agCsqlz_L{Yv`feQa~hJ<|e5bo>MP+CaZ3$BW+G*%P=ha!gkEkmcXjGB^g1t@FTLGh4 zxt;!SJNYNEVZ+#=pIwm3L{+=hVe|%vFr&J8eQRIjjm~J+{v!8|1_F4)_UqJ zXB}%anaP~4z>!8*v;m(BvL9bn(rlRpr^Z*A&B;~S&kX0;#_VS<+r1QWdw0Hx ze5&_%#Fil&Uikv#V<)=9#^cUC#y-J4Y{O;i${`!cc`{(=1t;W0<8B0Qwy@$;IFndNCBk?|Y z&B9^*Yrq8gRC@NQbYAL4$2Qh_BY9h|PL0Q|{^siVQ%)bLFJ5NfCjQ2Zt|Wct^}$O# z)7&Ay&7yVpHnRrr&dt-(N^TzcDX^zTU4MqHqi*@ljBBJHc0!--ORCzCSyR0(uUYlI zM}3loiV67J$iJ}oHKRUyusu0V^CJ2Q+jPk&bZRy8Q1wuwtNK)V1-)PjcH;lhBuW2Oj4qboa3tBm&t3mB!?QF3|mW@+=XHHl7s>3{A z#q;|P^ZY)ZuRF~1bv%FgFwY<6`NqRM-^laF4)gpmo;Mxlc@xinewgP!=lN5IdHxj7 zpFPa;XL^+GaTCkmY+!d)tDw>xBDowutnn?r_(bOa8*2 zcT(;=TK?+%Iq?^W3Ao5?Og%co9y8qC(ztc5Gk(m(EwL?(=@-_s=ktQmwfQ7$LiC8} zkKbT6A8ro)Iyz*3%HF%=35SkWbc9Do;UDJDNx5{iHq5wCW0v@d#+pl9It(YL<^9l+ zx}l^w%DAr{OT0UNr0TQT8`k%!ML{{cFXt*blkXu>7+gHq2mf%9aj!4 zYg1bf#nE-~Q*HU3#l0A|&a+l7==AiH@FovBxhSL$v&X2;uqn^EcYaNBXZ>ji=fmWS zZ-0IW@*91?mqU+tg}*@#Pd}@fGZBrc|8(W>BJQ)E@AUtUk%Lbi0q-zA#>bCASC*Vz z3=by62Stb#Hx4?ny2{ z-|vAJteI_nA0kd;4>-#1FgkPc7#I?~P5#d+Tpwu8;oc&diD2S-9J{x^21n zWLxmoDQ(+sostH3ni!r8=Yul)%;HS7)u?+pH}IVK__cu-8>=I|Iw!_;7i|%7rW+%T z!4k86+)9VvN!Gd2Nk!jr;$f56YK3OY)P~@LQ^KRT$2NHM(zZviBk99q!Flpvb2aA! z$GPQZ2|j*DR^RoqCVDx~&L+7A6tD4j z`t&bBVhh%{bZ9L!-}h z=UqWl#M<}xx+E$Z82&0$tP5f~Ad@4rl0%JLaJf?e$Wj!lmY-?OMfTxXdIrwIW*0|e;ar)v1L&=Xm*60$vWt!b% z%!QdH81Fvq_9tT9dj%!vJ!k!M9azqq z{5|vJpKrllbLg?_dT+V2ADeWaNnZZyK9le1aDFH4k=Z%|IsV`3yAS^5^u6>Qdd}8& zY3A1P$Zod28~=6s?x_ErzAL9M%jt_}mN7iQ=X4d=! z8}>8&;i)4^Ivu}Qo~@sf;EPjcJs;sNf$p7@`Qbow^&8|zh;OKg{h0Mc`BQn#?_Uxq zjz4>`J$~cQ<~2Wu%upA;F8Rk?e8+J9{TQQ}I|rMI4{uH)hn$D+TF*y1Ay4zh(>1Xa zI6Zwl9DV%e51sa;-MK8a?&9V&_f^Cbt{z@Q-sbN(@^7GL%mnLf#=tWVF?ONjdCr^J zv|zt>(?UI33we6C9o&t~lhQvG;BQCI7rEoBoju*1-^#{+myQ1+@Qd!jM?=5nG{cxE zpO5w;#9I?uo2on2fJ z>r-62qNKTEh1pztC*ODSy^im7d_TSnOna2CEf?EkW^=HL zwN!n=NeT0 z^`2|Na?V%R@G%Ryhn!Du@?l$#z(3lgb`|!HJjveglZCxYo*do3^vOW~0RPP=H9r-a zJU2}~0p_W%?x}b_OUag%apOyF!oEU=qR5bW+>!OtpOxs-f1*=lPiQQ(?an-NGXMYh z*Dvie$jFyu-yT=;NlRxOZVX5+UaWES&}PaW&K6bKl;!U27~~yqD7DvM*9Y?I|B1d@ zf3wlJezZ|lj=z%i|0d4cqF;43#%emN4?2(M_&mDoZ_rYPm8{xc* z@cbg4RddgMIev88&O+aXU7RNiC(rR!cG=&;$$ynQOXUXfzoxXSod2!*UlZsmA04s( zkD_e#Xx<<1z#lDKD@tuYM|tUx`cC}0@jKoBR}88DRR5VT!uZ={L&c>xv*x9^J1+?) zNqvXdnC@J(sm#$ANmu_#&%ZPTI>thOkGaT&v2BOzg%iDy)L3!t!94o3b%ujabB^r6 zr1TH#k@$RnJ+d=5TR%AZ=iUc1YyJ$4&!B&(r%U#!<~4f_eGEMLd8y6A8{t{`v(E3O z{9bhWt%vvxjB|Xy!NO0b+H0Ukr#f@L=QpTC7ggJKo!0$+4p-#M-gnM!=P2Z^kWT@h z@~rjb<=84(PyVUK9Fo}$P4}P9@1`0XAXyhn`J%RHs31 ztyhq3>AP}dsrx*&VLr+Fwaeh#^H$!IQ|XX*#*vAs7JetI7w2bhUl#i7F9HrZ^qpm)3+L*enh%%;74p-W{a-DRK6@Zi#?`EV)MPuFtseB$fsom_|9 zO`+Hm4?cdX4p`eY(4Wo?B!(ZnYa1>XVwm1r(4oJbc^(cXY-c3dgl7$ z9bUL&YoPQ@6Kj%xr)Q#JpNE#q!@?Qr8z&c<=9~XUcZh$f<@4=)&FwMYK3>?J)9HN1 z=6Q_KbJ;V+M&9Pw$gRj%99_2v9W7gPH?pRAXB59j^QoI<*!tXX^|@?5D`;%G{?y*h z(toY!Kg;~=`Op}L&LZ@lXB)jN+i0HIST@elKeCMiyB(e6*j|opbjbsmHL`_%jGj|2 zzi#;{^xGbG^J+v&C2vVP&mHTfVbKB~#`=dFe_0|KOFDV=;Lq*wrvlh_mYJ)w$I9-+ zS8e?F-Df@5{#y5Y_TOOazT`;1-d49?;#23(2~9eyxjkq$Hh#-(Gk%{d-gVln`P59@ zYv-^VL7T0~Y@G625ii&j?ssNqH8Pk&b_?PC!7Sfo{e}2?c^4tST=H2*pA;BYm&7}n{yw+Mh_xC-%M0;_6e5hrvb<>d-4ISY0N5Lp#iEveD432POrA9kBugFX3 zoQp0zdH$TT-i|L_GFkIyr+-Z27CVR0Q|mHoo?&gAhaPRk*7N$e{G|DFq7U2?OY4rV zYO^sMba2SGcg33?j^%cKpbg+CKZ!kG=I{V~nohY#!PyI()u%9~de|vtz(_Akcci~T zpY*g#J)5+QJHVz5bbN+oy&}c%cOr2P&C`mFCGxA012BKafI7~Q=H!rD^9I)8ibo=* z&}ie6?Koum zDc)z62e1eFplkY~b1dwE5dNV6v7F8wcd`fa3W+DXbV}pqZ6lx0%ru(M+rl|go(1zc`)?-PTIAB@`0c=Q{zDKwp|w( zt6Rt`L>`w@BJ2^KN?n#QY~~vQtFn@r?e z{feXfh01eIQRU0`XJ+?u%NLkKD@)1M3jH&MV-vI&Ktq6-?aUa17*4Z(_dZ9D%a)P+ zjbKc3kLsp&&KjvbmN|T;;t02Le{1-&%WXT+LU*TfoiSnzlb(IJJNMMNWW97-lYT-_!TmIbJxI6LTIb9ZI;^GBoi1)o|G^TdCc=5My ze9^(X7JMofKgQxL=r0ECr~Qn_*Y4pvmG=4N?W-noG^gDXW1nZpz361+hKzsY!=;aM z_!z2Zo{%3bNY9;5101xEA$agC!d%4_GxsR*H4=n zLyD`hcKPL!uAXh{rM2-Yd^GTaT-5QmT|RJkR?V*+opLFB@Y?e%H2mN6ark||ZckSm zCO&v{X*>P&=?P|I?Hf+r()Xhuoa*$gvDVHRHNoxMg}}=vxQjAl>DN`zmT%;^4I^7-+CrLZUEgx?2Wyy z4`3G%*Sx75J;T~z(>cJ&p4Rg#&^fYEr6+=Xe(%0(1ZN1pz(U{(kK_yk@ejXn-)RqT zZ0|_b4CdY$%)L1yjAr4>K{w}MCx%1*yu28mMn{aT3is9+F(%sM`P=<;&b_J`Ot z+W+947Y&6WkmbUSk8+2wKiBK@*ox8;tJmJZ~H`*eg$^7F1+#+m2Km_MV;qvv3=lYe!2 zz+RspYR|DZK^)lO`b5tU*C#pHVE=#W6WNgmv+U3Cbr(DH5$CE4j%1%|2%q76j^b0u z=U6`MAs3wN#Mz{l{O{m1(*vA033A4&7kupvfBV4azSt?)D!~BzSk7HOo}F2Z{mMNK z<1FY@JbA^nM!jsRv92%PK$f4!wi_;c@ddw+TZg*yO6u-{fM?eeZe^G|BYxeYZI}@pkcu-qf>B^U}Ea~J9Da9<}RD6 z|L^}C9}Cak`iI%|KE9>3PdR)D2RSc~txpyTyH7Vf@7R^HZ_qcd9bo*l*uE&8X_ehG zyy?m>oS4})#3r?7?RORhBgHQ>ZnVD8cx`)i-kg^ir&?ncZ7Dlh&!pdXUgM2XXRYzFK%*l7f(xMOh#M;XIi0#w*kXr|~ z&*()?9oKZ@R=*5s3Ih8*@H+XBzFvN{&XbL=nCaG=oVb<{--SlupEJP#aoa&;z8A9J zn=#ObamU!(X4+@HbcdD~TM_*&bDib{_QXrD|Ard3#)fjH^11bw+p?6#e!~ASLH(ZC z0?&p5i>;_Rf9&t>iIs6)PBF7le(UU<_!)&a`_$h1$}Utn#fQ{XxI6{F3I0=Q_a?^a z5O~*c61KUEH&n55&?~2}9OU6m@mqL<>ZA)Xlrx@ShrU+)D{g?Gfp2&Y?!VEz4e?q`$XvP~#6)4w}fF(RO=0`=Dvwob(xy zRg&F(_#CWdKD}En^5nMOruPy-m-*@g z@0hRFE+15n?(eGI#rKJPFB)9meuB~U>}%)SxIwwvG z4y$Y{W(~u9v>qM1p8bTlVLX%E$R5sPM)AF4&uaF{YVD^plC<}=55RK;xnd$GcTNnb zzjxzr9}!%VI>ngX_+{qESBPyd3gy%lngwqpv4d^D*ICB61?L8r>>$R=!vAI6lygzR zkBlX|@LQypUT)KBvA&3V{l5;`xz^Rq#1NUr?RLJHjh8y>r@r)sN1OD|F7kwUv`vOK z?xvb>a=>qUjSZ7;!zhOI`vah#JkB9t7Ni18!n_aUC5bcfd3CDg@T%qW%!C}^s)I(= zf+%fZ&Pr~aQI)!s{kNly`Vj}GzrLR}%P!`)AnT3fW2Ifw$eU72+jIu;zkX`2*82>5 zl7-Z>1G{21&xk?pD!)wU7>%a2j|IB>*rQ=5a9*4G(5AwRJ14GRhn&Du#SB>OXBLmR z+TmS14_kx%vBVJShc-(8Cw(R{aGl4zXZn+FFUrRRCR?(6<0{>4(X2PrZQG8zHHyzpAm0fav z{F!%lJw0S8`TeiTQh5^HxFAcG61UnpFaqxQz8;#h>-k|Hryk>@%!J?dprLt)u{!Z# zX2SL!&-=hXwXOVv%!EJocz4c`&b!3!uePb*K<8b;x8Cub_}z}b)nCsHlmYMK&k9WHD9|1bmE# z^hX@p3wi!gkLUdd(SPq{CUo#zvS=WStC07^vw^Pl*v`qh$Okd?$+|wBWHy- z&YM$ZCa&E94T@(8cXx1}>y?k;B5Ld~*_fr8oA6dao zMx*kqcKwC?>@i>F-bR)WU_W{Oj>Pq{i|>iWH3#DFQ$B0ib>>j)I_%L2JokL=&t2%? zkqza|>xpaU%}M?{`wqW+6ulz*E*|yyQj_oS(4?MG)bqk>>=ov958wZZUFZ4k?>^D7 z?c#2p*Osds+b)TIk=(b=@OhBz>#qN<)cViK^C(@mi+&j|edOwgR_^Z_ihb|~w7nH| z%4gdE4U6$htn=sQWQpIljf1_mt&DA<{BpN#-rT&1a_E!T70{i`@}DM&jqvsyM2FX3 z=^lFzdgtwBil(sVAO61DU0AQ2wj-F6*D@!2II?9cj%>YU5YI$e>o>%Zb2hJ_zp+I5 z0vwrgV?%D#xNzbcO8KpKk}buNq{*qI-(8&Llboi5YxB!K8Z>ZofW2+(Z^u{i&3D$M zmCuV9qUZxd2QnvB8temj{7?5GF4VI*ST9UxZq|N7A?HFRqiy{6^iBX??wTBF-b;LB z5pDNm)|#Bv@9sIMw)yhyaL+LP;@Q*RqwnPt(mglvV!w>XJNcx#@E!ev_nL!R<_ZUU znc&b_&)JlhoITF_3DDxvHQJ?XJ9MSVe;%bDhnnQ6L*AYN)|&9ux?0^cVGWn6j)(2s zKOfSj)HokD%vn;=Qwt7TzEAVtCEYs_8ZOq@e!$LmBR{Y14oIHr!+C9sx_h{Vvo#*L zx0W`&LVapy;v&(o%(iXR&V09>;W70JMwr_ z#~AP3w|yMm9kMMK2*+}pzaxNa{gw~o(VcYfMkqhup;2@{2;K1$zX}^pyY-(ZoBvij zN0NEm$@O;wZ}YFnFOzh0tv1XQ-urD@JJF@7un*(W5dXlz8<`>4+SrY%|Aeo?d3VSg zWrAB7TLN78_^-mH-F&Mp=Lqhu*bjh9ANy6flzVq<;%rBMCuzG$Zl?Ked!l3fGM0O< zeBoK(L>|QZmuOFTv=8I8C++53ZJDn6>up&$2b`^iUxiJ&`BuwIh4)Syb_%fZg0I4c z-*x$4BG`LuSmm}B@6$*7@G18m*_LU7!kn@GqcN2J`BYYT-H+9mj4-0--s_sHb&?OXTFhdt@O1i_8O&ql{1Gf16Faq@;kj(-)X9}mB`7W^J%Hxl! z!~2#xxvS(eatZBc9g-cFb`(Bx>px4o(gEVze_PtMcx!3bJnYU2_8_W*LprKXTfOd0 zbZLO|q)xsM=5PAqYI5^l%=2c}E^*3P=7_rZZv$N_Q;N@He_%x2>cEKY+K;gBog7K7 z7ji+d=i0FoJImQ)*8NVyo5pqG@5FzS6ijZUE8h%lPX;4hBdD`t^o+(L%4}f1Tp!5q zXk{*XZm_XweIH}5F^Fe5#@<4G4>IOzHQnUPkvr{z%qx_#V;|sbobf4+>N>k zK3~godwgc*cdwI^p8s!@#?{@i5`0&|dopW|09Iwm17er4{^ghP_BGoIG#5mFu>n=gs+o*v{6^qBcGD8Lxjh()- z?O4nHp2jFKJ451^h=1^r=TrHw@t0mac@qA7{jTEoQadi(?jzmLp#B)r^cp#0eSSO7 zhSEp6TRDl`h-d1jIBO@HfAmj0IHV5wsjF~#IUc`YiuOqs?0ShQ@2)psR5|hJy0gu% zchh0&?PP7!pxg>s^_GuqnY!!<>wM#u9p{&iO-vR4SwL(O4XRUPLH(!wgv0sszP!5B z_Jhi&rx=n0Kj@8r^l)(`%4_Gul`i-+Xy+$g(CL1ENiMG(WA;Sq?oEBl{~F}GdTZaR zOZlz+J=+IR0B_J;WyIE76%~^Tjx&~!&yMrsz~KMcy~~N8(A{;;x_oGp*5vuDA0y;w zZYQT^*rczP8&%p1-E+H9Rn$AtJdnDQhrv<9GxQ+}(pX-D41 zA{#kD*Z+_+Z_bPv&f2cBY^p7D_*|DPHdm~xi#pFU*u?sue%x%__XOwn+FjYiM-gz> zl4hbVwk5aW+NJg6p<7NHIE!G%3XNwUl{{$E*iS`HXU9X~iQ4NRr_)#V<-N6oc-V8z zpl9Bi;gX$BJ6c)GrQLB;*lV5>N9FqCKV!X?-0hE{z?0q>VqS*M^P$u8eV4OtQ=gPV zmtv~4wmC8E#9)MnJ9Ai}$$Y~c8)A>Pk@A{DJp20=#-n_ViZ#%8^gV|@`P{Sonb`p2vj8FN+hd1q}zkhR?Q=f8*PvVXR zi?vdcwbFWg;|=I*@xQE)yFod_sdWZ?nxJvn>hh}Pz}z`j%31q;hW|JEj?bs9k9d4q zXZL3>_~h|N>y#kn#GhR!7^^-0Ib+^wL)-qjE}z!LUhcuC(_KEvZ>lm;@BWj|#hZKV z`m`r>GH{E48A7{O(=Ls#06w{`S@8xZ9w6S$ecm(P;0gC#_8A1hvXA4ONnrhF{~tk& z!65B(a~|4_zoyUZbq?o69GFq=_f#hyptcW70pv?rFHQZp!A@j_zy-oblx5f1S~|xn@}B=D@J$9mC&te>OTMsi)o1i>K3wc) zHNGUR2@l?QXzaj&ADq=4Kk)B-^4h!0WO_Ab@RKT@%#P#4kC`G5gz`RWUtDvH{BzP1 z)#%HgZ1wcz5PNJY2cZ0zA23$e9?Yy!ezS7!b6lDq;atd!D(%zl29HQv1YWp--3-4ipBQ|%qELe`aAExOr zW#F)YmED%f;goB3vy=9|rdp&c#QY_HcW=zOEpc=aA~OA!N7Z<+f$!{h~wYabYyl)ms{cF*~- zxmxkGZQ#{hDZj>NC&F8vJAL}iJ`TyRwc%`XT5vB4_}j^$qCQ#(-Q0I$$4%}WPS7^FO))!00C49+H>hjG^j9(eBgKY^||l{KhMnm$<9Fi(m=4jDkoS!|5r{Oap*JpTj#e8NK8H5 zbmlVkP1}H$spZ%bDsQpxABXqVW5Si&$lc=TTG=Vmw|Px-y|yqvd%Q@(i_hUj>rnPo z$WdPXA--1d8c#2ajfJnuJ5tcv$2ntCzI>`NpU)gVv-w=e=UhHfK4`CkEB_>vZooYyq&smvZluDcmZUW!?Dh0%oWSlXU$W#umZc+6{9XF#TN^%Uv_HZJs+P z#Xh&i_%6eiP%Nk&*S+3v^TxO<--%iq*NL=SbL_K}8%nvu#dr5To<3$xDw-|V&yo1G zcyMPoJy$?ay9<+ceHP^}ie~oTT|Qj~OdBxDNh6&ionZ2@V=K@R<=ECckTL6e>4(8h zzvSDFv6!yA?)$P9wy>W=#2MreZ@@kGH*!`#804;dV#XA+k4{e#*W|@z|KuMf_Szv^ zuP^ez-5`|-dnE$!PKpDi2E--{jElp$`Yd|>Cqsu@0vGk(0W zFtq7&VB~)lT$uieGJZ5}7RCHB&bS%c)ZxNLfYsPg+aAGYtBMV%kIx-YpIV;Z`2{*X zJyv%_V0(BvY*=DybQ*j1rx{%@^frF!jme(0ybk^ZxV`sk&m+s{c6#-1=Y31odoSLC z`}S7r{sga_gV)>l#pa}(-p6Slx?%55Xr`Ux4$%+Dk5|vHfG^bfFyPbD4SD2Ly2bB{ zIQvqOkIw0eZ=7CLG2@)##qgpsc0uu#KR>6cMrim7=EGCAI3mqeA}?E>iYHQ`T%nV0%XtAk&PNh zoF5Zj=IOf`kLu48z4sgD&S|~br9rVwFHX5o^q7ftcA3f0AXz-#mAU9memlLKDTV7* z2lvTRhwh~d|I~*GySl@8Shn-Su@o>S@w-|>r*H7#JRd{LgTi&I!w2;L_nx# zaPc4eaB=dwsSlM~@;&eUkFwsgXW_iRBlZ{X{qcuX6gPtywj?7D7haY>Wo%{9ra75Gl2hi8d%jEX3 z?K<+iuWrDv7iT>qpM&(p6})?Nk!hdt(A=SUT0VhZeO=fZ`4Y+Dnag>@xZjqP>jNmO zaCm2|m^&vKcVzp0d;r9ut!o?|DQ-GGQvAfme)a!ZYSce@g;oFaK9S~M95cQ7@0)uy zYOJ&|;8U)jc6-d;9~;%D;o2qiiRWK+^h{n;!+hpqV_0Pi>r`*8 z6k@-)kvenMmNZWzo=h>TMdNGp%goT&&|0$@8E@7Zl~IfjeYY<3+mv+Anl>!g7$M(Z z?}lshT)1Sp4;OXETzQSg-1=A=INd#$!QYUDW>~`kGkKW^`wBst@18uv3mVisOU%9&Hr= zbU>tP4R^;JknIod1;oQ_#U4+Mp59zw9#vUOJqMU4)b8{gzrMJ8hiA(TYRBDneb)h# z3`Y{*gHTC+Dxw-|vs>Zx%-2b<&2cWGa%?u((3Nn!dfUQqpXJ9-%(be%^pvCp%ssP7$Y=?3IV zaXZdjG@|KAaHaZ;tmE8W)r&{a*Z94&agD%FEIif0z~0gKL=Py=DK*P)XV~>~B(4)* zZ;KVv#?*!W`#AfL`_c2#|4Tg@kZa8!4h_SbR(dp?(yQvlp@HU#(bF4e*nYjmwqI`r z?V8DFvF^0OPrraQkx856^V8YD^x~yUbq|2%iOALB_d_`jJ6L0dxqrkuSn_&7Ug6#`*nsg;zgnG-yJM?-k$8V!Y+>JqYv%wbz0))r|28_+)1hf%0Hs5BZ}a>OdC0Wm zSACkeDB&&yUVGp}@#%fO%P4M#w)bPkl4baXrxh7{moxr!E@kG1lIEEMjd9_rS+ux) zWh}t&X5YCskEciiFZIA>c1(k{Ir4A-sz0z z@M&3fxiJC8#j1;QXw;?on^^PWSB~K>vJuXG9Iu?sZ+t+^bF<}R&N0op%R-UjJ@}SR z44QS7{kdO|aXN}|y1fr~y_`oJ_Xyj+5(|*4Cg04d8+-S87mD_khH>P1Rh3IuhWghf zh_#$HhS&`&azi=$aM6=|+AKG2pzuP`wj#Cz+UlV#{B0j5y~kOH8W#Y=8gm0MNnmFF ztfYDSKQiNHux48EkIeXf10zfShVMV8KQ!l>#krh$>ZmiS`uC4i{rxVZ>drjfD|1B0 z2Ik5QtS^d&7z5XjDykgCfA-^MO*=SXNotHSyKamzZt)mnynF!B_`;d35_NITAgmT6Y6CBY-n!-YPc zlouaRsw2TTSY-6Fp20lvGx?=YJ$WB;Iam|rIO7pIPfVwJha zmgn~O!mis%0U1~(S z_S1JiqVHM<`|zG_YZ#Bry}&-u0?x}>uJ2?XxgIu8c63|9$-DXPip-klUf|vs`u%-! zZ*Jk<_~*!N`4akSgM60Ay-{S;OXk;X$gBxr7wcIL&lX%ZX=x|pP5hWitgZ4qD>v~I zgT9&9CRdsNJPiJ7@C&!axU2>DYYG6e8C^ff1_IUVO-~W)-HMYBBTJqPdizvwGft)J1)Jg=uHbavo8)>X?>^shPwe~jjYrRC}IUsWaBCz5V`6Zgb`51gF0x8|Q(uXJ3qSd6h>$Y@X}%L;7}d zEan*FE(!W=YIS{yg~#DbgeMmHywaS1E;1Z_r1izd!QOg&tu3#YA`^l&fHk*7x(1PV z65l~nIX*V!a2UliZhNC6BMz zzDH3!QSNy5i1vob8(&5qb8;$PJI*9usOiX4L9N+52Hs2rb`;;)ImJ|7a3gu%j=YRU zUX0$#Pnw85cM#iz^Z7fbE3SKR)1!rs{n5sqlF0+}Y}vxd2|v zZ{0|H)YlR2n^1kvbUI~I^u5Q^L_R#l?hy@XVset7opX(6LzH&ggX`?^9e}5oZpn<_ z0j%hH^Abmv8d@^rgfrga(9TQ>IqCz*}@#(CE=M0GrD_w_E`-EfV$Is;(8WE&cs?ON+6hb&+fg?SXtjKk7VE zhW&r;TBsjNe-7h5tYY4c{6$SHgU&$zz&GdogM4d_pDe%WqtEe^u}`v~uW<@K%h?Uk zW^vAGE`GrZ@<<48I>eNw1lWzv~bUH z^A>m|9DglvV|iR(g#48|dGFy@43PG#<%`(Cot}mG550DNKMVKE=tkid-z_&@y`lHq zIcj%1KE*xY+=DMr=Oe82IktVqc;CE%+`0(1Uz++`M;PNo3p$~= z4!nyu^eJA!_lyl^7th4@swT$wijmw?!}kVal5|FJ8~;-yjfq9rsn$*AMd*)N_`xf6 zp6yNQ7GBZ%@-XIkaBEz%4?SxdWw+)#eI5Q;pJLr}AlUdYVv4DA#FJ*T{A7BD9E|hI zTHJY)Mh12Myp{KoNB#aCza_8YZ)?c0=^74P#`wC+mh01?MRF`y#Yx%yz}iYVB((M@ zuJ>zWt@NRMFUMxp zlXUlJ%Rf^+58L%<4dT(^`FYAe6^@4;9GpGXd3T*nwejy$S?nIk2yMwnhpD{Uq#V52 zG+FMNs%G1oBJ;8uDQy0>D~SIyK47c)Q!DP>{Ol1MYMe>@3^;;yimR1Yj5Ta&JZux`C&i5 zP*1<@qOG34V2FL*%iH_7_A~S-aS5K!_ReFN)0KC++h=>UM|Pw{oxW3BKV zr>z<8Am1Kf>@s`w#Mk3byrGAJ$vz3e zzf8CMzj@gq{-@{*zP%AhOm^kJ-p2Xi?T7b2{SIDAE}b!OHhpy#W8h5W-n8>rq+ENk z;q}XG+h(8UjOW~Xm@~G{^wzHIn?n14QIGVVay6;{I}dX|uJ$z*!_(N;+1GUZ_yg)g z|2(t#WuCqHq|??kHcHx?zyABOIjJ`$+jCXuO{Z;(*IiV+z%;H6o5^(*ThFOl{NvKD z8M3E2ccpl>aML+95A2xFKe+tBP94P_%tq++;zlGBidR$2${J!^3XCC@JMaOh{*nWWzEh5*N=CqCUxre6&+eGm@{`eTyBp;tQKAJwoZ;q{vAHPcRHr3Q6 zJF$V^lJS<`Nwyw{?Z8HqPU(5itor)#B+bvx&z_wZC zua@nVy}x_AU>K_w`b7Jh+c=Bvt*xx}e%n16ZfkL6_#$E%@Vg}+%;IT<*JrGA;rsY* z86IZ)-Lmtw4MvW?M|*Ai_yNBj&u`iA8;#c$HXivcv3Kmf)VBf3}H^mzWt@G2j!TYqg59Ou@dJJ)O9-9DVpX}Dd z$(mw^729*#RZeV=ozsMv96L5gF*=IXQOu5FcND{;SRTdnD7Hs2K8p2G%#UJ!6a%DK zp!s}=4N{y?Iqkod*d9-gJ^B0)-kF?7wfTasuw#2}F71+E&x`H3f;^`~-px!%)%xx9 z^3o@s5I@*=pqvk5bZ+0XrTX;;6N(yo=sNR!cPUtT_tV9!AW%w+6bXPgjlh5|*FZz25Wo64)*~ngYu7R@2{p=hBWx?vF+Og*+L(iRsiCFOsPJizs zo^sDcXLprx=C_@?JC2Z#+v*4(ZOpy|o!yF`+ddyj9>*H;@_oTx9^*N-zmHL$xiQe3 zS>CHTa~*eP{KRa2XYmmabTYSOs)Nn4wF`pWhX?K=^Qb!EzHxA`SJ@Zd`#CUIakiou z|H!mpU~inY;aK+3=Hn+>6C76e1Z~R%aywG^Q(y06yjsP2QF~=q26O9H4(#>nw<{`_ z_UG9h_&~0t%mU;up*bVeYp?DG-oiP`#le1cGl88kqSveI2lm=~u35J(2u+Kj@m#a| zsr8gyeDe_xTvj=DX)F5VmEQRKPcWA536@pOAf|6mFjO_-KxW+O;6M6jnKiwvNb}Ao z)F=7OogHrG9vharM?!PG5x4zxz0ouhjP|piJi=&7xP^57mfSxEH|G_;R@-BhizNqDD}PQujLu>=%b)X z^YAOTIr6KyLwKz3`*>R2bz$4>&U(zYJ6O|6j#|Ix!zJCdVZ&|0y*yST+{_bCgZtaS zRxNU1#mlIxuOqjLw)<^Z>GjL5@L}SdZB^SWo{Q$T<$|rX`6!wna%tW-k?{sjZys-` z@oiD%KxzH1-wzv4ob1@53C^!V-*oyR!CK5a|LmO+7|qyE1)aUF_Sy@&_qs;e`D}(a zWrCBxaj#4Cgx$Tt!kcA#FONm3PiG;u<`<6zllJaUyh%3Qnpj*g#HT1Ps@{8f1C5`G zr{o0V`7@RH#Fon^){C{_;m^Ey`Y=rlwwEL6aQg7RujoU2|ByKBVNDZ1;d~ZzyQdE? z8fmQ7-L&2M5S?Y~L)&lY<^LGgB%jcH_ilVu62o(^)BkJh1#wY5AKS|w<>uk*MFT0mYg9EBajD`m7S#T^aVctup1N7vP6AB z?oqoh92riX@56a(pu{!8&3RDa#_kM&+gX=j`oqb@YgSVYI zO=W*lQ8$4edChNha8?Eo4-Z|RbF$qV5bqIQb@j8FUED^nNGXY ztXVw2tHoM%67e<9!_T$ctz2lwmMynq=Dak-tZKE&3nb&4i8M@f!H$QfCs>fIR1s5^s715yhwE1GCQ+IXPV;^oqo}J zFU|c`TJPyBlJr7yg8we;>ihCJ8gF;UbT^f^ZiSO}uG+bjii)*g`u_Z*bFt$h+DlIq!K! z)ay^Zw`n8xRkGDkA{^Kp;E-L?{ob968zQoE?vF)z@A;gD0iu`_f|ICX?r_<*{yGRZLhK0Fve}Wb1t5{)F?BIHp?$7oMBf78&gzY zvb){irQI(8^NsOY!M^r7DLvg^Cux1#w!GhyZOe1{aofrF)`li3n z56zQ1p+~aSa+3Oq{1ouyH^8;#`fyQv>>ga=+pHhhwY+khTKBD)_5C6V}_gdSgFQVP#u@s-eU76YKiz3Zq zO)IwpepL3)&8_5u?JLcrX09}c<}NV%RTkFIykQq}eG$BAUt~1z*;Z1#fPJoxLCO4Y z4X(}C9@%j7{`|@21Nr*{b@|1?mHBpm9B0f*!^^qY9O5-`t(9X`UtsuH@wDROz7ywt zoEcZlry@8!cbYk(vX*sYQE(W)M^;8Z<*sh}p@Ka9_$p_L-keiv^Y>g}H2>|?`}6ng zGV43g-#;a0Gki)iKmD{-lz-Zq{CTI;ts^jGpmf}3WRN=@yNr&^rqAiGIk|d1ys4Sz z#nGF|os&_VRoG1(D|G(4EASVrw~lBOiv>Hx=-< zoHJQ=yUk%U)$aT7iRn%N?6U4Mn)|&n^C^>%&Xw$vt6OEX2WU}#s5!hcfe#0taCh14 z`p%! zA?7;WArZ&7tbJ+S8Sx5tJaRwB;uiKjcasM|_jR@*g9~{dSW**Penukp=HvLi*oW!H zLF`ny&XE)Aw~+7WfISzTn%+Cto+o6l#EIAP#!kavjWP1)F?Mzn6OsC-52t)C9$fh# zjj@_oN@L9Y(Nk{$8~xaaZ6!X-gEaDyZ+(7nV5IBAHRm*@pEm2;xA9@FS@?-z^H2QWIh{KmrU&XjLY|*_##pWO zX9H(ZTR+UI)16}*EatC?t7B${#0jz`#{Hc z*&j7H-?WQ1dh%@RyeycDfhh!LCpgKw<;%Sbb3Ay?1xB)ujWeP3fBg2R+_>TfL-YUI zm_^%6;%><2JtX;_4`;pX*b(KKIrQ%uyI-_lQ$pVaxIecIKAXpKo}SNMas#XF`h>BQ z;~!-j~dh9(>`boG9{h& z8h9iJZ#{+_xHhxmCwHLlE%azR{F_!0o`fA;U$Cs#USdpVw}CH$&v@z&(8aEO@sfUH zUnG8$*|de{3yC=( z?|4mS%^S?mmr{pGS=k<J4dNKX3m6O5M+@&5EDQVo%mpCNT>?j2n`*zPPWzH*y_i3KDp$m3+ z_@l~g&iRX%viOJ}N9#(RgG+DopQksGx3w^9XNi* zJMp3|*XjGH`Wrbq>>Y$HeqG6bx#M%E@IBz*qg*}s{!TxJH~X+*Pd;`Cmb+VAx^4q@ zC$M&3yY+|d`pIqnA5MRNdG(9LXPE3!_vrKKp;ztog1fi;{EJR~6|ALve~2H4R`{Ok zW^WwX^z7*GQ@?y6(v#l3$>dM6^FFA*)AUCu>kf21^Kz(22Y5DmXEeu@dT;Pn(Bw2i+z7w&lvDCGqFzO=|9XxSC)u~8cn|T@tjVhS!OL@@VHx`ff8&ft$I}7MXqt^V_c`so;!&rq`yMeG z_b~6~(pD!va&Xg$7dSdaW0TxC%?0FdN}%JVV_s&Q%V!kkJ3Y;4F6WM)o!kjF3Vzgn z!d%0=Z`07uKq|-E(-W=ihr;a!DQs@}zm^=X#zu(*1VB5{`e`@z{f33p<`O(viy9vaBO`z@flOw>uzEfOSHZR_y zuLYZgUwW@O!OP32JFO~~IWnTPLCsl?oGicDvE9A9tR5kL@+agR(S5~-;%;k zbnbEl^u~!x20n8`0-F%X|eiZ=`Lyr}}!@ zmGs*6h-@_F%^TYE!LUg4eA=irS^AMkafRE?IPKKk?n&|ZNb(%2XjsU z+YVlKDK2mq|95A>i@tF#ecIcy;Ri&zrVu-zm=WW59{f7;Yxt%7B4N%}Bd6n!^Z11S zQhVo$WsY9$>y@+@KUt4{$CsOCY?-4X^|D>9ANp`9Z~nb23+|MNv;Tdi4;S~=&v!~U zJ`~#lKJCNpV~j~QM1y29g9o8Qmh5}Mw%^RO|4z%mY^}-;(ut2lW+72^f38Lx9<*m>xjH2 z`I|n#hJI>~ViJc{Ca`zxH57EIoN`8n==+K@z!5Tj#d={jV|9D{45RBl_QqthNe1k1 zWI*2|=>Hq|E`^4gFEX1JP<|eBPTcGBF@F83`yT4H>l}maMj7dX=q{r;LB8-feV*## zoF#1wm-~Gpy(xRhs8Qe5#lm(jfa{);-KV(kYUoq$&o}T7e9jtIYs2t&v&y@78X5`p zDf*W3S`*$(pUOYjGp6jo4@$A2(KFjzJ+u7l^HPc~>-O{KSSC7!^A(xbgPn@&x97~P z_{$Wu74c#I$+wPVT#;jZA^g>SH#cz}QntF+*H%j@v0Q;J>8h~uu%a)D7~9GtJDNGl zv6Y>rtF4_Ya11jjn>=u#PMEAK!?4(MMgojQYZ01F z8YaHTaG#4OI(m#uu@bv4hBS@*f2n)-@TjWm|NqQPfHT1hmq0>5 z6Tr&^Yd?wz#!E8^Y6Dm;17gs&3DSO?K&^tc5>Yb{wG-l{Q3OO=BJ?sDKibwS(Y6M( zZP40QZMD@}LqMH~y(o$ag89AP`<#E*x&+qp<-`^ke%*;9avi90*uf5jVYpu;( z*g=gfQQqP#EEdtmB5ab2Nc9m^Q?|5^Mw%-JZggz1yK8|*1|)92~C zCzSsJW1dn1jhAqr;<)liQzzq)450Jh>w($Bn>X%k{7!fATTD(5uUxK+vy+6gK>k9( zQx80wh%3>5@*vLc3FS`MO+V$Kf~Kxu!3*lMh`qGZ#ZLryjGrL9L;i%a!wAL*@C5_; zro0E^OknJ0t(e%wK=hFXjB^HKoPm$t0_IM**u*@&_ihwjB{C%&{z4ai`F?u!;=o@7 zoa^BcnRETQvE5wl?f>oKAAkR4%nyEX`KhT{zZeDSIWruzmoY0k43jV-f9;7B}ZCAOSm7PjPr*SvD?s0Y5WMw@S6Q|O0IhQ&^aYX zzT>?6zagij@-#|r`~Q1h$xEQgk4|&uG#P~cJp0eZRsC@SmGBai%k|{*Ptn?y&bt1y zQX}^VtVTmWZ!GOw?VTGsx~p?$?)hnLB(JdA_k4ufW73fuV@YTxaC~w99csgFba>q^ z_7Tt5UO5_SD3R;iL zUtE4j`u`X1p3yv17W;VY_y4F69*H+KcpQdEq;4dl}o!GD5PRn{cb9A(g*x*?B9N>cojre(E;XTMY9}Tu1BX@Vq z#&4Fne9$^|-Rt+vDf`9pSclex8%K8`I5-V_b&T}OM?C+{ zGsK%$_v33SWhYRUcx=U@zI@UEV1XXrzkb1z+tBG1Lw(!z6P8?ny}llJWK)n{{T}|l zTk-eR97Uk3`rr{ely^$;(OP$>?+6V2llF&UJ`5c$?I$J)hUKwMz^pRrPrCRu!Q2=8 z_N))Q_B4N!!STU#{@qs~kGXn(-4lC^zsSMnUVGod8b@cnigM_R2k5QF{|DL}@u%s% zJJIdq{dDZ)Wle~Vp`Cfq@h0A|5=s5+C}v7JG=U6=fl`T^E1I(dWDEc=Jn z>_{`Nkq3-R>$4mgRD7si_8`jEFs_aqe_Y;rYdJyV!dKO-x4iUk3=colI4XdnoN+vB z?9M~oF%XAz&~b;{F$~iDz>5yXhjhMT?l^uRYH|)QhaM&CiuhM0cS+@Hmdx`F! zPqJ@h7+bdOUe7$+{Uy8Sn*A@so^}uU9#X7_7Gf|}M)#EJevQVD&ik_Xe>ZlViYMLu zGI6`fhj#S!{(dQ+D(}7x-BBLk-Z8anV}DnhHgz)M30eE(!R%>MmrCEXUdpBy;V?Co z+yaBF-aKp~-}qtQ>TTfja$;I_mL)vt%wK0(|8qg#>b*;yd8Qp>f9t9K1#^C&O~~jz z51emu5`V;gB72KH0-KgaED?NHJXx~2Y%{ye{TzX`c(P)6DxeLmxBu5;c<49D8XT}l zaXgA2ko=!#{NffX>gNo-A8tSW1pAUVPU-W? zxg-CS?a=Gm&8LE6wz&m7!?emI={Ta_hZNG_-L?7c%lT zc#~IexjR4d_5KBQ64Y5f%zwX~=bIUu@&K=W-tTYRe*HZ}-FC{*UuotDqNH9wy}u8Y z_2Ak-xfbkM4SzrQ`}=q=`*1sDb|GseyQ=E6&qan}TNoQ{O|ov#pPEmi&FO)YdK!N< zuy@tw^Lvw<2ljpkoOF!itc?BI4s`cq;GrGVwN1`!=k8>!>+7onD@7lPVGZXbgQqqp z3LDNzjBGfkH4i&?@YK=~1F%z()0&v?9p#+G*zmmMz*9@bAChy9X#1++ADmIW>8w-f z9JcE>(D~UV@I7qe#5T@!%XPfrm+Ozu-+KxB@w!+g<#gxs`IPm1D2bDD{1IRG>v^$z zou6ja8xd_j!!4Woi(j@sK7V&s*-_DE`8lrr{h{aZY;Z5%In7~FAoxKyI^j;~(QY5f zKl^SL^Q#<_+g>)Qi-(Zw1vvb8vf=4>-*)81PT8u-muNSl zJD(F;#2zzSISN(26ew zzycHZa5?oPCspw6_^&y6+Z`MXPj3b$$)VWKCue?hVB75(jk(#0&t?5TN86IEvgM6_ z-h~bFQ1-{2@NUJOcydJ_e&N`*>iP!b29QZt#z7I?-$j#fX5$_oRPs{ev9G#WFu9x#f~i`{ism zM@G$?S{rx7lJ43lcFRVd^2?^&wPyV-t1LNtwcbqs8~w7C?wV_PJ*zC|*Rts+pY+Rl z>#gRmS>@nEvTIhF`98Q^)3a&zve$&6;Zkzc$d;@<@zSpaR+e$@fzCF&>dtCR(pK*p z?l7>hJr*G&bbi+N*oBnQ`t0T0C^MM+CdYCXP{j8*zOg-KPT(6~i_A#;FX7$Qp;0@O zPsO@|TpZNp4x+lEAy%*5k<%Rhi`^_fPJa&-2LgP8d_sJ3_zd7Pkk6op$^yZgzRM@cr;*PJK23aX<8wQoJNVprHabtb_{HUCo3>s$x~J%a zqc>W#Ytg<%KNkI2^lQ<-1soRe%t3#QGXBZzN$t=Iah1k*=_tmaHF-4Om&k?(?z9#S zE`~97;bJ7;!bKt9!o@J15jbl?Yub-H8J_;bcIcXYw=>9nt?Z3^zREqAhK{M{_W1$N zx_G}0IJ|beb@2@KB`5T3&goxwS{Gi7^4sv;C)_f&yDuQ`%@%*%_Pk%mYwtnID!w4I z`P|Zs`0F=v(P7NLj5VOYOg0>A-$vPTi&ODbaM`{l3}qL6BX! zRNs`fzwfUn?_S2vUx_bsha~IyWVc+$eSW!0_fE!^U$X8fcdEOFQ)~S)p3gzz7vdo| zo3@mfP<_Vl^~-tpF-D(OIdTiq=McACWQ||WyN}U&N^AYQu@vRr<}6?BWmfs+;_h9H z?HkqJZKl0FZn@Mwe!0k7j*m>@Nws&IX)l0}@N6_$Fq;({w(oq$ugC9`Y=Yk z_}HHdM($<;#_5z1f7>GdhTN(7kMf&yQgcs>{6Q&ab;gS&~r$+_ZPqbAL!=++gRH}K6B_^ zGSMgKs)B17{8loWeXEZrPwwdaiD+Y)D|c{jz;%)hv{&pKN45Kkshojj-Oa|FANrm} z$7blAu}g2y<4njq0}GcsIY^NGXX9^BCpr+{T+X-lW1XK%7jtN%AiZK6FmYbdVDuR0 z{pJ0%Q;=THd+BNxvTm{v+1-`NDv4(=rCiCo(+?_-_44jS`c>V?jXrLYN4w{X>qJBM z$L8g>EWTFwyTLCLKguc7`F-J!e7cnRCS@|{^x1hnG5r{P`Eu=E;riDkbGIr-a1kiVUL0%35; z+3%tavj6=$w8$cVa?$O9Mf0HbZrM0E)0Dp)Hp_)wJS%D>4?TWgwTxSNbCL_<%ES0r z(ed`8`RJ;i&tPhikIR1h;N6!v=Lq;-?n1UqEk4h&n^fc5a(1ctEx+hZ;QIM%p$Tju zq7~MZxd+aR59QowrSP2mmfwd*?=|1koMJbo4fy~Dp!aXH{v2KYK$`dB&HQ|Kz4 z*R>B6f7Um-a-rXk?qU#+EWZ5`R8TWde1U#*9lPx>Y&zwY;u;l2fptL9eWkGm`wliKm>OJ{k7Tv)1`;XG37oeRW_ z?`P%ZemkB&X7SBhH{`RUogYw6u&h17$454;uK*_L62e9G(#Vo~KQB4OSr_}`t)8;t z11g(Rd^-0cg^)o!yk)-X!(#u_8B=@xzIe-g&Bxp3h>JI?A+{A*FL%e3y6nJq5;qDr zFH`4r`;Ohd#2`$NEZB5Hd*Dl5H0vJKKuAqXC2EnHwym#SLBJZLBU0r6T>r( zGpx{Htu?2vLqj9eKXdEU5O-z|8fEe!KZUPJhJLq@ucekbAP>#Zdq3@)#2u*3kK%`5 z^0aVHn4PEPU#Wfbv;@f0Qgh;zCdDhsFJx>J_KM)B!Dj;V7UoO%Z<((-ptdA@pU&6Hwiazaar2F|Tq@a| zdry?(0=-@_^T{cGxwxCNv1YE;7sw>5NIdN@IEp zpYH*hp9y{+*k`6VHcvkXVo&wdexEXpB{4(&e?QgEJ z5|}Jx!>(L%sgq;MvlA%4@Avx9yLlHpEvGp&#n<`uu90``dRJyQho<^^wcah~o&28i zXE=Ax$foD;9dCX|rq{W+P&sf>7eA6a)pM4cSmbAs9lbeDjrDQk&2eJtzH=NI=g;x- z_uVxaA_p_~lY=ZW^mhw11~5 zCz=u6W=8wv;x65^pQHBfHsx?qHsw-)wX`jQu<>3qH?&K3QW}W^|&zQZ7E+FXQp5=;82yO6KksPygRGOgix6noiY za|0`{>#|yxBGb!1_d1^I_iM<|J;A~z$9_Iyzr2!p=?~s=Z0I^KLEkU6xeudgRMFxn zwy~w?*!jmq@45kBz3X#j!yL1t0=eqmkl-4XKGuZ`ACkv(Zn@Rf)vm~b>ki;r@{ZMd z1F$HUQ7Y`?E#lH!;v~@#Ikrr^T7LR7?;^FttRe_a%1-JM~ zEf#&s2iyB^>`x#1?Rffl=Wy`~^0pY7AC*1^n%A28Pd?ZOJG+x_fft7>+Umj<7KOKY z`jTWF*_HM`_xcMqOz}JW9|wW&D20s|3mfft=0WwC7gBXJV z*KkZv-?LU}A2IXh{IY@HWmf67GUu$<;h7`SSNMlYsgu#Z70*@LMHUrgLs7{R;aO_AsyAOK6vKB-3v4uYS7`Z~y<4cJU8=584?HO{^o9 zA;NcZh1HfKzqrN{&hhn?t;o&$%Ld+=-nI=Ee8+_W+VWtS3=9c(Z1F$)FnDqG(NE@} zYup#hFt$M8nn!duK|_~xJg2SYz~i+wp0E>n zIuUH%jE@cGJiZ_%QL4qLozF^tvQ^b}RMD0)-3L6e)Z$=iW+bsQcW~b5#zv>s zW5<{lT2zkQl3HKUOMj2GuAgrDBQ|Sx7FtA<&0@k7x>wb)xSg6qtaK>XOtK-^;!7~zfaq}+phTUTBrC0 z(Ptg~rI@cIGEIv4vY8)yS#?i}SkU`;C%*-MpB|N-qqf%V=5qa$17 z<)+=;SM{wH9ZFA@44@d%e-6a&-lgw?dq>WkMcgqqh9X!I#FQb5yTx5MCk~{?5 zJ&g9Wx^w)EobDa6kIZouqE*)a4src3z4jt0YGTNzv4jo&~f#*1rp+~hFaq}uA zHqWWr%Dp9CK8?Gsc6_n!1MiBbOsya`4j!wq77?##fy+vGv-W{j_&KP-$||UX{}#Bd`h&|NM1%OZ!@x% z;;2oSJfqIqMw(cPU3>dhkNTc74%Wyd$@ij-l;e;TWW&KRNfV<48qnwb^nfF4E9uFi3fVr!)fIEKvLYZtDFMfDV zmHjMvnB4nZEAKq_YRP7bcN%wzOXJiNJnO#2orkQKeAY`1{8n&@?}ez(eiOTaJ8M07 z&GR*DW8J-k+q}o%;A^z0a}LMOaNu1?-aSbF>3;T)Lxa$D1|ka%Ko-nN ze~L`l!#a~sqG;erF;K+^asp6|HG`eT>Lh6U?2J&pCgAy+a9LQ`%e#O?fq#^ zYZLYU@l*G{b;Z;3zxJkcPZ7>5K6LP;JZ#+t_xGFr^T3m%{~rF1a)(}&6M8f{XCihS zpSQ6wyaNrt%bLNzV5PW{r5rUFME4t=q%h!M6+C$zT0laQ!K`-s8&O z!t-1UpBH5Ix4^dzUlYG|V|%Sp~d%OP~Vd60+Pw0`*46*_@O55 zckoA{F~l5Lla=Q{zr`b`5nCpHR~oXLdQY@^SBC5t^j`03#h-z}#&#XQBii;D@^@Jv zZ^yV(SFTNwgJCnzM{^JB_K%C&W zvda-0u%niDDw{w*RK01)M0xO_+1$Bh@a@um=Xc$`8a}pFJ{Ps;8lE72&~=JKqXFub zQ}4$Ajir5=gAX_k@Vz=_^}7d6ME*!6N04!n}+m>af~CwxX#f2 zCz|l=>&r#6%?1Yf8LTwC#L2xNKBe{4vdqy*#0Ny*0pOKh(nwjIQz(Z3`~Az36VRs~ z$5w3Wb=J?RT6RLQxeM(k%1Zv!7}dY+=Im*|X--up813D{C-akF>z-}M)-?{EF7I-9 z=+5stIq?D(wk-M{2d=z*qzGM+{$^|ctY;r}LJjF8DIg zhv=023@>P&wZ@dIp;j~k{*W0B{%r87J1C@UtGs@j@%Q#UuJzg7)A!g4Vj^05`erNU z@J#Zo*0RpZ9!Cyk%}LHtOkXi;M0gG4C|0a6{q5O-mGWm2-aD@q@8qmi_-1ZSHuxT$ zmT!nxPj=2Vv*Zt#XZkm5D^U1CyuzVhJ5bmp`qtd9H*(aWeb7I4?Et-5JYVNvBRT6> zXTgiG2^6|Eflc7t%W*aqnO9?90o>KdgW@f5Z=EAc`TR6LeFyu6_6gxSeu2ZUWcy4W z;hfP#zojwX7MsVI6+5ClJK6et+|}o6jXpnW;b!`-b@lmL^g~CVA7%9UxY6fJjXtk> z(&yvo^L6O+b?EbzMr(Rr2s=w;@x zo^tbzUhU-4T~1v`x6V(m`YZYD!N26bZuFX3$|hVpOeX4&!IOL1FPEIQJeCCRfXUrf zkiL7r^(8v3M2E^~PF-6}9Q?&yTTDF57Q^0{*P;D~_~=dG&C_LMZ`3$NAI=)x_pDZV zKs?);M=uqW_s@d!)76Zv#kCtG&-BOQ*~4nSk~J1=6rGB{%moFDz=IHT~58~(e zdi>?PrVP=#3ncC|^k;vwZ?))8a;4;D>G6BGyVc`8(&N>~W^~-;&^c$YX3x@E^yXtC zFn7B2o|)vsVt?$~SLPt^U^ggX4jP#Q`LeB}P3Yk+$w?iwUBd4O{7Co{uaS-=9i#(3 zD*Anbwf!JBRN!UHS~RLUMTYRG7VM1VlD|+|~WkXi%XoZ#*!0T<|Lq_a9_wH0MuW9h!8(wM3wI0WB@`VX*42ccD%(eRN zswNIEY<+gu$YqUd=YZpm&u(}nj;*BqpEtZR3|OU)%tnT23U;}oK*SDoiU9qanrikJ1JZdN&aj9<>P5!ZY{<<`c$+;vy79=&m54={1D@{@!zaWi_)u@NqaRA2P)w@(gXt z&Sh^ZZc54iguKa~F)5WR9zSYFB{bQBK3a}{!RuPPtP$<4dOs#Gx~b(uWKHPiBj(12 z?pxO5YZtVeR^U6lfPG=YOsmeuU#cja^FcZEi_YI<-)l9GVs7L!cN5>x?aT7fcpY2o zZuIQbQT|*dU0-eMRL#|0v2w=i%~yc=+6^oVsjK#-M?`2_>m%|2eFm($Z!L3t>LWwI z|5=J94>apu^?B6Q-L4vY27D^#na--)fPZ5;r}>p99NAELsW`0fmG40(=T0rGovjV{ zia{U8L92@QiR1GyhTLnP5C^07)^Yz%1-g;+Oj}L_TWcnac@7C2!(y0gn&h*EYVZ&+JJ$=bFp>YEHDi z{=Cw$XT8FA2lJwsdV6f~V7t_s$@$)*LUMmdjuieQ0e`-{eLpc?d*xlRO6DtYvV36* z)AuX{=g{5O|AOY+ySy4tx}e{GPjZ0H+V?KKj5T&CYi%xTu8OsH2|f>V$Q3xqtV#8m z+4}Vfw5g$ zVEvmI3Gu#;;d82TDT6+1$^?JbSg1CYJ9s#BkO4on^bKBS*3!4$?Oj^Vyl*ypy$jb& z!L{HbM^=!{WAD;j@?&srDE>Oi<*yAzJzEE3yZdOWp^47<>?y4Gok#9nogywsWv3Nn z(HVSV@6zeWgUoQ$CU1NhIk(p{7oM-Ng`RRRdsqTqC-{ZuM%H^|6!{4F z9zMdcxjOjw$KsuXXWq@iVV^6XR zxP2vVHv7xCL-h3^eX)PA9|zfwL)eXSj2y1}^Ser{m>SE(EIX%1NsXoH@e&3RQludIQ?bDSG2MBPx8jFjsNP~%O$eR?N4^N?EX2= zFuI~(xJxjEl+%1)802fS9UPK>IUOE@>_{BaxFZ+Tg?==(SA5{*UvMAeLGqD&?852A zre)1R?9!JUUxpUNkv)&TpL5C-of9iJ;#k&jzaJ6sc{u@qkv#0&VL^;Wa{bg^@nGHC z;g#Lad+)A`4V-65mX&{2a@^F7*gYmD$AvaZ#*A$7>8!)eB@})CV%GKd%^baE=t+Jw z{yOpejw*la*Ufl&^50Y4TMga+n|;jaIKT1B^~Wi7s~q{4Ss(9E?r^zF_AbT}SZ3CraH=uKf902pyZ*n4 zts3*)X3V1h1h_qp^4rF1tw>hRXKfawf3TS`a9-#6EZe{E+rqZy#Cg4?wr(+fdgqeg zq&@X5xv$Ik>*>xR`JRy%%+N!gx%;HZ9S^aZlOt_@+vw3#q#GT~=ZX0-@{9OR^o@)0 z6~4uhkFbkK&p#N=?_|Du4xsxS;2B`%>i$2<*9l*7bB~b|TV!(K7+8@B`QD%I{yo5n zn~Xo|!|mxriB~lbw0rPeIfwHr?F)^1N#_r{fK&cI8iR5(YY*txkKUN! z=tm8OJ$<7sbH+M`l0V`A7Cc_xW=6(!>O0FWMI` zyXGb5opMpC3_6ALJ;43e{;B8epW0KytbwrJ@!LjztEBz@I%D0k_!gKtTdmS0XZfDJ z{rfK6r+)0ui#^<-RqJ`tYNDU+H^=){lMv6W6ZEl3_K*BJo*rD&p}D-p=)uB40k*A< z4SqRq&WnGmwpaDH{UB`Q%_Mj6DM+|ClBCT18tUG0o|{d&fGg^%^~WXj33I~^s$pZrqiF-W^wz)Rmsgx zo0UKI+YB!B_Wk=!o5$_fW&?E!XjAr5jctpookA z=}BQPt~`pk{B1cK`+j28#aH>b&v^K0ySS>7v1W*+i9?^VF{ak}W9s^vH>NwxnEv(O z4xTc=C0R#nrGonM8~ziva;={zH2U~&x$~gmQX?yO|7u3RPBzx)WZY988pS?-a9?!U z1vPG+V+arB$k+IdneqPt8oBaIj<4XM{R9WV6a4riFRzwzFB@A)gN02bagOx%D+}Cx zm_1vvQNUVG{Q2_OhWqeg;%tqaXYM{An@N893T%?1{U~~NCwH&qpTS-?h#betsg6$n z=aBPWIn;B%8pVAZ|Czbbx-k0jdxLUcC>vp&F&!T&?th#e{<)rG=Xi*6l&@sG-Gj*G zMH%!MQ|4~qA_s!uQME3Q(ixwf%$iFt-^_zrpQ~M7J3Rd&^cNA`-kMdG{p1yRifDQ) z?>cVr-=(~LtX1vY-`~#DwBwzvMN?X<_+GJQJRRdv-U}zv-!Dd{ly9Tm;J54Xg_<9$ zZiCUMwb%ZLdcvXTrR2Ag$F1h+YxS-D?!cVs_=lSPPJO9tnOk<(3|F6pp6CQ;BsN!d3TgPC0G%07_Y4wc4wjg>b-gfiZ z#SP@3fo_VS8{1w`7e0c|IYUn4yriu%NpAJdmRRJ(K*{uKY%KM`lE`SDU3=`XlF?S% zmZzd^tldT3gVq)1M%Tr1KYL~|_T=11V9aUuk)tO@ROX-2w%jl9ZnyKUjF`@FG!e_y zhdlG#xm5@sn4q#%w>Wox1d)l$Z{>VSXU0=G-!20F-|#)&YI_ZNDjy$2$)20Y?`en7 zD`!}B#TSud=WJ_nf^}#wDVh~Lr~WQS56Vw}3O?J(8ztMGeXT!#mDAmLq&1qq#@GYF zmc=uI(4gC98ExLn{?swCqO=28I#xw>X8(A{t!B@vOFgQ!*_KSeCN6F-7UJk-M}~AgO4`LXjAY_dGBJQ17@&q#KFyGe2%#9 zs{byxn}9>_yl3DyrdWt#+t9=1R+WP%rhrv=JdZW;8vR_t z*_h_yYX_;{o>kwQi#61@!p>Zz;{I4O=eYa#ZJG;mbubqhd~H3SqPbT%Wh3}`#97Y; zi8Zl}l(}?(_3znzU+mp^XW!~oiygg~IDyvS9LFwcbS}zjZol&l<0EB!VxrUugo>Se z=Bk}N;$!v*-7OdVyt6kfp!_xLoqwZk)@85OukmZjx?Ao`dqi7Sp8S5W>%3gOaNqmi zo`mk=^Zaq9COhM7zgcs-&cO9B^$pE|`!aB^IW4IsUj@G06Nqd3+-1?aNa%>BGVeen6h#LxWWYIkw}Sb4!sk z7unXWu}mmgSVB7`wBzxh)wEF<&KoA0Ze?s|>OK-H_<@a`EDT?;Pf4yVS!mTouEJhV zo3de$gv>V~hi>b4Gd*4A?V z|B-TLypyB7IB1!*^<59gOX;KD>BGW?>a9(0ZEd11v3-Wmb$rRku|3|waq%MQQn$uB zSPQZ>4*}0w%kc~RvZ=8yeO{GSHn8ZC0p6SdLm4m_7?J0vxV-pl9*hmZ$UR}gL(4&U z@fu+4ba`>A((gBOjMK06&8&V0EPmu&aBT2PyJfU%`sGZ;>o@B4%bjM$cOJUm>$CdJ zoa^@+DRk*Cp4IQ^QSOy;`=#A7+Eu^B@W9RELd~0)r)T*@==(M9f%ITG#)IW2!1Cas zVYws=mSoh2rDKExOXvJ7Sk8$y|JZ|tcFSm2uxL+0f10WNGy}cWK2hFQQfN)$yx-ih z(J{HAG&Rau2jRLQX1{)oIwWhJWDQEhel*?5-4v%DzE(3!bRR+3a`NIFPfP>j%PqD_ zi;l3`%wAp0opD_kntf(EdQf~uQzcPvWt6-u!~vv z)2yH`(V1c&q$~gT7vULhS*?vW%K!Ppsih;ZLs;aWzR86x2@JLiL$cH9yC`avO0Q+@ z^^Q1~-)=i8wXrJNdph)}@m-lUzS`Hz+ZJ>UY&Nn=XvNxn##U^`SvUQSeaAL}u@y14 z@P1>vgMI|##cunR$ebRGf-U)`(~bwD;JXH#Xz!?Z>z?n{?dUqUw1oQL(BN71x488= z%ho+Ty*6W1-K*WYQ@nBQ*RTD)+b?xg{_B)CJTQ=B_+R9jXk8<8vjW~Tp*FJ7*~{|M znRaJCS1zr7-W0If#4l4P`LyZDy4FS7x6my^vU}vG-}}0+57o}`^`Ua^Ru&K4yYwr_ zs+S?NUW)8G7a6vSGpb8k`=&Z)R9gz8y{-Qw7a25a2W$sc<~{y{K-*^Cc`{3gJ83Vt z-oKMJx&Gp+4)z1@eZNd|lrPhiQr_^6pRyhwb=G5NmQ3QwG}o+ga4?NA6DQZ^;BBaZ z#hd|yPwX5oODM@)*AO;4`w$svEb#suLfsp)KXI(Hf2OzNkF9Xv4es zJrLUxp^TnIHVoLPyXUkf?kRR~oC@L#h@bZ)@@jqrf1WeI`eXZNx-0FD*jD}v*LMon zluM!G>RlW@XrD^1?7tt~-17xL8Z2n4=ANMS@}rXt zdQ`NnmN}Yme6*GG$QO153ty-wN9+>p&^qIGd?yqqU63Z&YjvEmVeI_6KS*{u{kQpF zOIszhr5GFC{iE^71}MJ%b$t9~KNz#8Z<6VA=J}=e2x}NN!A0fd=TlkjoyFKF(E+9i zR@1J=7qCi4Gq#tQf0Y~Sws{e4$|q_M`j>nmvfov@@AmI&t2xJT`WirAs-MWg{ye~^ zy||aJA|l%3&L7s8{AXt)Kj~X_QX#*5KmR*X>RaHeZ>n~f_%!w)WY)>?PqW}~&u!X|b>YBXA~-rPcVctG zk_~95WZ8Qg!!xmUad$xY80ZFn7~Mgm9Ox%;4~@+;`9}|~EjdH@7Oh8m4(ul}+Qm2h z$hLAJ_!iujw zpW5OP8VhGK%$;|RQpk8>)Kfbt=xE&-M}CuBAissM_IbsuvHtQoH`jM)l=D5ZlsGW{ z51;0Io0vTQhsWwnK7WUNa^S=;1% z!KYq6QpKN=Uoew3_pS}MWw7wYS+iMd1?fLPV>V;am|jK4)A@zNCx)lbbK81?xzv3| zMWMol33#92+yze)Zi@B>TlsJ9p=)7JN=-Pgt&%f=_;$bV4$po(2>bf|PVAF%F;)J{ z@w=3bJ^0WRLkocf{`$aHGY{Pk{Zlq$$sr-?>3p!Pr*HL~rqEE$<79N6l=$#h%iEA! z4D4Qc*_iXOuO2EVsh6LzZ|VT(c?fdUP~@p$$W_C!0p?)?9MEj;x5MsNnd{m8M)&j) z@8IPlEg^p;JbU4Wi0)}~a(c)I$2%k5x&dFUyRGIg{-$qr{jm-Ws?AdLzSM@mOVe1> ztqr3#PUBhYv!j-D=R*(kte)-@u?KGDoRjw%>~jUI^9W^9&*m>d_NohykJho@4CcEn z_uqHLo@X6H3kzj4w8K0vv4*xbSwmGnBOGzgZQqzXtLR#5(R}9V+pjtElME8$ zLEDX{jmUy!`0K@k+$}`@v9bKdAFvtcdh%f~rN~sdgeabrGLBD>7$f)^5LMp z{`jb9&+Mwq-`zRJ4|Cj4yg9x#_5l68TSIIf^|m$0Ztk2PF6aMt=FU6&-p(0F=g~b= z);G-ExB;Ab<+97XK^gIOmHP|(_=fSp{&Ji5YwwS4dtN&g>K|IpZtu60v4)V#3S5Wa zi(c96GQXls&Cs4Hp{YLXYAd_UA_P zYO;I>gqQu{{JvYaW;n7UI_S3f!G1jMKkmCI+fGhvV&2Fz=a-Z3T{g@~%2`M3J1+H| zU8dgammGnjkF9T5&Fj%gcZyE9n>P7e*4lS-;}8#~FJu@1%-c(bfIb2s;8QLh{O zV8@FtjUZoNe(#ho7qRAQppC1bC*j84?6+5Wq@&N*ygl2oFVo(9%4OR9G7&G{V!Qfm zjHT2kd8y~R?IoY_%XYYVpF6u~FFLmmz1C>j#kC-r`42am&V^^2?^&Gn@7|HJ;lH4u6M?BHTpU z{Bm(GAJpHn+8l7rBco|E^Q2!c;-1|^-w=Fvnp`}YC$iqVa$NNFtaipmr90=P9{0=j z%Wr=b?yxh0JH-;53GYr3>#2FH?VRqP=NWpIj5ZrSI}3grgYV8nfBiDL>i{EPEIXg` zy3pbCg73yxME5Pr_t}f}~_`lwI&+?HAW{IJ#qmXY$9{YR(iLzvgjfO^smf zkH(jY`%|IoD0*f@XJ`+cZ}RKR2jXjYoc$@b<2c$BAA1L!Ji>XWTW)glK_7=ncWyg>uen$qJ02XXTs-ZU@#eMtMU`0* z8{?L#Z1u}jx^vp{JC(WJ#CrD)CttdO)4vp3~|W4|qLUZc-zUhj!* zHS;<={Tyr3kqr;bcbuK$TX`(;=WOi?1t$zZ_LE#7)H@HCozG}qZjJ>4j?BFXTBGcqWbtRfQwbx?SJUnZ+@=#cgODF9Wh<#hzGlG+c`64{q>$Myftul{i9a1 zxf9-^99;4N*up!`_)GPhyQj=|*jgr^o;p2)p3V0N^dj^B7{`uj zaz#PA3ussVO⁡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

L1JOzS-HfE`ypH6d0fpV%hlK9s*t^UyTf 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 z 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 literal 0 HcmV?d00001 diff --git a/mssql_python/libs/macos/lib/libodbccr.2.dylib b/mssql_python/libs/macos/lib/libodbccr.2.dylib new file mode 100755 index 0000000000000000000000000000000000000000..c5443e36cba5cb8c6eb8a7803b4b45710a9b7b44 GIT binary patch literal 71280 zcmeHw3w%`7x$n1UCSei+1Tws7GeM99k!KK8Fp~!%JVXcqskTmD0~rz$l1zYr%AnX2 z47QG?_IH2x z+~3~6?CkZewZ65!^pPC5)>W&a5}3>*Skv#o$k_=We5yU?~F<>Rwcr8XnDia<9cls>13ql zq&m}YTeMWxu2;o$sAm{$hBx1wHfxB}xvH$QluY-W-cH07msj#DO6c6cAc1Fh+`6W> z6a0L6Tb@=Cq{V^@LBltE42a zVp0c0QzuTFIAv-mQsFppx?F!9>6#dUzSJFefa@tMD+wl6;wdbdIHLn}PG@FlI@AYL zADUEESrKG$qsgud6QDcaT-1Wrg>PwfrN^~qVp>OLNcmdajL(MsL~HR(QZ&~mU*Eya z;dO5ly~71GE&~Ar0RsU80RsU80RsU80RsU80RsU80RsU80RsU80RsU80RsU80RsU8 z0RsU80RsU80RsU80RsU80RsU80RsU80RsU80RsU80RsU80RsU80RsU80RsU80RsU8 z0RsU80RsU80RsU80RsU80RsU8f&VKAv^igB`0948;oNPehD)2w4VPXa-{i*y&1m#>Xn;UmVI|6p{W@`!F?EHST!)~UguMpSvAvJ94?+DaH zIvT7?9Dx?|;KrloA&m_Y)MO^_A<|L~Uq@uCL7Z(SM_`PKbHr>zytu{#NQdKH+LR7? z(jZrAL!0x}dN0KvuKBJb06@-=J>F-*bL-l8-~N8yY!l=FPd2ArGXil6#`&TKWCX4m zp5;$9iExqcx%OSz-diXxJnd$)^KiHy=f~-t%=F@QR z#oZHrUje@_6@EjlomdS8ANJEXak_)wr-laLP;UZO<&FSj@P>(+P#z(#4LH>Y%lvd_ znG>SBmbo5fZpk0#JJG*;na`ulQAmf&BI;6=#e=e72fVEXd43&3JL+_B`Reu;Q4bpQ z0=jWO>jmmK!x2bE8N86)LDX~#{Ewk7IjvT>&!Ntzx3}-xoJpuJZ}z24X-Fd#b@@s? zWBpCp9~v&M(onA^_?Z!ALHZF5m(n$)AJG^vTcCU9M#k_0Flj>VtBI278epY4 z0+D+euc1P>jv?RU=HZQ>Kz}Z6nuGK*kZwBCPeVSb4d0Z#R^N>J9C3}wciudraUW#e z2f6E`9sYQ2Xz`Zz_MCWNA@n)QoBdmq0bBT+7_XsL^3O9vS5e-?C>ejXMmZbYOmU5^8tsdQTql4nW1j@< zQ-JH3fy*v3#(BWL0d>n*GtN=KmhDeEWNsGvt)m;zNwQ15vL1x}0M@PJ91WD{XyE#t zf7TIb9Y+mZ2f=vSl2q8g_`~OJ`xA5*?IT^bjfXU}@6j?XtvoewX;Uin@#T7sduh{4 z4VTR1!x0O~!F2lgIL`k17KG=wwo8-=wP_rslTSVn#MR9 zxZaZvrUqKgRBhK%4zqn`nS;1neVKtHH`@Yk!&c6T1tFsG^Y@MBddh6`G6I*BJezJA;1jMO5I4@9)KB*Wy#h}-KK8<$2 zU5l>uYR$8A!Q+j<6Y;%Kc!Jm44^O1Sc@_JY`h)q^`s4goP1}0}dQyb+xIUt89OxH1 zJte{y?Xw1=sui8u#}~a9w7(CBKRbWQL|^nlb0F$QMQhg~zBv$IZSu!Y(E>$BGce|$ zfaj+Yei#W_LfvN1jh;om=|lfTZCa+rCGz-tZ}n>53p`_AF0 zw^p=8w$Ch++eFpeN3$FKbv23h(zP!Q*B90mE1?|kK`-{E!IpK7VGf`TvpzI1_NdF% zu$A-ibfE52p$loyg>>k`HK@DMsK*4EBelkHd~&?Z5B4a(~d^^(gMvCFY00o+GL`|(O@2!9>|4XFpW?fdmnU< z$EI1$4u6e_rWc_;qF@gar=$l!H|3*D;5!7{bBOH{k6}~6vkm?nryg;(fQRF-{R`S> zf=u2R9;--u&9W!%ofpUhUw-t<)w!qx#*%H#0oa7$6bT-CbC}Yt@j89)&Ovo?3wZg?a8_{%r6s zm+4hAy&Uu%lCEO<4$yZ=x}52|sH0C~jKXDa`Gh7>5nYOZpZr=I`5BMgjT9)##GC*! zG987nQi`S(zXg1vFa}7{sFucBlk5rPuu=6BYfyvAGY>$2wCgzAJt}E44EMt*K5Q5-)|d_@c9Vm@q<%~I;BNZ zj%>dv!QK!Cw zjjcug&CusW)Tx{2hhbwo^!sPh_DuD0yVR>Y5hrV!5A9df2iwCvNV7SLcC?$dgW>bk zbFc-$K9Uy7`N->to1?YO@J7qK+n)%XQ$lv#u|;s~V=Ye?_L^r+0GPgbOheG*YT)!Pt;GjZL9}2 z%^D?Np}yWpJ21_+jO+9RhrhKCB|io`ngcrbhl?5tkmhKl<3u_r*V#NP<=T&otC)D(1HTON^ZvC(I+O*8|t*BB`kjn6~nG;+}in<**aLl`%Pjavg=teHFGR zfbB_?E83mZW&^fG!1e^NO$4^lz_t}Q^~E@kak>a>w*gx_XpF~f+ki?8k9BM}@+&$l``x0$C)$4eetK@L(Im;~ie3 zLAw}~g!abcM~p{u(6Jr84n6xfkxkQd7{2lk8 z0cmp@n=exreoh-$2pa|4I(%brHfk%njJiSCLin-0yEy)$*)%@YZ0p;CHo;@L7f|-w(dV>mOy0ouC<}Z%FG?}n zPVLA1md6LY*2uQ`_a^e6!#aN@;-5o*%IoEqHuc>9p1a(h%yw=!(r5x-9qRW{%wNty z{@|Kl6xPg7aDNAxk3rVs7%z`SKD_?5^)lvzI_q?Kk)3S>a$#;F*UN(G^13+I)H>D^ zHHa&La!sC!UjYADLpO^4-w) znj!GVc)_Z9{c&1cEw}3$o%ve#GIm`{(Bn(M+GNmvZ0(=fz;h!xZjWn}T)d{(FaT@#>CM&840Qzd6kv@p+0pPD%$t65Ha+lJI#r(aJUkEVzz_0r-34W3d@*Ou*@rdom!he>8Ey3?$gm&JT$F>y>|72j>d6Y;aCuq2 zB}&eEC1)z+(jhxguWoH7qMR8X|ldfjUB4g4?_on8MxD`@S#HuDOhi zGsgQ(JT`m$Weww(A&oPUuhl}n`290ZxlyJIm|yX{^9aJY?;eNnmsZc1si)`DMcsGm z`lF~bFVY?jzFe#ea$2EtO@3d>wl$c?AjHF(Kz1c;(s|gVE4_b0`j;I57DHWkTLQ9~pZMd3Y;8*ArLOVR`LFi(ntt!(H68wJ^Ftk5U)nXp;Yi_#s{+@Bvo z`}Uwe+=xDpbw&e*7tnUOOssRRZp%4ka7{BP)2 zf8|WFYEgZ)2wK8v@tAWM(mDsX_eZI1&8X90x3666IFpbB1 ztV;Qg(>k4Ul7LxK!ht7GY7ZQW{?VQ<=EpaGk)lPP%$=$~zT1Mi@OJ2~z=(ATHlQb+ z;dVy8gHew$6-mG|drslb>g)Bpm!th+9*BA?9y4&kM!YZ2IfeJK?tZCltFs*eTLc}COm_ZegPtu|IMeqU^7@cyI_E9q{A`AhoBi4E2za<0FM}3!hjv_V zLB9nYPE2z6ld!(N`nU5NGOEvQa3Rn1rOnl=?{Wk(LC;0|nGYLrD$Wr&If)t)X49b2 zC=25?8o0rBb(d+>Oy6!Dnb<#6rk{fzh4hB7e!$Lz%9O@(K(2JiQ3$zMra5qDLME2u zQ^>?}e53UBDa>U#tyYwY-x;(5_aNqXKxgkbhxU!94fd-E@3vZz&Is60mS-2_IEr+R zz}kUz87j2Qo-{C?81F)7s7Z$?E>?iLm&52 z4|d_`&9DpLWxEn;7kCWBb|Gj3xLiRSfcaLy$F@;te4QFHhj2csm0ti}ybcsz=A-D( z!sQOPg`s6`?MF>V!1MT3mwAXNvpoj&!?G${*jt%-ZJFm+yykH=WyHFojr*8H^f6K1 z`wk^h^B3`2)JZ#R@H*~i(Wf6Uk)P*!Rjut!HF(yeuXO-JYZ<<+=||x{kZ}zT7T`&#f?XE`>Q*T)Ra&!jt2)w=NQ48uXs7F|{ z2wX;)!^`k(+rr4t^(Tg$||6GL^rDdf4?_Dt{aElx;U@OHu~I zmSNpWe#3B6x9@fm!Iz5sb}cuRPhg%j(~^`Z^!Q15vO&iH+u}8cI1t<%BIc0 zqZW7or|iVOSO>zK;#G`uShgB`Q#6u!vVJDsxwg*xS@vMiyM9OId5j^xALH*Hte78J z_s)T>mEUm+TMWEw7>`V}T|B4poDJh1tM=WgJV$Ls`iylAo}4%G^@qNDO|)VC8Q;0p zgIA1G=H29bFzlN+YnH>$-!Abygypo3arlShN$Pv9h=X(F{B5zrAIIT24!@9hg+si9 zvD)zdgZ+o0p7}Y`;YVJaUVz^ZT9X~(dnM~+tY?t?X41M4V_G6V%glNcl(RJ`=P!GZ zQ_02Obq(coAvfd5aBa*($#$Af(0yO6&_uFy3F@m+z!#5yoj z^p#w{MXzNhaR! zqireKOy!vYM=0$JqxW{D%?C3DUg7Hv!FI|0Rq(xVs)=?i#e3mg^jCA?=6OP$crP4> z_rkWuIq>^<{xtPo*w)B#IJ{1k(|i`+l_~uWmW97*&4s*I#BJbQIW|FiU>)fVH}1Q_ zzf=3@LU;Un%CpNia#QC1Q@)XV=_>OM)}eLDKVIIaddM@FzPWsEAnk6)ql`Ph?>Yb* z4qMb@eb0+^Wa4joM7s>eH~HoYonn2n?429%G9TRLgL8Y-9sXvB+lw=Xrffld@w(#c z_*M^dg~nX0yTs4K_oeV>UC4+1+l4S2@?`sS9%~;Q$C*Xt{7&6#YMxy)+EHz_Q#It8 zy*b)+qu!W;`(5sfgKL`j1u)xFSS#Xu{#E5s^z!uD`2E_AEK{fshW2yFNA`QFO}$-{jkY3i})LWxKpE1rW&0wws-Qp8HbJE^^^c!9IiCkip6rSS(5A?NLd>X6vktvrJaDjXL3)__kTTU*hjb z*rjjN$6)%(9g7@zEH-8=W922>!-OKrg`MQ1^Getav^&pO&9(N$@WCd*mM- zbPuKgzt<7|!znN-=uV)(@SuA-1$Z7R;!L4{=vP?oTgi_#JsZol1vrcFu_XGHsNMLU z7T+KczSXhf8*IMCw~5S$H4wX&a@Y=c_wd8nL;r9e*vqW?X#o0VVtA7 zk=MQ|6}DH zewBH4=@ZNUIpw{0zB|^1KJV7alc!Kfgr%M} z9t2CD^s>@YR{_&Oe&y3a&naEk;g)H4kepHnA;Xq>3fU(Ozg3%FRuXhB&a22<(}i$( zTouBjqHKMoDW{*19V4JZ}7gE=NhvD=lz|q|!^u5VxwLvP|$IgH#WGwKu=Y z;}Q`=XvtYtQnjXZafN%GyTrB172>CyqU@4&ZFPpLQlOBL=gC`IR#j0T8Q2?nKt>@$ zknAW@hPx6!9LgYaLK(=+RS{Ai=^^r)Q(Bl)kypymMBNC-23J9byFzi#0i_BvXM@L8 zTIedwba@JjIA&MJ(t?Vz5+P7#S%u5Js&s*?T4a)0;c}@eV`pcLF%_&Zc8AC~*X2fvg1UlO#5M|1pw<#ALFINIBJOUBT$L0*Y)`WmSnsK(Poqw9d7(T)?!bYK^Ee8B(=I z#zUnF4-phBj38ttGO)t6Hm^by8M?G4ucA5#_Tq}N0#{*G1uF+MO~qDzlB(*!D7$QZ zdRbMeP?M$I5byNqEFSxHK^z`kU{3R$+H3o1n@cjImPKg)q-mE>EFqk)ki) zYV8ie?OAiO=a4;hQ3lzSdu*kB-ctLbWeXRQ9q!ro6#VA$fMElMii-x)K?!-**#ni-6IiG29ma@IR6I(^#57w<73v!h2I(DO1x@ z$z+L)j*09a85tQn$cF!sLn4Qb_>Lu#tTFwq$jfStCH%7vvf73WCv#Nn;9;?&Vq;_D zM^D55*s-yR*G)7>#>5R9i2-_CTwMHQ{EHhMH#YG){^e#OjP1p*KVzIME`DO2j4uBGXzE zMOv^ZH!Fg)q6ji?#bOgame98MArlYo>!L{;)sOnr_a{@y0MgzcKoQnBGCdqe5#L8C z6GxD#bp&a6fn^$o1-Z%JAfAs{eg2uQ@Jh5gdo`b~GuH?ZleQ#h7ukihQ{;B$; zk>8U4gam-b3I565vSxkg{3Z5o!KB#f1|9yV)2_@vPbHbI!(Z16zp7YTro;bU`jzuP zsS1#*!(WtnW&SKB{~8_s4ZZNsQ2h4_ey^gg{xM8N{qeWtm-cHBbEGr(BXgUD*6Ac!{0iWGgz#0>He6hy#A)c-_{F1%#yhNONZYh6huFNXL1cB64`a~Z|)`kn^ablbok%z zgr3N3>ms|D9g=v7RTcCv^Cm@8Dql{AGVjRIkH7?9MCm;~WKX?bYGm z-V6UM$xh8W{0qh4Nnd_BJ|Oyw;PA<0Ha}bme>u(} zI`=K*|1TxKc_ZgDng4aU?!Jpjef%&S6xU!K{+eF+<#>!JNr!(&FZ|c3{BP3X$A$-7 z`tqMq<)5R&KWp`s`Ohl;Wjg#Bz3_jb_zQISxA(%2@07(=DfqpT_&fe%7%#3Z-;)1& z#qZORe@8F!+sk2!Y`&r;Gd<#KdOwy(=UHI2jg0-!@si^ z{wb23?$Y6pSu0XkvARF-l2Kf49e#T+{Me@@t|}e=g}w0OU7@)CMTdVyFZ}rSMqEGD z;V9|K~dV@ASftZ>Gg%x|<)9B@yy}MFkW3_)k-D2kP)YTzO^wWW_&P zhyMl7mHDy6C9Y&0en-`n`Ni}aQPOnyU+9JZ2AMrA)8U`I?#lV&8#Zw{b@=!6!jJE3 z#8s@rzfko5GLG@zK)^u2K)^u2K)^u2K)^u2K)^u2K)^u2K)^u2K)^u2K)^u2K)^u2 zK)^u2K)^u2K)^u2K)^u2K)^u2K)^u2K)^u2K)^u2K)^u2K)^u2K)^uYzYhX-h|1e> zcjD%K8}cjwIB==Yh;f{;yoT|^f!)boN%Mb>Z^4Fp%NX3)cwt$IdpquW+^^z(5BG80 zU*NusyFU&^_%7~=xNpI|2=`sMOL5<;a(6nN1x3Y`o?>TVUd4KMDZ!(1ZH2qkvyuY@ z>B%c7X2Qvbe023$Rh3s!D7`8Q@;sd^6$NXnB~_5erzMedWdWZmgeRZ!As$Tdu^?r5 zinBb(xkg1^<646R$XV&(gv7J3YOQ#dxF96_@kdV2nzelR2f%TrFAScvBR2I|=nPI_ zKYpL~g30osma`)wc3A9$pP6FszWZ6rPR)w5ELyY|v=(i<`Bkmt*~l7gdvvq5!qcq% zOnXOrRf~yf)>;Q!tqyCesb1TuC6~nTsTW?&bGOGfAtvU4hVwDDYBk#Prah*u+TEVJ z?OaEw0s`bD&n+N2rf7MN0MU6x%X10jK^Pq0n~nfnL*Qmwo*O`vplEpx01>KEgv)*X zILSlNa-TdAekVeN%YE-eD-cdMi$q3;5p zMUoz-Xt^(#=vqa~eZE9f6g_K+j6X}!B{`D5Rng}ZeHZBd$dm4n;Uy|u?)xRWN6~U0 zFVPPbE%)UTJ*H^6&z9(EMazA!z(>(?A1l$H6fO6a;s+8HE%%8M9aps6_X&MbwA{xD z8DS_G54kTBCx<9n?z2RgqJ#SmCMa6&qXeI#<-SCsxr&zi42hO2TJ9SpTBT^Y50Ge` zqUF9mq6ZW$_vsNmqG-AAj%b&nXox-z zhKqeML|-Uc?sLJJIf|D1RH)Z#m(kr8Sdq{Z^yj?_xEtKnYk19_i^*q_PcPi=?kWF z8{Gd$T6PNQ2me3m+fkyB0~fh~AtaxJ81&&&xa7dXnU4eD3Y`V&v^Ycv9+aq@^2D}K zLL8I`k92toBD+FPL1Z%I)I*7K=c$O5%A@Nkh>}U1R|jXv`Gq1t9fZgsAtxV(kR37x z&oe}rJkOBFP%fu9(Gdm40IQ&?1jo2Jy2lncvLFivLVQxH2NSGtffrxJR2B0S{bi9v@tJdw$e!xNe8JTXyG zvhLDD4n!1(5h4_a*{Ok@Iw?>2bspF!J;bSk%Gq&5Vkgaq;VBA7BzC3bfr&CyoN*|f z9f$RGl3hgTI1&-zp+_Qu>^u^YiH;)?B@uEYB0NMj2Za|z@W?<8R7WBTXXlZKf($zn zG1N~~_+oV=A_6*&M1&j14u&2=*~O=`cpR$>!te;5G$~m+4@i`Bhq@vrAA%@-yB>n5 z{DOxdc9J0(cRd7=qjVmE2rB###GseRkdOTohaft`RCgjwLE*$H(D4$d#|1U#=CTr} zVZz?>b@8K^W{k#p7biv(;u?eh=pIc)+(F^#K^&$taB`mTz`v()vuWpU6kX@rb#@bu zrn{=k+Yzh8onKa%Ur?w50|}o`O|0qTLiwF560U#VdFPf*r+<Wj{h&6+jyJo~pF|NYa!N?D4(0X)NbI^vc3ib|3sHHzmIa*K)z=U-Q- zlluPC))!O;rU~UdQlhA+KDfSKV)kEjd&OCH`th&Zp}-zfRtIq^gpR-*7YPs zx3}a8J1g5XBCxwXpJ|V=>%XF+Rdw~X<<&R!z4y&N-0f!*VcZd3T$q1(xy zTR699-qlN&+uUt4B?Bgmg1scmBW;U>6cyc6(>qFm`){vFOBfZ}?E1v?pUB)46PMsj zy7g_Z=^4B5TGO7ug3sCh`i|3G$}|vg()z;gaY~7zqSBK35~r*)&R*C|A(xO^=ftb1 zXk}fm^q$#X$exnwB1b^!$~{hlZ4Ux6&ILS0MN1YgT|7U3q0LRD0;Xih6g6<0VVdN+ z+ZqDAj3>P(-KNCUnzi*)%WA5ED{F(dXrQ6Ge0@#n%2iV<%U8-H@p43d%8V(c8-Qtm zznMyfv?ifnKTTb1VE;Tz>lu+F=__fGrQRppdp+1tVGwb_L;lv7=ktVZJTrLC_BZVd zmMZQib2MqvPw0&o$6Wj8+-JAPbua$Om;%4F<>#?!FpStR9oM5C_{F$Mq-gvJvZ|)ep(pAlp{_nyH6_no?*i%w z-oAyF@-euH1{ONY-+2b!yT*d{Iw|%~i~=zV#3&G>K#T%03dAT7qd<%TF$%;e5Tihh z0x=52C=jDSi~=zV#3&G>K#T%03dAT7qd<%TF$(+>3Y@C>&z8<2tL39>JuN4$_O_hf z7}s*zYlRcGY%Sn?^I+0|K$r5&dAWOF;86FxX@@w&J?I-1=<->Cu02~vcLs*4))QVU z@_|=H+G~=+_av+44<%lq!lib+Wgf?-tKx=*+w1&cON9!?sm%qik5|okr00zxeVz&* zA#c^7P{D4V?+gqT44_cH{~8kP%}RSw|2@X%1GRwq*`T6 zbHO(&dqnsH(gLZf^&`@9z|+rTS(^)PL*A++kR{4~4#P|An?%O0!LPjuD)o~yq;eH~BIeRY%H?yCEVz}}IOHu%}@ zO^xgWP6n6FN~HuCn>sioJfHA83x8$95C6L~UpnEZ z&~A+3btqI&Mn6vb((aq&e}{Z&e@jZJ;6~~TA2gldtLF1d!@{q_-y_IChtP=p%y_l# znK)Ib`B$&P-Dx)e&X5b?FZqX!{1m_2U3f110_VbSNT}f2=<&Zeyl4Dd(n1B?4@v2R zJMX-n&h`oo}BT?-A#~`{>Y60cYxc`5GG0gZI&qp@Mnv zVgk<{!&UR1tzYb1$lRXD+@8qXo@4or!Joo*#=+bVGxx)%H|C=w=AkR{&>3@EPSyN; zPn);sTBmY9ZkFNbG{aNTFPs{18Dx9JM zU9BF~N`I02J%O&!`}4YxtJag0Ed$=+@f|~!3qziKoqn41&_{NecZj!pQzFL+PaylL zpLXxt#JuBngiWL3WLx%MN)8u76D^zGUi>~M_)-7##yoJE3k{yrV~@tMduvjZjy$h( zr`OhzC2@kgCo(SH)+f8hsjzMnoB{*Y%zccZp}Tt@I>DYxOH#w_MatHhp-{mCQcmXS zf|T%^qzjJY280U68$ONzN10#TC9%guIX#~lQ_p<%gbKKK(Kml*N>Bb4#_WsE@9fPV z7uQRZkCH@gzI2A%>=IopaB(02!XPq9=Nw`~fd@sl)> zX(#L~dJ0}!@EjT3$olx43V-1BMoxg+hu|h_zyKo~k9chTFJs?Iypz0ka5{p#9YycH z?oE%pfegJ#KKEvtMUF)uUkQHgc8>g-*%2ex~9i$3R zc;gvYoLSG)!{20VdK?wL@LD_WTF|WDv^M&isozm{rsqlQOPp|1^tm%49BHyClor6_t z7qr(pd(6miH@M3fHJm?^IXNowF=?+*u4uGcmpxP!E|?Rz5B<1z;@nwb|Aw+Bb^M80 z;h7uC)_-n@YA$!?Ok1iw=d^vIB6;zlf{|y*^DuXN=3-R6XR(1qKkw#AI7|Jb3B7YM znYk!)Y0uW{&zO%{@U>Tur!yz#BR~1b(LCfS54jRu{$I8}b97I7T3Bp2vDZ9-P{A$G zL+c*!e3Nw1Ju6uooi*fxVX7IKw)INXSUl;y<=@aJzSs#)gP@xiM3F!SGOTk9)B zyK$~H>QB^@@r|bs;axH7fbho08g(|_%!W5F(Z1051a*Z5N0@&{k+IjAcgj2G<)LT6 z`4QIjBjEK>PrWqirBW{?;-{X>UBUk;+JBUCGem~|1zqupjGs0RS-rYqFY&&*B87gE z(G?@n73mSHyL-E%D=wuU(G{Q7VgI_K+v_=Ws>TCfz3?{9ljY|I)-pG z&k4%>p6iqy-qcB4tj6XI6?FSm^Cy(=Sf#?BJgQo#+x6FtvgVC~59vlHrWu`>8u^z+rNT$WJ_r68 zIMhO?*M_Qf#bU!_2P^W|lC~55!+Oz__2kH~(7T$n_8O~2ryZ9yWOSsQv`^4=|4CVy zPhy`Og&waX|8F4wZz8jQWu6zKPmp`joqfi7vCxCIS0>rx6TBU_Iq z&u!^#JGG}xWzBgxoAQmw;MwT-tjqr1Ds&$f=$Z!3((mK+aXM2q|4($uC&;4M6(^B* z(PwS6Ia})z)@!AjMZbJv=H=&r9bGaC{jt&L645Ksx+DvHj)RNnBGDx$&?V5^=#q5k zIug2$g05qrYX&qBU6K|Viry4mvO)JbD)M*QaCFJr#6_1JK$kq^QTzU-Z&SX_N-pR&()vQ zd7-;|mbyLgjpu2feba_AXpjItiRY;iWr-@BST-?dGUWzuC|`dUX>WN4MJlNydUX)x zGRr3Cxck%lo2c<6#Hny2e4F%MQO+91ILQj+3f>cG*Oy?%xM9;b9(BgJrXxpavBsmv zsLLj-&tC70(bu)vyqd5JEY(v~CTD6?)C`R&Y+KKT;@ISDCB_^IGs;yC(r2eqtk5NRtnyif_M9P@e8F!mJCqMqWjv%Cxsh{OE`i)6n)A5 zPwUwO>ER^O+AOs%c~+=^cTA|yT1MGzx{eCROTONJ_tx=}wv%>5hqfRSLW7;2ye^>| zHr-+ID~kTKZLXBav9YRIZ1~?@5-O1Ro78j0A~+tUykiGXhaO^!{DpE(8BGgk?aJxZ zh$d?#@9ns9=?9!pTo>}@vqnGbGV zcXmI$wnz8&_0uOYUp?4}{mt3Yoqv?^-;xx51i29ZMSGnJZ?NNHD>i9g{l;EfvGY7_ zD>n7`>dA|?6*rHtZAA+kmp#@bv9nK6PxgAd#Xmw=N0~In)$V0K4!oN5<*dy&oADZ7 zT$8FFW$OKh9v1yqExti&7wGyA?AWq#fv(0p)m4lyEdcKxB)^z5B8lHG@kBfR z4T%r6<6oEf2s?f^anWno70t&OXR+zWk#%rOIoJNHd!GN0vv(CgoZH^)yEbKXb`Mkg zGocgq-`-rWz3*(2{$-8mv;Rysc5`avM`q6}d(=kCvJaivH7Ky3_vuppgEix!0cu?p zyj_nk_gbFWacUo9Z&JsN%obD?e_ekx*}}T`4f?F`vFCtq-5XV|?@~1)GeNE6#qUC~t^DHa@i8Cq zA&A`n3EJ)SshNHHCNH}0>*-s@n~^2ad3r6-GHd&4J~d_MGG47WHzkEfvPTvfIYM0K_0ci5jI;y)H}Q6O zIaz2xd#_(C^Gp=~tN2&x)R9)+rt8g>>6LF$aLfS8%P) z9~rq6Sm-43mJZ$OIr|fz!%qlL!aMO_j^z1(@xF$B7ny4tpoR-ge>2+g(~8a%o{0Zu zq~Xcv2tEM4)~+}7e2Ma`H{dlYa)>zV2l0%Ew6jsiM@N1|ybjz1Kk1LXT;VL@oJmnu zbglR^(jsfYTW~&!9{0&yapkQiPup&k{W0y?>-pLJ`u|KeKXUnm<&4OYP2=Z2{2_ga zzea4YF3v^dY~;g%s;e6tz5%}fC-%W;(uD5R=_^nceAC|xv-Xgp> zE6_!m)-_`TU9wMoi*XfEb`g8na_oyl%L-S}W`*TpZ>!!bv+jB*f%CdzV{>c-7suvU zFL7gYG)Uao9JLZRHb)I{pmcj{JB_btX>HdXu6_xq_U zIGx`3H1~g0_z?RLyS-<$PsvIDRaE-9Y_)`2?~rrJrk=gYAh|;{jJ?SK=C*zQ&}nQq zIZKr}%-Yt}<6pps{_phn-|z>!taZUKd@MuM^fLU&e$o9+qx-8OL5?klcG1c23*tq&J6 zhw}qza~EZL{No2yID}c7?QBT*eObYKp=G^rC0GjnF z1C5+A(!TJZKzLAR-#058YR;x`9XmIdl+9wm(lCsU5Iw_X}i z|0uZS(O(ic^f$iO(I+y#Uy^@4v=VxTy1EO;;J0)7bJ~yY_at}dgw9#eAq!b?`ub4p zBhv4%_YdpZ;ZJ}3eI(hIgFE1F88*JuSuL^vuN_`VS_x^g7N*C^-j%hUab~KK$2{mh zd!D662ATO&%lr+Hug^}IPu0Ljki|^z$YU$PL(0z}U(Yu^N9}tUxukUrP}jV+C_9Jm z`=m%Yxu0>dq_j(yV9xfOJ20~6uY_(Wg`>x~v9hKhgwGKt!bLz&v z>*(H5ki~s9@h2X|-ywH{PUtn;Vm_!zNARWmfVM=JWU)?kV5=mI3haM@d670e(Ded- zf*0_i`9_8IFJx_>ICnred$?~~T6~~O@Rqx|E8xXWc(7xfzao!$>)w|wC4bYRnK{|e zTx{XS!RSyuXKkOvXUWIDEKrxJWcR%(#-nAcd!BWuzx&P39!$pNoL8nWcaDO~@AcfV z?=i^S`89WnL=Nq_YGjz((ahww+{jEo<>UD$CsXJ{TZOXh;iodb;P1Lo69JOZcU z_Yz{b;%0eSY|R^i!;HQC-7H=MHhM&Uer4m7 zy9)LU*jZavtDel3yXWy2gngFQyIpd&T1cDSQ1d!pha)n(^j5Jo;*!24jAUukbaR6UVxD$Ltwl$3|%nn~FxZ%^BPAF$64vw;}Zb=Ol z%%;yt{p96wUrOv7v8&gDo5n-vcdcsCxQGqBO7-CII`{VkK99Ei=yEp>qe*Kc4f`ij zZqDb5UFUP|vpE?HIHtt+gVVTCHoXL=#o#3O(>|f!Gsfk*pN4OXd6p7+hjPx?HGl3f zJaDx+o3hT?&_w2jd;f5RwLoMZSvX@o_@3NdyiTnvr;O-Vu}>U*{U);ehC}zbiJI?n zCs+8ML4Ts_M3;-cll`3AXD>9|rRS~{={{-S8511>j)!+#&ss@;C+P1!_O{Ze9$!=+ z&i&MG&i2rU1+v!5IKB0$E?$hl_7MZPKmmIhcnBU;Y{L@h!3EMn;~Jvc$!%E2n?# z@R?#CtS7GRWAYk^`@Cu!_YCl>j5_u#@?h6bjTDhr#q*Oj{`Jz{?@ixdHGMyGs=JWy zdZq|&jm*i+pR(7)XWX>|-NGaHD#wLF1s}=XDd6jAD>F&G_d0!K)2AA)4rv{;XJU8} zd2Osc4lL!R?ib8Mrs|Z=YaSI(=0Q;P$+2?3G zf^rG))wX?8Bkz%4Y;4~g`slC!N6a1EQe^exIMv+xCcZ4%Imw=A5_Rfn<7{Ws-CHv` ztMjs#5kGG9ydT}UOv_kG}la~3Eh}@^u`%>o4N7(E?M%LH!9C@1c0~u?f?2*wT z^C^)|%8G7!8XWZgj51FV_o>uvnO54dN3cijddZRRk-kszIHQ%kXZ3zEIU+o|Maz70 zRJG38>vZfu`OWJ)VNA4&6QOPsyY(c)Yek5(ZZYL%3J#ZBK?lfb``nbDL&a0#K zk43xCi1nebP3OE*!QeEAHg7ig_=Ii-mw4ii@7zP&z0VY#bgn(5dmWT_aL%;9 z#&$joU6R?ul%c=&h<|~1XdWZ2I9|={(L3YOJEXhy&H!}vLS$9s@(8|1d?Q_AZ|!6b z=roZ5(uRmU6V5g1mYkCTUkL1{4f;sYb1ZIBpEXU^ciG$YmzU?fZ^QgcI!l>x+>bb0 z{guYw`8@q6GFE#nyzvZK%wj&+@9Xrg@BQJkg}LagzsQju?+Nzaa+hHp_k7)a5FX5- zPnjQo`p~vV9>7KwT_9<9QeNhX+op)Nr4zPnDVT=6(Bnha@1ffFTO9vDUwh)b&T;f9 zYq6|T?8Rn2ov7BmZu^W6svG*!{#l2<(5HvKQDyq@Cn|58ss9G`e+WHn`hMvQ`pz8& zeeut^_c+cwWaz&Aav$es;H~vfoeJM?$9rvO*L|E6=!PuW>*PG-wV(Sq|7K)xmpQA| z`&zVtyg(BMB35zf#Yi= z|5@5dappiYABLwY9H&Z{dAEXTByH`E<`WXWy}+C$F!c=<2BS1h{!PZDd6+*r{A<$LYuYy79g|s0k|PI53pi;{*=f(o_{Cquxa2~_JggfoeU zN%vzz3cL&WLExS7HeAB}c?7cAZ{S_PO_I;vMao;~<+~-{z*)eJlJB+iHv``x`35dQ zhC`CieRQdR1o$?|H}G7_ua|uGBpM&`>m}d7S?Hp*k}rO1>7Vx`Ds8w`MbSd?H#446 z^6?41*FJIw7pA&LM$_}R9$OwOPS`T~?=Jm4in`JI`&3PoA4;#qJ^Q|cZhuHJwnHIu z(ukh!Ku;qpd$R%;YTGV{wm*PwZRi(dYp*&nS=P+G&OMK#F1>5?_8Da!>0MXP$jfu- z{d~qK^by|_Hrhe=K7KRrkhtGtb^KDr*g5F2+ymGSLIduNZx0xo;sK$VZBy*kdzpT0 z3VFX~rqMek?4!`P*c8~p_)>o-_7Je92k(-Lj`$XOOwuNiuXP3SG~%1^fzL(n4#&pw z)8=n&opr`|$2sSo*b&d4rOX!O>#?)sd5|@ESFS%^j6=?h{c%RWTg*F(vVZt4ZI^Lh z=uG`+MSk}|uU&AExUCPxe&pUFwAJe(^tp}tBD=ThP~PS0>uc}t9lY+X{zKxk7Cr2| zvzrZ{du4Gx)>8zc$%*eV-ApScChc0-irLnUPAJu+^f{J=FIok zWq%~^eabuR&U+ov^Whq3w-1@vgN|E(UgN%UYZm;^()UZ#BFE?-8Q!PU^!?Jb$X`hd z;d9xu^-Ow~B+HsA`$tC4e_Y8?Mvbv|Qta{MZJ-R0VEL z`~Z52K5vCyGIxfUJU#D7m$W?6q)ha@d6@aA=bb6{DLzgqC-Y6#lIZeHGJkbhoA&Pl zPXKSN7oun;`@4(IlJ_inp5N_AvD-?Gw9~KFH{wg7{j0!N_!Qm$TKbc6GUue+80NRw zc8)B(VeqS?J!fqzA};fNGj*=V_K-OrcGjjSoL3rus?7PXQs%eZulQHy@9g*Ob;g;$ zGk|4p>dfCM!0!1w3An%c`u)J1vLa`x=sUevkWlJoUZuJmytZpP_y3-JUt8C><-_UTz7oy!PS9^lLQ?C4 z%Kr9OHgtE}Q-1iZCR`Mj`{gocMiO$bzw4u|*fl&yAGN}7tWsfbC{!?nJh^`)V|i;b zHZFA+&A%u-hr6E(tveqQf9-7UfX+f51UJ!*9_n35y)yK38Dl8q&J^QgpUC@(U%Dv# zk$vvFSI&L)cqn_qvAG&A(rNA7gDQpxuMi3i`dha|XLUa(?~eCft7J~@qn?|`vaa@} z!`M#68Y;Y!b9YS>`y735R?|gtj=nb!UyR<@$Qe3gdmcM7fSn-Y@-ZgyQRcvhcKa-S zZ&sU)``>$T*1o(xdzM{-^Hw=a@0G>7C?9QiuYhNJzEO~iz#MGe;t6w3bBW-p@f+Ns~4BV#ZT<`1~-qcQtb7ysRM5*;t@DW$(V{ z8zXX0P~P4z_O;pj#p{ukHeL^maO2gaE}atoazA)IZ{xLBHIL}Q>uG~m8UC8aacTqj zHPx+|5-#?%T^90$F4K5DGVZK+L5C)_cZ$9v;N~;*+S~ZU+T2E^W-pg9e|H?;rqbU) z6WTSYjw#_4^vymUz0pg%Z#g*b9@m581Egu+#t&!YGT(%TO?6k;Ja+T1zkRi9?(OZJ zd*^j(zcy=b?whX$sDeJwXvPWEhQs?THRuty~SIw?n7Y{htJ z9Kye`-V@p{Y4WWeU(Y%0$YU#^-w|CeB{G1#L6Wahwxw`RE9D0QGpF|Zly4Be*5PI1 zkEM@FgUfjamn_a`r5tzW*EOa!qc>G-mo6f8rbK6y3qMmcC)f~YfAtBe$XDf@Aai#|uN z@6K{(L-#RPzBNVu5p$OCb?A@Hug?-z2=9Dq_??N|ly$nF=p@?@6Xc;;19|Y+96?gAbD< zBJN^<+e~QJ{KrvYH;&U~T&6FvYyS+Ni_uR%cH#XtX}-2g^f`K-=qDGCr2J9IkHTBh zKQwsHH?;eRQ0QfW_tPHEiPG-VdP(s4D>BueZkmfO7k$xtUe@<~{NtPK?@q3uzy9pf zgaQ4`L+<$XorhyOcS1wa^{iXD*?fP|@rSg3D=GXZy#C^mUOW}C4M9EetdpsjKR6@CHwzt*b~W` zZ*2KKdR^NH$g$k}?9ZNmhP_yS@??Mi#P<7%Ohn6(ywg(5-a__opAkBZ_lIxRd&abg z2iRiIo6gyvwgty0g$s$x_e}mmy>>aP8IRlm->B17_!ZK3@;;czrnZApriEXYH0(*? z|Bq<<1@;H{0A{v%+}|y+&l8>dkisjC{0_g4Lz7{KCf}r$KF(b)%FNWb{g`i8C(Aw{ zIr6CB2Yl4PEu!1O-{PKwyazA$-FS<3-z@miFd`1SJ|)shn#^5U!~0twvz+zuxy#XG zeb+|k?%2JwA#=mMZxtDxYiM%R&}t{|+}g6x>nl)lA3N%MUcSM3UA`0#?`$MTe&?zy z@OJu&Zlk@wHj?t?opDSOd_Ig%%Zl0K-7a(xe8ExL6q)!Tv=e%)?Wg@V$~wMKUkbPZ z`{oMG<(oUch<`YFwrBdVN5qCPX%5ZAE^y+q zo`k69=Gy_*G6inJujMX&NnZ}X&hUNcJ*bTjYjKm?_mRxG9BWFe?3<;{%V|^M&Fpj3 zR?domWh|S_U#`TO;rd`8@Up`W=!(B$?_2wm7WGgtfiCgfiCPR@bcbe1`qf=o0s zjz-q@GVql7@LOa;beqgq!AtfNCA8a!jx00y^`!AVo-**<1b&j=2)=icmJp9mjx>p5 zJG5pqhVtGqTvNsvgny6f`>V;3*F=7dYy>nvdSx#}eVKPMPvq{1@b=vA16+Q{dAG64 z+*x(rZIm%*_u*qkr)uQx4S2{qi_9B2+j;`IMZPj3Y20_QLfl;;--moz+&9X4Wg2ro zL)%-T$HiCqH2Hyna+aSOc?A5g1}>Aec~nyFsPmF?)3cItGl#_O&rF4nq-PE>;cyd9 zCvSM%e$J&^r&Bi*zlPwU(7(D*?L$k8EG19&>aQRxbHGQByMme zJcXTGJXp;XUW)xLYe6n!&*fcwu`NgPUBMr-hG#FnM6W$QY=n5)l(QmP!$;7U*nn-= z6^*RrBl(tAw%!{%X&49`Dw3Jvc`>!$Q}9sG}PtIS|xS({)=75 ztXH4H|K7DKJu;kn?H_k@w1 zLk!_Jd)0yQAu8Zk92g&B2p`c)4vY_xHM#Jh1LH#svBtmX!1xdq@B!d%Y@uDyLgRri zk#X9*dROFw^LEMzuZlnD-sjbHO^-;wGL|<96=T6qz;B!A_eJ{5W1(@kUUSd>osGTH z272DDp35|u{JJ5GRH%Avc_ba2vCwnhNxdzq}8Dkcq_y>-{Tk+RDN=SR}%6%Be zb`*PVpR9$9-_KZNO=O)!XW6#pg_=eZxA$po9N0UvPWC+)vFr7{3;LfTvr%@0&|h>h zv}qOEG!n{PCud!~9U4ixf@b>6hV^Z|(2enl+{rlIYjiPwk^X$Y;-3^xQwF-$U)Dxnvc3NLlI``^y{~tCwr$|(%*O=i^a8vT**`!y ziMdt8Z=J|mnuxxhWO=$KF^786cu#p!Jacc1hwst^y6$2OgGl3>v0aIzNxXuzHLRtB zfF}*l-@k}&!A@e`kZ-RZf z*;`{*&64`=dC=b+kngU`w;7!8cR4=$&HB4MagjN+*$~%x$qwE*n2ZkOTf+r|d3>3C zM|rFo@hjHti-4>7E;7HdQ*i{jdyRdqgjIYa`Dxg2jly_k-u$5{`5GF z{JF;{@@J3H9;-dZ1jd-4$B4qxG8jMxH!&_IPme4jWBNM=lJ3ajF(ZqT=E$Nm=57C? zEZTFF_pQdL5tDdCCI-3qvB~gbF#I?MKXw>?B!cTE@WxI6*Tf2y63URelfQd!L8cm1 z@j5j36Bm8z^wELNdWI(sj^4$F>^dO%djc&9>=6>r^Yr8?*kzM%yxwD1s#QVAEdij14-_6@D{wi4?oc!@R zKUwD&7`yJr^e^kdK0?7w{8?htoMGo+Z^(B#qJM)>Y>oT*o`kef$~w}ZC^EO`X})`9ORloGB!jw9%%Wdks!=z)79z#`ffnI%zhod;M|F zw>i!>HU&NE7`xo#;LbL-5x-|>+RmnJf4rKd$H{op81KvfWV~Wm$+uXfop-4(AwJ{n zJI^_0`&&ReO}$R)y>G@XYx}>M^jA%LR~!5o_x7Ei*kix&9Al4`Ipi*R=i!|F7uB7UT16N9JWLQqfU-@Y8cH!uhC zEleNZ#7y8@pox47)Dsq)*}1Z=KbNR7w>*QgS6|nP7i-_AHNYXkKZ?FDjoYazva+@ zpF#XY`MH5xCl249F=rHaMMkK?IC_m?Z_As33PoyvS zmC`|4!ZYfcIp?c&2k_PJnU+3!DDXn^=bHS?{hST*8((*l26BDsG*ailZQo7wO-~;^ zgnClua>_{k9W83zMbz8zefCd$CwRv*Cfo-Oe8cUyQZtGv`+}66ZmnzMJblM56FyB@LK~FpK1;5_gE?=6FhgZwz~6%T7muL^e4X|ah%`i z`8(h7!mp#tvM%%~JA|?=uCh}oC-4j@4{!2VXKU7E>+>I3!$hAs?T(|&4#vP5Qn&;E zhTw5royTX+REqSUMYx9WL+0=#LeXJ6;9)U5-jQmpgMNiO&a>8S_V?PR36vYkBjfQg z)(*xh>*;ZoIYZW#<7&(dk@e$h?2L(&6I^6`?_djyT*^B9H}7D+AvT2X)DDfzIS;&! zcNcyiTK!Fpo+0!MB=twn!2S^J$~P}3(eK;zE8|}YuO|vUp+Q+xzTXO*erFF?$JZ3!Yx&_-|;OkUU%Md z!8f|Ee)!il6ng&)<@U!>E*ifxa6!go9{jU%`IH+D&!hVl-Q&o?Z0I4px(d7X*Z8Y; zV5{DRUcgtt_bBW+UxmCo^n+)^ui`gsp0@CH4qtfdG4@2#zO?z6r*pQ{UxQtKS3mql zey6|4JQulH!c#=qx0#>VinDNd(`E4QLo$%~ed}B^@zLb?Z zvSw8Dm7jI8Z`;<7d>|LsY;v_HcXFf+_OCOYzTIv827djDc79F0D(?{cE*t&*09md! zeM+0(k5`AJ-NE1~IL;x?-lkC6TuJ#~Ax}=bi;diGA-yU=9lB_7RgNS7v?cAl=d?4? zN?a^$RUjV|Z*NJQ*w2_qyGF_gjim3vR_APIEG{}uUuE+9o2ysJH$1VAIOjW*seH$L z(;6Sz#Q6AbUsnRYUiX>aTyQzPaS=A%LTtMQ*mzfB>s`Tj&gZwhH9o%z8&KaHf1ESy z?yc&O^V?s0u*GD3eU$KKY;*B9k>B$jI_I~JWiRONvt?^0?=bRxe`t6Ny?7kGSb<*b zR++WOlkd)0G<;iztb3c(-1qOcc4REFwq;bsZT(}n%BY<@{O*jmlkdu?O1kHvZZ*1= zb`MUxYaQN?`tz8bRlacl5m z-|c%6Wlm&TgDZw?zB{8^jj6pCJO^9%5LdMa;_tma6aM`Qx?aS-8$CFDDD&cJ%cEsy zD0^B-N5=4n@sscexpp_HI$!3`NxsrNx<7^cQCSEWXcU@ zZ!PJfSEQWCF|wy+cq039$(u|ak+0*7?@lXWo75G#y%72DuRdk)AG@cG-+%6&C%+NvMQ6pK zyW-Jd1JGssKI}#x-+%Xn<$YxFf0g-E>s#Xj`zPxAu~tOU_7TnlW&ipJp?u4IHKBa7 zSkCo@4{z}e{uiK)Z;0$Q6OL6N!*Zs>ZzgS5@a4PEwhbQ2*}nK`UIY%Hv)eeQ;T|h# zsgYku8hWxF-<16BfXMB$l9tSU4bnb;lV{>}qt*U)#wOn-uEzdqN0!>53q0JL#XDYQ zln+6BIq&U2=05tZ)pFtwwtq;MQ8U6TDI@3E*AfcveDJ!R-;uP_NAug9lAjT|kx<5d zdgB7u}EYTf4UkZR5y`r_2D#4x|or-N^o*a^go9+WO$b z3()oje#1uY)JXg6oAo(k9-;hR$N<7F_LK6v81j3sa_;a#6n#rHebXZA4Skn_E3`AT zOpeq8GmfqRJ|>%%DUljUgT6AC+DAiE)*Fk*`F+yc$oKI(hwApgeeL)lcsZ%L7~1cI z_D5I`opN%=w_%lM;w|u^P4i-O1YO+R1}_w}cX$y`xt+iwR|n+&3E#^8@OxIv2fypf zk57?dk(Cb!d-yRr&}FBOiJa2;qaz;^+Wc4uZ5Ke}E1~rj(0o4p$Y)Kp`O)9n`#siP z`3{xL31{tf&n=N5J-2+kD?l7sZmt(Sg&$4i_2-SbAJm?bOAc* zshQz+XtNw%GY0rd+Oiqp-;!2#f&EQ+ofeuA{v~M};8_>*j_-ySBvZETFEiv_w!O{o z&k!H$-hE3i7T@FEmm?R4M-rYKFf*J^n7(Qzzh@(3Nsc^8J6$@?`8VdZSA^8Ikirzmt(^m-uY z(8)>AmN93;pHLd}ZLqd0-t(~@+|8WvB?a~`fY$FK3z8o~XO;1rB&4;<9qPsrf&Go} zri}T9y>WggMrc>&;SLq@+{iPB^tq&$aZl_{@?`ByV7)1amy(xi?RZGi z%Sq2>{osApeX_QQt`u10No>|xl=F~|zg)}G9B9&@5aq-FAS;=sD{%Hm5%CTlZU^`OpeIyAq&jIW$d}&TpAWm}0}e zivs%Yr{FIA$=sC?ANLu&>siCG(?&CP(K*7;%-gJ%fa5AXDyzQd};@Hi|y?vK8rulG>j z7l%B>sV>gV5P6j{N8*a-4$hBk`3j4CIpY+a=ccXb6`>RI^qwzCbuGc(ErvhEw7pbx z67yV-4Vd3!(LQ{909qHib&9*qV){t-@eMNJ!3100i;-u}DAA?8_MZ44gzmE6lXM^X zGVV-#QM?mYXpg)1j-PWz#eOQHgtx;3`|o5vBrr~~aT6HlMA}OjuJ$L;Kj(>B{+&Bv z&i&1uLO1fIALp*1L!WkVc8|reX+)mnyFVq+hIxtJO^#d%jIStC!d$TLw1*Bmp+g%v zcN4j4H+>!;On@c}1x`g*^BDO%ETJA7V-VhMma@oDHfMnjer-|wbA0xP!KK;i{ITFA z_ig>G2i(IC^Sp;#7E1a`L;p7N1I#&Sf7roO`qt|Q_=p|N7+Vwkffl}3*CRX8IxT>n zcKR23qI+5ubEE+IV13v3F{0;)qKus5@U8ToIkG2ejvxnG9;BRGuZ#k(R?5m)WS+^~ z7rMC1$T$QSAN?e-77Fbo6nf+L?y}Hp3Cta_1LvX}Wv)2$#PVA`bk3%)er19ACbH1M z*bChumQdx8`^I99I((# z__@d5^y36lwn`JGdI1o95i;X#DZXqHo6-bs~md}~>U0}1`e zc>M*oyhO{$IeCD*I6SD1;=%R*10I~&hkZBkZwA-D5GrHCbrR21$;aA|Ng2m2;4i-g z#~gK?8}{nLozStbp0e9MXxf(dXhm)s^%~yWE`Imz@?E{Nwd-!P9hpf%E-{+*x-GhV z0rRL?Y!jZH#5K>kTP*2fquj^*6j>A=2_GH#lzCZ98EZ_hK4CrBn*@H!lliiaqx*Z} z$Wl+7zIx*0T=5HB@ky@u6jywPD?Zy5|Ew#1xhtOMieKT1FLK3~y5a?{_~%{m>s|31 zUGbH!_-a>tjVoU5ir2d0H@o7uy5e7U#kaWPUveg;#lPW-Kj4Z#T3Yk=Xux?dt`C5&fQ;@VXNxZQ7=90?t(%z9)me(RUsO8rzf$giyZ^|#J zFIisGP`fHf>%Am7J0GUZoHp&OyfAGpUrJND_2o;ib@iqBt^3iL8gxo(z%E=HEU6Fn zL9DXAsI(FZs?VP2UtLmO87$TGnHN>E-$dOe++2thmQ+&J7CVt~;f|oEd0l=py+YU3 zG{3yQw!Hc#N>s}%C=ISIX{fCC!!5{rk-xrngFjfcwtj;jrczEhLf*r)9zNM*@LyF^ z8kCL<4mJk!*VDm@x{{lM(7n1|onLxJk*i9o$*!dwlk19du&-5D2CIX$C6&wpdpx!N zU~O$pZBLgr`~8){>YM7zdQxv;V%6N@2$v%;27d>v->^35uUYM{4X$fIVAYE1l9iP~ ze|?Q#%fqUgs6zzFQ)^3VLA4$o zS0|&cUe$|sWz9_toVmE7j_g$>)$i<_+lu!IDzuP7s2TFr~DvT2sL<-TQ6bS7(=lvQp}b+M23`)#XlY zo$9Er^DFf%)m#YL^SF1C3UQaupIb0*f$pJb`4^TK&cCWim?>FBE0)hM=!NpGE?l4? zaJ&{SOV@=pcE|biub8`HNui*nvwHD&QkH>HKMKp{??R|fwm*EW(LC%Ml=IkW9_1xh{>4W$I)2EA3#Kh!-1B#X z`fTZE7b}5lLye0UH!uFl;%5tKq@O=&PyQqv!;{F9&m(^lO26dczEK|hXcETJXB=l= zacq|OoQ;a(-Ql=op5iQ}$|xYuk|+3wKZ(2lXhRKFYt@UE?s)*e_2Eexs4V|L6}M-g zieEBF#l190#h23Pg~`fFNl~5~Mk?zzI@>c+4dC}NJ%hPW(VU^;lO`x{V1kOTpQr}j zF-dt|nXJ6N3zet+LKS!5BISFY3w!xfm1q5QE^L@X7)ew{xMg_AXT3VXQ;U?! zUZN5LS1EP;D&-k-wX(9W2FI(F@Axt`U`&CEo4H&KZ2P=Q$oV2T-=GG(`X!~Fyis{i za7k)yvGVRNR=!Y);yRA9maJ6qg+b+gFsQ5vtCgqqCN_&@D(;Ok(B!a9{$db{$rZc^5ho0QreQdVn7c}h1cbz-xMZ@&Y&d_}3p zzoG^{|5fEV@HM3tG%739s65$sDytZ0;h4LWxAZR3?o#R%LjN|U8n-Fy;cd#3f48#k z#u2~Z9_4MiM|sNbRqEBRD+@oN$b;)IDWtiol0qUkT-^)_za_K_CWUxMR>SzHbcihJ z&}YH~6N(&4J^UFu#J{1#AtoGZLgbIXq!9aL9U?Y5lnY&wj$G=Hvl1Pqnh^iGh7l_r zrkjwvJ{m^EbU50CGB>2X^GrC_gv)W zgQ_sFEkEcv4NINaUyK4V3dAT7qd<%TF$%;e5Tihh0x=52C=jDSi~=zV#3&G>K#T%0 z3dAT7qd<%TF$%;e5Tihh0x=52C=jDSi~=zV#3&G>K#T%03dAT7qd<%TF$%;e5Tihh z0x=52C=jDSi~=zV#3&G>K#T%03dAT7qd<%TF$%;e5Tihh0x=52DDeLc3ViRe$c+CB zCjZy^|ChdFbz>BWQ6NTv7zJV!h*2O$ffxm16o^qEMu8XwVibr`AVz^01!5G4Q6NTv z7zJV!h*2O$ffxm16o^qEMu8XwVibr`AVz^01!5G4Q6NTv7zJV!h*2O$ffxm16o^qE zMu8XwVibr`AVz^01!5G4Q6NTv7zJV!h*2O$ffxm16o^qEMu8XwVifrQ69xPXW*JX9 zKQ=EP18{zGo~UwuPd;4$*Pn(1{F;1QZ=%%m@B{UpNjytJWF`4=UKyZD^DZO13Y_pe#G-E&taaoEoFVoGs2^+Njw3b&wHrHb1TnXJP+|a z%kvJ8@+!|@9zV|vo<%&@^Q_^ymFF&=hj=19Px1VQ=Px|(@OB!`qffegY_k= zDg-E6T~c1zH|3^=lG;)`skFR$tsSdfRZ`zuxpvjs4GvUa)3A1JkPb`gYsyv8%3FiA zHL3{gDr;7$qSdP^YwEyY^-aP0I)a+DL6BT+V*K?JW)ErA0JK z8ZlK=SzlCIY1-0pGfEvVuP(1QMeO!x)1Yvh+=Bs5Yr!SXKfmpvnm9s+}ebNlB`QI(5NSRnSVuK}NzdDoN<1OaH*74R*Oo zp#*TXQ=nR7NDBY!ocbEDsxPmCHaGY5tE?jR^dJP=tBzmIKka$^b80dF?7WJ9-d)B& zolG82d9Y5Mw?U0l@pDT{m(@a<+WHMDVO~u&?KiBdH%U@#XnydFwB+SMr^p7C{`r#1 z^3sy}psA!j<5i(+=;`q|bJ-EGyD-;8)XM41Px zDRW{CW%g61rh0YxP5J6k3r5rj^LwlOjG`~Dqv%uXDEbD_s{);B;Gf1?l1^H2>ZPrg zGJ+F$haaNCdug=e#r=In?P(11l*3Q=o;3O4y?~;l;zbpT~@*U}8 zZ(N)T{ZQbCzb9}T@ZKK_yr)&*gTQ<2A^c2ITYoD5zWZa#lXC)|J6}wcBF^L~V|<2i`llIu(gqR#R8+h>)T8kKzh~>To=> z#wBQfi`NrJM)pDcwYBB-LG^u*yyK)G`R)lp^4Wn*B?2*h<%ZIYhau@@u~FlWH%p+S^hn>MgDzwi^p2tP#aXC1PX;b@%h0@6u9c}&A)nyddGJ~IeJW;@GT9luU8-Y zmIs3s>Z=reoc5Gw{c(451dXFbg+IuO%Ztsr? zkR3&)+7oocf2D4l#`e^9+8r=Y9rDeu3|0lJ>(x=;)#~|#9?f?=p|EC!UaFcB;YveL zJ&;Ie2s^q`J)8(-Dr;_9)=*b=RozYM*W|tU7opJ`uStpO64dZpiEB&h%hW%}JJqiF zbfhQmD}!|2wn55Mr@2)mYNSYgnAiZq1_%#Q@iJ)_E?r)zro%n;rvXK3n~#|bk>91HF)+s9xXpLKNTcht)&mK>sH}HIX;dSZhgYU2|-0cbM zj=SMN+ySdI{s3L1PvGgWikIE?pyzSxLH-*YvYz+s^*rdgd*H#iW>2%{CF`I!C%^d8 zOD|nkTsZSp>q#r6aX|is7tVacdfX~LXgzFA=(O@L?I5GwI$@P&Pnfy>L87OuW~;a< zC3{a?+>*j2NqemY3tsg!d9!z04|?wK1OhpGteopg7mT?s+h3Nl$67%A6|3}y>u%77 z+##P*m}km2QG@Dj1J_Tn;cnouayA6DUfyd0W^KUos-3ETh zz)u-?uYq4R@BssN8u$$ZFPLSw_c5^G`*^^H6BBKC!8{ut11$JvUv0xv3_L*$Uj7ys zxYWQmn)zK6 zj||*gZ^OfoO~K#4-i9X`_`%z3c(#EnZ@1yO2EKHY4KFcpQ^@Nol|-ebd`7%v z9`7jwk2dhTU$^rwG;m>)4PR>D+YEe_fp;4CIs?CC;4%X*3ETB=HSik-{;GkW|Aw94 zWZ<^@Z1_6{E^M~ppBcE-z`u3sf7{M~4Ory!xPkv>@>6!%`Mx3cc+(A>YT!}>XBzlP z15Y$?+#`1VX$DR)aIS%$H}HG|4}R1xzs$ge2EM_-dw1LUYYZItt_|N};4%Z>W#GZz zv-6t`JYkOwKVsnQ|JSa$$3<~naeNhtw4!-v@sXrLFeO#Q_hD8=x zS$8Sy0$PHkDj^!JF-A#ZkdH+LK_xzDUPg=&i9rqcHiG!TYQ;uB@qw0vo;&Bv?CfQU zf8?*WcR!!=;eO9K_s-ql%+3t=+#=-NN`K-?;zHsR#P!7W#5r5Aex#5Usb+c2I< zTuA&T@lE12#Fg7Ie?75pDRLok4)Jc{dg49Aqd&&{!@ylS>U1mjAzxq&_i*LE{6^vc zT{}799^>EWbXmk5A4Sd~_8?wK>_wbQJb*Z#IEuKS1CDPa-bnlbaiJT=KPN6Ct|KmS z$9Q{~<)hGS^pU5l>rNcwg*=3~`B~&};`~1#8;FyhLwt=Ma~^hMcFwX?~v(-=z4r#BTKdaEW+VH1@wk97Az<_m$_L zPV7nS8H4$Qh(n3T5+~^~KAE_bSRy_?8{^5u&&MGzB2JG-evdd{4)RXo5p$7ih?5o| zUngGtXJl7boWF^#&mP42W{meEcKZ`@0CCPd1w-WcrLS9H* z{}<$y#JP)*^N6D;e;aWX@gCx*-oX4S;tb;R#3eM|RpMRQn16@3ekro+BdA9c#k&(* z-@;Mw$I%=cIks?|%5f&g*&HwDcs0i#aa_Rh7LIpt z{3XW~$RHVhYB;Xr_!`HzIsO@0J%5k5Ii3&p?AM+j503kC9Kdl1$5S|-!Er3dW{y)i z&g3|o;}smQ;W&@u%^a6<{0Yb999MAs6`ZF1U|)kB0ILN12J8^nw_sIZhry139R>Ri ztQxEa>=@W_uoGY>!PvXQX|OY3XTiP)I|o(^RtI(-tRCzF*hR2QV3)xfz^;J(1MDgo zd*}Ek*mbZ*up40i0{a2%CfF^oaN`tv@W6t-6Q7f=%1U~x zYzjE(;^2~3{WYB#J0#dAuAPzH>o`-bzl~uW+)9B#GXrvATI=<4mg!{0+_@VEiGbpq zvR=>fG^`}BLIEtSD^&>0a&$VRwklF+df2b|2!lL??9iSltzSE=T|HTAOtU*N)v+kR zj;odhw1CNSnLsUDu(*RqlcW_$&LM{;#n~kDtxdxHV{_498H(~M9x*97pDKz70w3X|2yHZnlHT#~n2NP2Ue zG~2@VJ4h+ug)&%M;Wj!O(vx6}U+CUO0z0T=wMc0=H9Gh&c;lgltz;0TT`_4WZ3S60bX?L*szKSrwRND0f-4i{emk=~{<+Q&*gtp%s^AHi}EVH7n1c z$$EI*gQL?UNqGnmMp=T{c&I7PA9r7^OctflWPO{vzv8_g|6**gPo@%xlP0CZ!!O0#zO2Ed>u4a3YgbsDP zkrY4A3OmPOSlC&XZcWxp@iy~p_8XgLF`10<^CgqfoXGZnvFiB**vKVcbI_*CO>W71 zz@Rk+u5?r8_flwu8xn`=w4f?&z4-VZZKv5rR# zpvC4A0=p*A&%U$#(q(srCmT{Z*DJ;pBWxOiL&4y5d1~9>rWX@-D1*G=0S_y;Cz$kb zDj+0Z4)B-W1)v3|U5?P{pDdq#=7-ad0lE&Ce;Kut+0tt`CnGvLyVbn(6?CE(@h zco%{kiQTr~!c9=d3}yY)y9xg?<0s!vxpx<*Nie3+DWQ8r zc;cd=e|MP}e>mvU@~7{WG+r6_`kCGtwM*8%Q+csi+Pbi0$8<}@wfOQ5r>d(H+fSM9 z+LEy=W5JTMdzMXl%Xf2nS!&tRqvnmp#g`Kc&My1y9owps=s`c3;#W2_ct7u*8e6+~ ze%|tRd7bOJc3AIP^v=187q)m#`_XIo19Oni(Fa$LT!^d-F4}C|IOf)C(+0U6_;*%R zw~G5q!@d|fv-fVVF_nv6j*`+|8tM~t&(nW!&jF!XQSWwc8MQwtvevxQ<#O+@y2O+j zYp-uBob>ygaVu_jj~<;A>Nm7{rt#-P+sE~5>6CbI^pFiZ_kUA6HuY3vad6(?U3+~t zEC^h8Gb*y^g~GfAw8h+P8Yy zs{5ZGOz*X#CcFMh#ri$^7b*)~cihQeTYNXY4Es}S+z0t373P*{aX^6 z#zbs5_Q&}H>RK{K4*qOZL)L-whZFnx{cgdcJ`dCX*T&M_Vz2T>!(WQsbd>`4h}f~UD2lEs~_lm z26s-|*ta;K&y5F-`D?D9a6P$dmc{GFGdpH_r1Y-6T~~NFw`|19$?qR|<<+aP`uBIA z9dfF`z2U>?-XVb*9>*_wJiVsI^c4IG*{ZhuD|=AaiM3%ZReXd3LII(GP(Uak6c7ps z1%v`Z0il3UKqw#-5DEwdgaSeVp@2|8C?FIN3J3*+0zv_yfKWgvAQTV^2nB=!LII(G zP(Uak6c7ps1%v`Z0il3UKqw#-5DEwdgaSeVp@2|8C?FIN3J3*+0zv_yfKWgvAQTV^ S2nB=!LII(GP~d+ +#include + +/* platform specific... */ +#ifdef _WINDOWS + #include +#endif + +/* standard ODBC stuff... */ +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef WIN32 + #ifdef PATH_MAX + #define _MAX_PATH PATH_MAX + #else + #define _MAX_PATH 256 + #endif +#endif + +extern HINSTANCE hLoadedInst; + +/*---------------------------------------------------------------------------------- + Defines and Macros +----------------------------------------------------------------------------------*/ + +#define TEST_ABORTED (-1) + +#define AUTO_MAX_TEST_NAME 35 +#define AUTO_MAX_TESTCASE_NAME 35 +#define AUTO_MAX_TESTDESC_NAME 75 + +#define MAXFLUSH 300 +#define MAX_USER_INFO 50 +#define MAX_KEYWORD_LEN 149 + +/* */ +#ifdef WIN32 + #define EXTFUNCDECL _stdcall + #define EXTFUN _stdcall + #define MY_EXPORT __declspec(dllexport) +#else + #define EXTFUNCDECL + #define EXTFUN + #define MY_EXPORT +#endif + +#define InitTest(lps) \ +{ lps->cErrors=0; } +#define AbortTest(lps) \ +{ lps->cErrors=TEST_ABORTED; } + +#define AllocateMemory(cb) (calloc(cb,1)) +#define ReleaseMemory(lp) (free(lp)) + +#define NumItems(s) (sizeof(s) / sizeof(s[0])) + +/* Following will access bit number pos in a bit array and return */ +/* TRUE if it is set, FALSE if it is not */ +#define CQBITS (sizeof(unsigned int) * 8) +#define getqbit(lpa, pos) \ + (lpa[((pos) / CQBITS)] & (1 << ((pos) - (CQBITS * ((pos) / CQBITS))))) +#define GETBIT(p1,p2) getqbit(p1,(p2)-1) + +/* + * Message box defines + */ + +#ifndef WIN32 + #define MB_OK (0x0000) + #define MB_ABORTRETRYIGNORE (0x0001) + #define MB_OKCANCEL (0x0002) + #define MB_RETRYCANCEL (0x0003) + #define MB_YESNO (0x0004) + #define MB_YESNOCANCEL (0x0005) + + #define MB_ICONEXCLAMATION (0x0000) + #define MB_ICONWARNING MB_ICONEXCLAMATION + #define MB_ICONINFORMATION (0x0010) + #define MB_ICONASTERISK MB_ICONINFORMATION + #define MB_ICONQUESTION (0x0020) + #define MB_ICONSTOP (0x0030) + #define MB_ICONERROR MB_ICONSTOP + #define MB_ICONHAND MB_ICONSTOP + + #define MB_DEFBUTTON1 (0x0000) + #define MB_DEFBUTTON2 (0x0100) + #define MB_DEFBUTTON3 (0x0200) + #define MB_DEFBUTTON4 (0x0300) + + #define MB_APPMODAL (0x0000) + #define MB_SYSTEMMODAL (0x1000) + #define MB_TASKMODAL (0x2000) + + #define MB_DEFAULT_DESKTOP_ONLY (0x0000) + #define MB_HELP (0x0000) + #define MB_RIGHT (0x0000) + #define MB_RTLREADING (0x0000) + #define MB_SETFOREGROUND (0x0000) + #define MB_TOPMOST (0x0000) + #define MB_SERVICE_NOTIFICATION (0x0000) + #define MB_SERVICE_NOTIFICATION_NT3X (0x0000) +#endif + +/*! + This structure contains the information found in the .INI file for a + data source. The filled out structure is in turn passed to AutoTestFunc + to drive the individual tests. +*/ +typedef struct tagSERVERINFO { + HWND hwnd; /* Output edit window */ + CHAR szLogFile[_MAX_PATH]; /* Output log file */ + HENV henv; /* .EXE's henv */ + HDBC hdbc; /* .EXE's hdbc */ + HSTMT hstmt; /* .EXE's hstmt */ + + /* The following items are gathered from the .INI file and may be defined */ + /* via the "Manage Test Sources" menu item from ODBC Test */ + CHAR szSource[SQL_MAX_DSN_LENGTH+1]; + CHAR szValidServer0[SQL_MAX_DSN_LENGTH+1]; + CHAR szValidLogin0[MAX_USER_INFO+1]; + CHAR szValidPassword0[MAX_USER_INFO+1]; + CHAR szKeywords[MAX_KEYWORD_LEN+1]; + + /* Following are used for run-time */ + UINT FAR * rglMask; /* Run test mask */ + int failed; /* Track failures on a test case basis */ + int cErrors; /* Count of errors */ + BOOL fDebug; /* TRUE if debugging is to be enabled */ + BOOL fScreen; /* TRUE if test output goes to screen */ + BOOL fLog; /* TRUE if test output goes to log */ + BOOL fIsolate; /* TRUE to isolate output */ + UDWORD vCursorLib; /* Value for SQL_ODBC_CURSOR on SQLSetConnectOption */ + HINSTANCE hLoadedInst; /* Instance handle of loaded test */ + + /* Following are used for buffering output to edit window */ + CHAR szBuff[MAXFLUSH]; /* Hold temporary results */ + UINT cBuff; /* Number of TCHARs in szBuff */ + } SERVERINFO; +typedef SERVERINFO FAR * lpSERVERINFO; + + +BOOL EXTFUNCDECL FAR szLogPrintf(lpSERVERINFO lps, BOOL fForce, LPTSTR szFmt, ...); +int EXTFUNCDECL FAR szMessageBox(HWND hwnd, UINT style, LPTSTR szTitle, LPTSTR szFmt, ...); +LPTSTR EXTFUN GetRCString(HINSTANCE hInst, LPTSTR buf, int cbbuf, UINT ids); + +#ifdef __cplusplus +} +#endif + +#endif + + diff --git a/mssql_python/libs/macos/odbc_include/odbcinst.h b/mssql_python/libs/macos/odbc_include/odbcinst.h new file mode 100644 index 00000000..aa74a6fd --- /dev/null +++ b/mssql_python/libs/macos/odbc_include/odbcinst.h @@ -0,0 +1,458 @@ +/************************************************** + * odbcinst.h + * + ************************************************** + * This code was created by Peter Harvey @ CodeByDesign. + * Released under LGPL 28.JAN.99 + * + * Contributions from... + * ----------------------------------------------- + * Peter Harvey - pharvey@codebydesign.com + **************************************************/ +#ifndef __ODBCINST_H +#define __ODBCINST_H + +#include + +#ifndef BOOL +#define BOOL int +#endif + +#ifndef __SQL +#include "sql.h" +#endif + + +/*! + * \brief Our generic window handle. + * + * This is used wherever a HWND is needed. The caller inits this according + * to which UI the caller has (or simply desires). This may be a; console, xlib, qt3, qt4, + * gtk, mono, carbon, etc. + * + * SQLCreateDataSource + * (maps to ODBCCreateDataSource entry point in UI plugin) + * + * This function requires a HWND (and it must NOT be NULL as per ODBC spec.). So + * the caller should *always* init an ODBCINSTWND and cast it to HWND as it is passed to + * SQLCreateDataSource. + * + * SQLManageDataSources + * (maps to ODBCManageDataSources entry point in UI plugin) + * + * This function requires a HWND (and it must NOT be NULL as per ODBC spec.). So + * the caller should *always* init an ODBCINSTWND and cast it to HWND as it is passed to + * SQLManageDataSources. However; it may make sense to have a NULL hWnd... this is what + * an ODBC Administrator program would typically do. + * + * Plugin Selection + * + * 1. Passing a NULL to a function instead of a valid HODBCINSTWND may result in an error + * (this is the case with SQLCreateDataSource). In anycase; passing a NULL in this way + * negates the use of any UI plugin. + * + * 2. szUI has a value and it is the file name (no path and no extension) of the UI + * plugin. The plugin is loaded and the appropriate function is called with hWnd. The + * caller must have init hWnd in a manner which is appropriate for the UI plugin. + * + * 3. Passing an empty szUI indicates that the UI plugin should be determined by other + * means (see 4). In such a case it is dangerous to use hWnd because it may not match + * the type expected by the plugin. hWnd will be ignored and a NULL will be passed to the UI + * plugin. + * + * 4. The fallback logic for determining the UI plugin is as follows; + * - use the ODBCINSTUI environment variable to get the UI plugin file name + * - use the ODBCINSTUI value in odbcinst.ini to get the UI plugin file name + * + * NOTE: In the future we may want to consider making HWND of this type instead of having + * two different types and having to cast HODBCINSTWND into a HWND. + */ +typedef struct tODBCINSTWND +{ + char szUI[FILENAME_MAX]; /*!< Plugin file name (no path and no extension) ie "odbcinstQ4". */ + HWND hWnd; /*!< this is passed to the UI plugin - caller must know what the plugin is expecting */ + +} ODBCINSTWND, *HODBCINSTWND; + + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef ODBCVER +#define ODBCVER 0x0351 +#endif + +#ifndef WINVER +#define WINVER 0x0400 +#endif + +/* SQLConfigDataSource request flags */ +#define ODBC_ADD_DSN 1 +#define ODBC_CONFIG_DSN 2 +#define ODBC_REMOVE_DSN 3 + +#if (ODBCVER >= 0x0250) +#define ODBC_ADD_SYS_DSN 4 +#define ODBC_CONFIG_SYS_DSN 5 +#define ODBC_REMOVE_SYS_DSN 6 +#if (ODBCVER >= 0x0300) +#define ODBC_REMOVE_DEFAULT_DSN 7 +#endif /* ODBCVER >= 0x0300 */ + +/* install request flags */ +#define ODBC_INSTALL_INQUIRY 1 +#define ODBC_INSTALL_COMPLETE 2 + +/* config driver flags */ +#define ODBC_INSTALL_DRIVER 1 +#define ODBC_REMOVE_DRIVER 2 +#define ODBC_CONFIG_DRIVER 3 +#define ODBC_CONFIG_DRIVER_MAX 100 +#endif + +/* SQLGetConfigMode and SQLSetConfigMode flags */ +#if (ODBCVER >= 0x0300) +#define ODBC_BOTH_DSN 0 +#define ODBC_USER_DSN 1 +#define ODBC_SYSTEM_DSN 2 +#endif /* ODBCVER >= 0x0300 */ + +/* SQLInstallerError code */ +#if (ODBCVER >= 0x0300) +#define ODBC_ERROR_GENERAL_ERR 1 +#define ODBC_ERROR_INVALID_BUFF_LEN 2 +#define ODBC_ERROR_INVALID_HWND 3 +#define ODBC_ERROR_INVALID_STR 4 +#define ODBC_ERROR_INVALID_REQUEST_TYPE 5 +#define ODBC_ERROR_COMPONENT_NOT_FOUND 6 +#define ODBC_ERROR_INVALID_NAME 7 +#define ODBC_ERROR_INVALID_KEYWORD_VALUE 8 +#define ODBC_ERROR_INVALID_DSN 9 +#define ODBC_ERROR_INVALID_INF 10 +#define ODBC_ERROR_REQUEST_FAILED 11 +#define ODBC_ERROR_INVALID_PATH 12 +#define ODBC_ERROR_LOAD_LIB_FAILED 13 +#define ODBC_ERROR_INVALID_PARAM_SEQUENCE 14 +#define ODBC_ERROR_INVALID_LOG_FILE 15 +#define ODBC_ERROR_USER_CANCELED 16 +#define ODBC_ERROR_USAGE_UPDATE_FAILED 17 +#define ODBC_ERROR_CREATE_DSN_FAILED 18 +#define ODBC_ERROR_WRITING_SYSINFO_FAILED 19 +#define ODBC_ERROR_REMOVE_DSN_FAILED 20 +#define ODBC_ERROR_OUT_OF_MEM 21 +#define ODBC_ERROR_OUTPUT_STRING_TRUNCATED 22 +#endif /* ODBCVER >= 0x0300 */ + +#ifndef EXPORT +#define EXPORT +#endif + +#ifdef __OS2__ +#define INSTAPI _System +#else +#define INSTAPI +#endif + +/* HIGH LEVEL CALLS */ +BOOL INSTAPI SQLInstallODBC (HWND hwndParent, + LPCSTR lpszInfFile, + LPCSTR lpszSrcPath, + LPCSTR lpszDrivers); +BOOL INSTAPI SQLManageDataSources (HWND hwndParent); +BOOL INSTAPI SQLCreateDataSource (HWND hwndParent, + LPCSTR lpszDSN); +BOOL INSTAPI SQLGetTranslator (HWND hwnd, + LPSTR lpszName, + WORD cbNameMax, + WORD *pcbNameOut, + LPSTR lpszPath, + WORD cbPathMax, + WORD *pcbPathOut, + DWORD *pvOption); + +/* LOW LEVEL CALLS */ +BOOL INSTAPI SQLInstallDriver (LPCSTR lpszInfFile, + LPCSTR lpszDriver, + LPSTR lpszPath, + WORD cbPathMax, + WORD * pcbPathOut); +BOOL INSTAPI SQLInstallDriverManager (LPSTR lpszPath, + WORD cbPathMax, + WORD * pcbPathOut); +BOOL INSTAPI SQLGetInstalledDrivers (LPSTR lpszBuf, + WORD cbBufMax, + WORD * pcbBufOut); +BOOL INSTAPI SQLGetAvailableDrivers (LPCSTR lpszInfFile, + LPSTR lpszBuf, + WORD cbBufMax, + WORD * pcbBufOut); +BOOL INSTAPI SQLConfigDataSource (HWND hwndParent, + WORD fRequest, + LPCSTR lpszDriver, + LPCSTR lpszAttributes); +BOOL INSTAPI SQLRemoveDefaultDataSource(void); +BOOL INSTAPI SQLWriteDSNToIni (LPCSTR lpszDSN, + LPCSTR lpszDriver); +BOOL INSTAPI SQLRemoveDSNFromIni (LPCSTR lpszDSN); +BOOL INSTAPI SQLValidDSN (LPCSTR lpszDSN); + +BOOL INSTAPI SQLWritePrivateProfileString(LPCSTR lpszSection, + LPCSTR lpszEntry, + LPCSTR lpszString, + LPCSTR lpszFilename); + +int INSTAPI SQLGetPrivateProfileString( LPCSTR lpszSection, + LPCSTR lpszEntry, + LPCSTR lpszDefault, + LPSTR lpszRetBuffer, + int cbRetBuffer, + LPCSTR lpszFilename); + +#if (ODBCVER >= 0x0250) +BOOL INSTAPI SQLRemoveDriverManager(LPDWORD lpdwUsageCount); +BOOL INSTAPI SQLInstallTranslator(LPCSTR lpszInfFile, + LPCSTR lpszTranslator, + LPCSTR lpszPathIn, + LPSTR lpszPathOut, + WORD cbPathOutMax, + WORD *pcbPathOut, + WORD fRequest, + LPDWORD lpdwUsageCount); +BOOL INSTAPI SQLRemoveTranslator(LPCSTR lpszTranslator, + LPDWORD lpdwUsageCount); +BOOL INSTAPI SQLRemoveDriver(LPCSTR lpszDriver, + BOOL fRemoveDSN, + LPDWORD lpdwUsageCount); +BOOL INSTAPI SQLConfigDriver(HWND hwndParent, + WORD fRequest, + LPCSTR lpszDriver, + LPCSTR lpszArgs, + LPSTR lpszMsg, + WORD cbMsgMax, + WORD *pcbMsgOut); +#endif + +#if (ODBCVER >= 0x0300) +SQLRETURN INSTAPI SQLInstallerError(WORD iError, + DWORD *pfErrorCode, + LPSTR lpszErrorMsg, + WORD cbErrorMsgMax, + WORD *pcbErrorMsg); +SQLRETURN INSTAPI SQLPostInstallerError(DWORD dwErrorCode, LPCSTR lpszErrMsg); + +BOOL INSTAPI SQLWriteFileDSN(LPCSTR lpszFileName, + LPCSTR lpszAppName, + LPCSTR lpszKeyName, + LPCSTR lpszString); + +BOOL INSTAPI SQLReadFileDSN(LPCSTR lpszFileName, + LPCSTR lpszAppName, + LPCSTR lpszKeyName, + LPSTR lpszString, + WORD cbString, + WORD *pcbString); +BOOL INSTAPI SQLInstallDriverEx(LPCSTR lpszDriver, + LPCSTR lpszPathIn, + LPSTR lpszPathOut, + WORD cbPathOutMax, + WORD *pcbPathOut, + WORD fRequest, + LPDWORD lpdwUsageCount); +BOOL INSTAPI SQLInstallTranslatorEx(LPCSTR lpszTranslator, + LPCSTR lpszPathIn, + LPSTR lpszPathOut, + WORD cbPathOutMax, + WORD *pcbPathOut, + WORD fRequest, + LPDWORD lpdwUsageCount); +BOOL INSTAPI SQLGetConfigMode(UWORD *pwConfigMode); +BOOL INSTAPI SQLSetConfigMode(UWORD wConfigMode); +#endif /* ODBCVER >= 0x0300 */ + +/* Driver specific Setup APIs called by installer */ +BOOL INSTAPI ConfigDSN (HWND hwndParent, + WORD fRequest, + LPCSTR lpszDriver, + LPCSTR lpszAttributes); + +BOOL INSTAPI ConfigTranslator ( HWND hwndParent, + DWORD *pvOption); + +#if (ODBCVER >= 0x0250) +BOOL INSTAPI ConfigDriver(HWND hwndParent, + WORD fRequest, + LPCSTR lpszDriver, + LPCSTR lpszArgs, + LPSTR lpszMsg, + WORD cbMsgMax, + WORD *pcbMsgOut); +#endif + +/* + * UNICODE APIs + */ + +BOOL INSTAPI SQLInstallODBCW (HWND hwndParent, + LPCWSTR lpszInfFile, + LPCWSTR lpszSrcPath, + LPCWSTR lpszDrivers); +BOOL INSTAPI SQLCreateDataSourceW (HWND hwndParent, + LPCWSTR lpszDSN); + +BOOL INSTAPI SQLGetTranslatorW (HWND hwnd, + LPWSTR lpszName, + WORD cbNameMax, + WORD *pcbNameOut, + LPWSTR lpszPath, + WORD cbPathMax, + WORD *pcbPathOut, + DWORD *pvOption); +BOOL INSTAPI SQLInstallDriverW (LPCWSTR lpszInfFile, + LPCWSTR lpszDriver, + LPWSTR lpszPath, + WORD cbPathMax, + WORD * pcbPathOut); +BOOL INSTAPI SQLInstallDriverManagerW (LPWSTR lpszPath, + WORD cbPathMax, + WORD * pcbPathOut); +BOOL INSTAPI SQLGetInstalledDriversW (LPWSTR lpszBuf, + WORD cbBufMax, + WORD * pcbBufOut); +BOOL INSTAPI SQLGetAvailableDriversW (LPCWSTR lpszInfFile, + LPWSTR lpszBuf, + WORD cbBufMax, + WORD * pcbBufOut); +BOOL INSTAPI SQLConfigDataSourceW (HWND hwndParent, + WORD fRequest, + LPCWSTR lpszDriver, + LPCWSTR lpszAttributes); +BOOL INSTAPI SQLWriteDSNToIniW (LPCWSTR lpszDSN, + LPCWSTR lpszDriver); +BOOL INSTAPI SQLRemoveDSNFromIniW (LPCWSTR lpszDSN); +BOOL INSTAPI SQLValidDSNW (LPCWSTR lpszDSN); + +BOOL INSTAPI SQLWritePrivateProfileStringW(LPCWSTR lpszSection, + LPCWSTR lpszEntry, + LPCWSTR lpszString, + LPCWSTR lpszFilename); + +int INSTAPI SQLGetPrivateProfileStringW( LPCWSTR lpszSection, + LPCWSTR lpszEntry, + LPCWSTR lpszDefault, + LPWSTR lpszRetBuffer, + int cbRetBuffer, + LPCWSTR lpszFilename); + +#if (ODBCVER >= 0x0250) +BOOL INSTAPI SQLInstallTranslatorW(LPCWSTR lpszInfFile, + LPCWSTR lpszTranslator, + LPCWSTR lpszPathIn, + LPWSTR lpszPathOut, + WORD cbPathOutMax, + WORD *pcbPathOut, + WORD fRequest, + LPDWORD lpdwUsageCount); +BOOL INSTAPI SQLRemoveTranslatorW(LPCWSTR lpszTranslator, + LPDWORD lpdwUsageCount); +BOOL INSTAPI SQLRemoveDriverW(LPCWSTR lpszDriver, + BOOL fRemoveDSN, + LPDWORD lpdwUsageCount); +BOOL INSTAPI SQLConfigDriverW(HWND hwndParent, + WORD fRequest, + LPCWSTR lpszDriver, + LPCWSTR lpszArgs, + LPWSTR lpszMsg, + WORD cbMsgMax, + WORD *pcbMsgOut); +#endif + +#if (ODBCVER >= 0x0300) +SQLRETURN INSTAPI SQLInstallerErrorW(WORD iError, + DWORD *pfErrorCode, + LPWSTR lpszErrorMsg, + WORD cbErrorMsgMax, + WORD *pcbErrorMsg); +SQLRETURN INSTAPI SQLPostInstallerErrorW(DWORD dwErrorCode, + LPCWSTR lpszErrorMsg); + +BOOL INSTAPI SQLWriteFileDSNW(LPCWSTR lpszFileName, + LPCWSTR lpszAppName, + LPCWSTR lpszKeyName, + LPCWSTR lpszString); + +BOOL INSTAPI SQLReadFileDSNW(LPCWSTR lpszFileName, + LPCWSTR lpszAppName, + LPCWSTR lpszKeyName, + LPWSTR lpszString, + WORD cbString, + WORD *pcbString); +BOOL INSTAPI SQLInstallDriverExW(LPCWSTR lpszDriver, + LPCWSTR lpszPathIn, + LPWSTR lpszPathOut, + WORD cbPathOutMax, + WORD *pcbPathOut, + WORD fRequest, + LPDWORD lpdwUsageCount); +BOOL INSTAPI SQLInstallTranslatorExW(LPCWSTR lpszTranslator, + LPCWSTR lpszPathIn, + LPWSTR lpszPathOut, + WORD cbPathOutMax, + WORD *pcbPathOut, + WORD fRequest, + LPDWORD lpdwUsageCount); +#endif /* ODBCVER >= 0x0300 */ + +/* Driver specific Setup APIs called by installer */ + +BOOL INSTAPI ConfigDSNW (HWND hwndParent, + WORD fRequest, + LPCWSTR lpszDriver, + LPCWSTR lpszAttributes); + + +#if (ODBCVER >= 0x0250) +BOOL INSTAPI ConfigDriverW(HWND hwndParent, + WORD fRequest, + LPCWSTR lpszDriver, + LPCWSTR lpszArgs, + LPWSTR lpszMsg, + WORD cbMsgMax, + WORD *pcbMsgOut); +#endif + +#ifndef SQL_NOUNICODEMAP /* define this to disable the mapping */ +#ifdef UNICODE + +#define SQLInstallODBC SQLInstallODBCW +#define SQLCreateDataSource SQLCreateDataSourceW +#define SQLGetTranslator SQLGetTranslatorW +#define SQLInstallDriver SQLInstallDriverW +#define SQLInstallDriverManager SQLInstallDriverManagerW +#define SQLGetInstalledDrivers SQLGetInstalledDriversW +#define SQLGetAvailableDrivers SQLGetAvailableDriversW +#define SQLConfigDataSource SQLConfigDataSourceW +#define SQLWriteDSNToIni SQLWriteDSNToIniW +#define SQLRemoveDSNFromIni SQLRemoveDSNFromIniW +#define SQLValidDSN SQLValidDSNW +#define SQLWritePrivateProfileString SQLWritePrivateProfileStringW +#define SQLGetPrivateProfileString SQLGetPrivateProfileStringW +#define SQLInstallTranslator SQLInstallTranslatorW +#define SQLRemoveTranslator SQLRemoveTranslatorW +#define SQLRemoveDriver SQLRemoveDriverW +#define SQLConfigDriver SQLConfigDriverW +#define SQLInstallerError SQLInstallerErrorW +#define SQLPostInstallerError SQLPostInstallerErrorW +#define SQLReadFileDSN SQLReadFileDSNW +#define SQLWriteFileDSN SQLWriteFileDSNW +#define SQLInstallDriverEx SQLInstallDriverExW +#define SQLInstallTranslatorEx SQLInstallTranslatorExW + +#endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/mssql_python/libs/macos/odbc_include/odbcinstext.h b/mssql_python/libs/macos/odbc_include/odbcinstext.h new file mode 100644 index 00000000..6bdaf670 --- /dev/null +++ b/mssql_python/libs/macos/odbc_include/odbcinstext.h @@ -0,0 +1,369 @@ +/************************************************** + * odbcinstext.h + * + ************************************************** + * This code was created by Peter Harvey @ CodeByDesign. + * Released under LGPL 28.JAN.99 + * + * Contributions from... + * ----------------------------------------------- + * Peter Harvey - pharvey@codebydesign.com + **************************************************/ +#ifndef _ODBCINST_H +#define _ODBCINST_H + +#ifdef UNIXODBC_SOURCE + +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_PWD_H +#include +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif + +#ifndef ODBCVER +#define ODBCVER 0x0380 +#endif + +#include +#include +#include + +/******************************************************** + * CONSTANTS WHICH DO NOT EXIST ELSEWHERE + ********************************************************/ +#ifndef TRUE +#define FALSE 0; +#define TRUE 1; +#endif + +#else /* not UNIXODBC_SOURCE */ + +/******************************************************** + * outside the unixODBC source tree only the * + * public interface is exposed * + ********************************************************/ + +#include + +/******************************************************** + * these limits are originally defined in ini.h * + * but are needed to implement ODBCINSTGetProperties * + * for the Driver Setup * + ********************************************************/ + +#define INI_MAX_LINE 1000 +#define INI_MAX_OBJECT_NAME INI_MAX_LINE +#define INI_MAX_PROPERTY_NAME INI_MAX_LINE +#define INI_MAX_PROPERTY_VALUE INI_MAX_LINE + +#endif /* UNIXODBC_SOURCE */ + +/******************************************************** + * PUBLIC API + ********************************************************/ + +#ifdef __cplusplus +extern "C" +{ +#endif + +BOOL INSTAPI SQLConfigDataSource( HWND hWnd, + WORD nRequest, + LPCSTR pszDriver, + LPCSTR pszAttributes ); + +BOOL INSTAPI SQLGetConfigMode( UWORD *pnConfigMode ); + +BOOL INSTAPI SQLGetInstalledDrivers( LPSTR pszBuf, + WORD nBufMax, + WORD *pnBufOut ); + +BOOL INSTAPI SQLInstallDriverEx( LPCSTR pszDriver, + LPCSTR pszPathIn, + LPSTR pszPathOut, + WORD nPathOutMax, + WORD *nPathOut, + WORD nRequest, + LPDWORD pnUsageCount ); + +BOOL INSTAPI SQLInstallDriverManager( LPSTR pszPath, + WORD nPathMax, + WORD *pnPathOut ); + +RETCODE INSTAPI SQLInstallerError( WORD nError, + DWORD *pnErrorCode, + LPSTR pszErrorMsg, + WORD nErrorMsgMax, + WORD *nErrorMsg ); + +BOOL INSTAPI SQLManageDataSources( HWND hWnd ); + +BOOL INSTAPI SQLReadFileDSN( LPCSTR pszFileName, + LPCSTR pszAppName, + LPCSTR pszKeyName, + LPSTR pszString, + WORD nString, + WORD *pnString ); + +BOOL INSTAPI SQLRemoveDriver( LPCSTR pszDriver, + BOOL nRemoveDSN, + LPDWORD pnUsageCount ); + +BOOL INSTAPI SQLRemoveDriverManager( LPDWORD pnUsageCount ); + +BOOL INSTAPI SQLRemoveDSNFromIni( LPCSTR pszDSN ); + +BOOL INSTAPI SQLRemoveTranslator( LPCSTR pszTranslator, + LPDWORD pnUsageCount ); + +BOOL INSTAPI SQLSetConfigMode( UWORD nConfigMode ); + +BOOL INSTAPI SQLValidDSN( LPCSTR pszDSN ); + +BOOL INSTAPI SQLWriteDSNToIni( LPCSTR pszDSN, + LPCSTR pszDriver ); + +BOOL INSTAPI SQLWriteFileDSN( LPCSTR pszFileName, + LPCSTR pszAppName, + LPCSTR pszKeyName, + LPCSTR pszString ); + +BOOL INSTAPI SQLWritePrivateProfileString( + LPCSTR pszSection, + LPCSTR pszEntry, + LPCSTR pszString, + LPCSTR pszFileName ); + + + +#ifdef __cplusplus +} +#endif + +#ifdef UNIXODBC_SOURCE + +/******************************************************** + * PRIVATE API + ********************************************************/ +#if defined(__cplusplus) + extern "C" { +#endif + +BOOL _odbcinst_UserINI( + char *pszFileName, + BOOL bVerify ); + +BOOL _odbcinst_SystemINI( + char *pszFileName, + BOOL bVerify ); + +BOOL _odbcinst_FileINI( char *pszPath ); + +char * INSTAPI odbcinst_system_file_path( char *buffer ); +char * INSTAPI odbcinst_system_file_name( char *buffer ); +char * INSTAPI odbcinst_user_file_path( char *buffer ); +char * INSTAPI odbcinst_user_file_name( char *buffer ); + +BOOL _odbcinst_ConfigModeINI( + char *pszFileName ); + +int _odbcinst_GetSections( + HINI hIni, + LPSTR pRetBuffer, + int nRetBuffer, + int *pnBufPos ); + +int _odbcinst_GetEntries( + HINI hIni, + LPCSTR pszSection, + LPSTR pRetBuffer, + int nRetBuffer, + int *pnBufPos ); + +int _SQLGetInstalledDrivers( + LPCSTR pszSection, + LPCSTR pszEntry, + LPCSTR pszDefault, + LPCSTR pRetBuffer, + int nRetBuffer ); + +BOOL _SQLWriteInstalledDrivers( + LPCSTR pszSection, + LPCSTR pszEntry, + LPCSTR pszString ); + +BOOL _SQLDriverConnectPrompt( + HWND hwnd, + SQLCHAR *dsn, + SQLSMALLINT len_dsn ); + +BOOL _SQLDriverConnectPromptW( + HWND hwnd, + SQLWCHAR *dsn, + SQLSMALLINT len_dsn ); + +void __set_config_mode( int mode ); +int __get_config_mode( void ); + +int inst_logPushMsg( + char *pszModule, + char *pszFunctionName, + int nLine, + int nSeverity, + int nCode, + char *pszMessage ); + +int inst_logPeekMsg( long nMsg, HLOGMSG *phMsg ); +int inst_logClear(); + + +/* + * we should look at caching this info, the calls can become expensive + */ + +#ifndef DISABLE_INI_CACHING + +struct ini_cache +{ + char *fname; + char *section; + char *entry; + char *value; + char *default_value; + int buffer_size; + int ret_value; + int config_mode; + long timestamp; + struct ini_cache *next; +}; + +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* UNIXODBC_SOURCE */ + +/********************************* + * ODBCINST - PROPERTIES + ********************************* + * + * PURPOSE: + * + * To provide the caller a mechanism to interact with Data Source properties + * containing Driver specific options while avoiding embedding GUI code in + * the ODBC infrastructure. + * + * DETAILS: + * + * 1. Application calls libodbcinst.ODBCINSTConstructProperties() + * - odbcinst will load the driver and call libMyDrvS.ODBCINSTGetProperties() to build a list of all possible properties + * 2. Application calls libodbcinst.ODBCINSTSetProperty() + * - use, as required, to init values (ie if configuring existing DataSource) + * - use libodbcinst.SetConfigMode() & libodbcinst.SQLGetPrivateProfileString() to read existing Data Source info (do not forget to set the mode back) + * - do not forget to set mode back to ODBC_BOTH_DSN using SetConfigMode() when done reading + * - no call to Driver Setup + * 3. Application calls libodbcinst.ODBCINSTValidateProperty() + * - use as required (ie on leave widget event) + * - an assesment of the entire property list is also done + * - this is passed onto the driver setup DLL + * 4. Application should refresh widgets in case aPromptData or szValue has changed + * - refresh should occur for each property where bRefresh = 1 + * 5. Application calls libodbcinst.ODBCINSTValidateProperties() + * - call this just before saving new Data Source or updating existing Data Source + * - should always call this before saving + * - use libodbcinst.SetConfigMode() & libodbcinst.SQLWritePrivateProfileString() to save Data Source info + * - do not forget to set mode back to ODBC_BOTH_DSN using SetConfigMode() when done saving + * - this is passed onto the driver setup DLL + * 6. Application calls ODBCINSTDestructProperties() to free up memory + * - unload Driver Setup DLL + * - frees memory (Driver Setup allocates most of the memory but we free ALL of it in odbcinst) + * + * NOTES + * + * 1. odbcinst implements 5 functions to support this GUI config stuff + * 2. Driver Setup DLL implements just 3 functions for its share of the work + * + *********************************/ + +#define ODBCINST_SUCCESS 0 +#define ODBCINST_WARNING 1 +#define ODBCINST_ERROR 2 + +#define ODBCINST_PROMPTTYPE_LABEL 0 /* readonly */ +#define ODBCINST_PROMPTTYPE_TEXTEDIT 1 +#define ODBCINST_PROMPTTYPE_LISTBOX 2 +#define ODBCINST_PROMPTTYPE_COMBOBOX 3 +#define ODBCINST_PROMPTTYPE_FILENAME 4 +#define ODBCINST_PROMPTTYPE_HIDDEN 5 +#define ODBCINST_PROMPTTYPE_TEXTEDIT_PASSWORD 6 + +typedef struct tODBCINSTPROPERTY +{ + struct tODBCINSTPROPERTY *pNext; /* pointer to next property, NULL if last property */ + + char szName[INI_MAX_PROPERTY_NAME+1]; /* property name */ + char szValue[INI_MAX_PROPERTY_VALUE+1]; /* property value */ + int nPromptType; /* PROMPTTYPE_TEXTEDIT, PROMPTTYPE_LISTBOX, PROMPTTYPE_COMBOBOX, PROMPTTYPE_FILENAME */ + char **aPromptData; /* array of pointers terminated with a NULL value in array. */ + char *pszHelp; /* help on this property (driver setups should keep it short) */ + void *pWidget; /* CALLER CAN STORE A POINTER TO ? HERE */ + int bRefresh; /* app should refresh widget ie Driver Setup has changed aPromptData or szValue */ + void *hDLL; /* for odbcinst internal use... only first property has valid one */ +} ODBCINSTPROPERTY, *HODBCINSTPROPERTY; + +/* + * Plugin name + */ + +#define ODBCINSTPLUGIN "odbcinstQ5" + +/* + * Conversion routines for wide interface + */ + +char* _multi_string_alloc_and_copy( LPCWSTR in ); +char* _single_string_alloc_and_copy( LPCWSTR in ); +void _single_string_copy_to_wide( SQLWCHAR *out, LPCSTR in, int len ); +int _multi_string_copy_to_wide( SQLWCHAR *out, LPCSTR in, int len ); +int _single_copy_to_wide( SQLWCHAR *out, LPCSTR in, int len ); +SQLWCHAR* _multi_string_alloc_and_expand( LPCSTR in ); +SQLWCHAR* _single_string_alloc_and_expand( LPCSTR in ); +void _single_copy_from_wide( SQLCHAR *out, LPCWSTR in, int len ); +int _multi_string_length( LPCSTR in ); + +/* + * To support finding UI plugin + */ +char *_getUIPluginName( char *pszName, char *pszUI ); +char *_appendUIPluginExtension( char *pszNameAndExtension, char *pszName ); +char *_prependUIPluginPath( char *pszPathAndName, char *pszName ); + +#if defined(__cplusplus) + extern "C" { +#endif + +/* ONLY IMPLEMENTED IN ODBCINST (not in Driver Setup) */ +int INSTAPI ODBCINSTConstructProperties( char *szDriver, HODBCINSTPROPERTY *hFirstProperty ); +int INSTAPI ODBCINSTSetProperty( HODBCINSTPROPERTY hFirstProperty, char *pszProperty, char *pszValue ); +int INSTAPI ODBCINSTDestructProperties( HODBCINSTPROPERTY *hFirstProperty ); +int INSTAPI ODBCINSTAddProperty( HODBCINSTPROPERTY hFirstProperty, char *pszProperty, char *pszValue ); + +/* IMPLEMENTED IN ODBCINST AND DRIVER SETUP */ +int INSTAPI ODBCINSTValidateProperty( HODBCINSTPROPERTY hFirstProperty, char *pszProperty, char *pszMessage ); +int INSTAPI ODBCINSTValidateProperties( HODBCINSTPROPERTY hFirstProperty, HODBCINSTPROPERTY hBadProperty, char *pszMessage ); + +/* ONLY IMPLEMENTED IN DRIVER SETUP (not in ODBCINST) */ +int INSTAPI ODBCINSTGetProperties( HODBCINSTPROPERTY hFirstProperty ); + +#if defined(__cplusplus) + } +#endif + +#endif + diff --git a/mssql_python/libs/macos/odbc_include/sql.h b/mssql_python/libs/macos/odbc_include/sql.h new file mode 100644 index 00000000..7f0ce009 --- /dev/null +++ b/mssql_python/libs/macos/odbc_include/sql.h @@ -0,0 +1,839 @@ +/************************************************** + * sql.h + * + * These should be consistent with the MS version. + * + **************************************************/ +#ifndef __SQL_H +#define __SQL_H + + +/**************************** + * default to 3.51 declare something else before here and you get a whole new ball of wax + ***************************/ +#ifndef ODBCVER +#define ODBCVER 0x0380 +#endif + +#ifndef __SQLTYPES_H +#include "sqltypes.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/**************************** + * some ret values + ***************************/ +#define SQL_NULL_DATA (-1) +#define SQL_DATA_AT_EXEC (-2) +#define SQL_SUCCESS 0 +#define SQL_SUCCESS_WITH_INFO 1 +#if (ODBCVER >= 0x0300) +#define SQL_NO_DATA 100 +#endif +#define SQL_ERROR (-1) +#define SQL_INVALID_HANDLE (-2) +#define SQL_STILL_EXECUTING 2 +#define SQL_NEED_DATA 99 +#define SQL_SUCCEEDED(rc) (((rc)&(~1))==0) + +#if (ODBCVER >= 0x0380) +#define SQL_PARAM_DATA_AVAILABLE 101 +#endif + +/**************************** + * use these to indicate string termination to some function + ***************************/ +#define SQL_NTS (-3) +#define SQL_NTSL (-3L) + +/* maximum message length */ +#define SQL_MAX_MESSAGE_LENGTH 512 + +/* date/time length constants */ +#if (ODBCVER >= 0x0300) +#define SQL_DATE_LEN 10 +#define SQL_TIME_LEN 8 /* add P+1 if precision is nonzero */ +#define SQL_TIMESTAMP_LEN 19 /* add P+1 if precision is nonzero */ +#endif + +/* handle type identifiers */ +#if (ODBCVER >= 0x0300) +#define SQL_HANDLE_ENV 1 +#define SQL_HANDLE_DBC 2 +#define SQL_HANDLE_STMT 3 +#define SQL_HANDLE_DESC 4 +#endif + +/* environment attribute */ +#if (ODBCVER >= 0x0300) +#define SQL_ATTR_OUTPUT_NTS 10001 +#endif + +/* connection attributes */ +#if (ODBCVER >= 0x0300) +#define SQL_ATTR_AUTO_IPD 10001 +#define SQL_ATTR_METADATA_ID 10014 +#endif /* ODBCVER >= 0x0300 */ + +/* statement attributes */ +#if (ODBCVER >= 0x0300) +#define SQL_ATTR_APP_ROW_DESC 10010 +#define SQL_ATTR_APP_PARAM_DESC 10011 +#define SQL_ATTR_IMP_ROW_DESC 10012 +#define SQL_ATTR_IMP_PARAM_DESC 10013 +#define SQL_ATTR_CURSOR_SCROLLABLE (-1) +#define SQL_ATTR_CURSOR_SENSITIVITY (-2) +#endif + +/* SQL_ATTR_CURSOR_SCROLLABLE values */ +#if (ODBCVER >= 0x0300) +#define SQL_NONSCROLLABLE 0 +#define SQL_SCROLLABLE 1 +#endif /* ODBCVER >= 0x0300 */ + +/* identifiers of fields in the SQL descriptor */ +#if (ODBCVER >= 0x0300) +#define SQL_DESC_COUNT 1001 +#define SQL_DESC_TYPE 1002 +#define SQL_DESC_LENGTH 1003 +#define SQL_DESC_OCTET_LENGTH_PTR 1004 +#define SQL_DESC_PRECISION 1005 +#define SQL_DESC_SCALE 1006 +#define SQL_DESC_DATETIME_INTERVAL_CODE 1007 +#define SQL_DESC_NULLABLE 1008 +#define SQL_DESC_INDICATOR_PTR 1009 +#define SQL_DESC_DATA_PTR 1010 +#define SQL_DESC_NAME 1011 +#define SQL_DESC_UNNAMED 1012 +#define SQL_DESC_OCTET_LENGTH 1013 +#define SQL_DESC_ALLOC_TYPE 1099 +#endif + +/* identifiers of fields in the diagnostics area */ +#if (ODBCVER >= 0x0300) +#define SQL_DIAG_RETURNCODE 1 +#define SQL_DIAG_NUMBER 2 +#define SQL_DIAG_ROW_COUNT 3 +#define SQL_DIAG_SQLSTATE 4 +#define SQL_DIAG_NATIVE 5 +#define SQL_DIAG_MESSAGE_TEXT 6 +#define SQL_DIAG_DYNAMIC_FUNCTION 7 +#define SQL_DIAG_CLASS_ORIGIN 8 +#define SQL_DIAG_SUBCLASS_ORIGIN 9 +#define SQL_DIAG_CONNECTION_NAME 10 +#define SQL_DIAG_SERVER_NAME 11 +#define SQL_DIAG_DYNAMIC_FUNCTION_CODE 12 +#endif + +/* dynamic function codes */ +#if (ODBCVER >= 0x0300) +#define SQL_DIAG_ALTER_DOMAIN 3 +#define SQL_DIAG_ALTER_TABLE 4 +#define SQL_DIAG_CALL 7 +#define SQL_DIAG_CREATE_ASSERTION 6 +#define SQL_DIAG_CREATE_CHARACTER_SET 8 +#define SQL_DIAG_CREATE_COLLATION 10 +#define SQL_DIAG_CREATE_DOMAIN 23 +#define SQL_DIAG_CREATE_INDEX (-1) +#define SQL_DIAG_CREATE_SCHEMA 64 +#define SQL_DIAG_CREATE_TABLE 77 +#define SQL_DIAG_CREATE_TRANSLATION 79 +#define SQL_DIAG_CREATE_VIEW 84 +#define SQL_DIAG_DELETE_WHERE 19 +#define SQL_DIAG_DROP_ASSERTION 24 +#define SQL_DIAG_DROP_CHARACTER_SET 25 +#define SQL_DIAG_DROP_COLLATION 26 +#define SQL_DIAG_DROP_DOMAIN 27 +#define SQL_DIAG_DROP_INDEX (-2) +#define SQL_DIAG_DROP_SCHEMA 31 +#define SQL_DIAG_DROP_TABLE 32 +#define SQL_DIAG_DROP_TRANSLATION 33 +#define SQL_DIAG_DROP_VIEW 36 +#define SQL_DIAG_DYNAMIC_DELETE_CURSOR 38 +#define SQL_DIAG_DYNAMIC_UPDATE_CURSOR 81 +#define SQL_DIAG_GRANT 48 +#define SQL_DIAG_INSERT 50 +#define SQL_DIAG_REVOKE 59 +#define SQL_DIAG_SELECT_CURSOR 85 +#define SQL_DIAG_UNKNOWN_STATEMENT 0 +#define SQL_DIAG_UPDATE_WHERE 82 +#endif /* ODBCVER >= 0x0300 */ + +/* SQL data type codes */ +#define SQL_UNKNOWN_TYPE 0 +#define SQL_CHAR 1 +#define SQL_NUMERIC 2 +#define SQL_DECIMAL 3 +#define SQL_INTEGER 4 +#define SQL_SMALLINT 5 +#define SQL_FLOAT 6 +#define SQL_REAL 7 +#define SQL_DOUBLE 8 +#if (ODBCVER >= 0x0300) +#define SQL_DATETIME 9 +#endif +#define SQL_VARCHAR 12 + +/* One-parameter shortcuts for date/time data types */ +#if (ODBCVER >= 0x0300) +#define SQL_TYPE_DATE 91 +#define SQL_TYPE_TIME 92 +#define SQL_TYPE_TIMESTAMP 93 +#endif + +/* Statement attribute values for cursor sensitivity */ +#if (ODBCVER >= 0x0300) +#define SQL_UNSPECIFIED 0 +#define SQL_INSENSITIVE 1 +#define SQL_SENSITIVE 2 +#endif + +/* GetTypeInfo() request for all data types */ +#define SQL_ALL_TYPES 0 + +/* Default conversion code for SQLBindCol(), SQLBindParam() and SQLGetData() */ +#if (ODBCVER >= 0x0300) +#define SQL_DEFAULT 99 +#endif + +/* SQLGetData() code indicating that the application row descriptor + * specifies the data type + */ +#if (ODBCVER >= 0x0300) +#define SQL_ARD_TYPE (-99) +#endif + +/* SQL date/time type subcodes */ +#if (ODBCVER >= 0x0300) +#define SQL_CODE_DATE 1 +#define SQL_CODE_TIME 2 +#define SQL_CODE_TIMESTAMP 3 +#endif + +/* CLI option values */ +#if (ODBCVER >= 0x0300) +#define SQL_FALSE 0 +#define SQL_TRUE 1 +#endif + +/* values of NULLABLE field in descriptor */ +#define SQL_NO_NULLS 0 +#define SQL_NULLABLE 1 + +/* Value returned by SQLGetTypeInfo() to denote that it is + * not known whether or not a data type supports null values. + */ +#define SQL_NULLABLE_UNKNOWN 2 + +/* Values returned by SQLGetTypeInfo() to show WHERE clause + * supported + */ +#if (ODBCVER >= 0x0300) +#define SQL_PRED_NONE 0 +#define SQL_PRED_CHAR 1 +#define SQL_PRED_BASIC 2 +#endif + +/* values of UNNAMED field in descriptor */ +#if (ODBCVER >= 0x0300) +#define SQL_NAMED 0 +#define SQL_UNNAMED 1 +#endif + +/* values of ALLOC_TYPE field in descriptor */ +#if (ODBCVER >= 0x0300) +#define SQL_DESC_ALLOC_AUTO 1 +#define SQL_DESC_ALLOC_USER 2 +#endif + +/* FreeStmt() options */ +#define SQL_CLOSE 0 +#define SQL_DROP 1 +#define SQL_UNBIND 2 +#define SQL_RESET_PARAMS 3 + +/* Codes used for FetchOrientation in SQLFetchScroll(), + and in SQLDataSources() +*/ +#define SQL_FETCH_NEXT 1 +#define SQL_FETCH_FIRST 2 + +/* Other codes used for FetchOrientation in SQLFetchScroll() */ +#define SQL_FETCH_LAST 3 +#define SQL_FETCH_PRIOR 4 +#define SQL_FETCH_ABSOLUTE 5 +#define SQL_FETCH_RELATIVE 6 + +/* SQLEndTran() options */ +#define SQL_COMMIT 0 +#define SQL_ROLLBACK 1 + +/* null handles returned by SQLAllocHandle() */ +#define SQL_NULL_HENV 0 +#define SQL_NULL_HDBC 0 +#define SQL_NULL_HSTMT 0 +#if (ODBCVER >= 0x0300) +#define SQL_NULL_HDESC 0 +#define SQL_NULL_DESC 0 +#endif + +/* null handle used in place of parent handle when allocating HENV */ +#if (ODBCVER >= 0x0300) +#define SQL_NULL_HANDLE 0L +#endif + +/* Values that may appear in the result set of SQLSpecialColumns() */ +#define SQL_SCOPE_CURROW 0 +#define SQL_SCOPE_TRANSACTION 1 +#define SQL_SCOPE_SESSION 2 + +#define SQL_PC_UNKNOWN 0 +#if (ODBCVER >= 0x0300) +#define SQL_PC_NON_PSEUDO 1 +#endif +#define SQL_PC_PSEUDO 2 + +/* Reserved value for the IdentifierType argument of SQLSpecialColumns() */ +#if (ODBCVER >= 0x0300) +#define SQL_ROW_IDENTIFIER 1 +#endif + +/* Reserved values for UNIQUE argument of SQLStatistics() */ +#define SQL_INDEX_UNIQUE 0 +#define SQL_INDEX_ALL 1 + +/* Values that may appear in the result set of SQLStatistics() */ +#define SQL_INDEX_CLUSTERED 1 +#define SQL_INDEX_HASHED 2 +#define SQL_INDEX_OTHER 3 + +/* SQLGetFunctions() values to identify ODBC APIs */ +#define SQL_API_SQLALLOCCONNECT 1 +#define SQL_API_SQLALLOCENV 2 +#if (ODBCVER >= 0x0300) +#define SQL_API_SQLALLOCHANDLE 1001 +#endif +#define SQL_API_SQLALLOCSTMT 3 +#define SQL_API_SQLBINDCOL 4 +#if (ODBCVER >= 0x0300) +#define SQL_API_SQLBINDPARAM 1002 +#endif +#define SQL_API_SQLCANCEL 5 +#if (ODBCVER >= 0x0300) +#define SQL_API_SQLCLOSECURSOR 1003 +#define SQL_API_SQLCOLATTRIBUTE 6 +#endif +#define SQL_API_SQLCOLUMNS 40 +#define SQL_API_SQLCONNECT 7 +#if (ODBCVER >= 0x0300) +#define SQL_API_SQLCOPYDESC 1004 +#endif +#define SQL_API_SQLDATASOURCES 57 +#define SQL_API_SQLDESCRIBECOL 8 +#define SQL_API_SQLDISCONNECT 9 +#if (ODBCVER >= 0x0300) +#define SQL_API_SQLENDTRAN 1005 +#endif +#define SQL_API_SQLERROR 10 +#define SQL_API_SQLEXECDIRECT 11 +#define SQL_API_SQLEXECUTE 12 +#define SQL_API_SQLFETCH 13 +#if (ODBCVER >= 0x0300) +#define SQL_API_SQLFETCHSCROLL 1021 +#endif +#define SQL_API_SQLFREECONNECT 14 +#define SQL_API_SQLFREEENV 15 +#if (ODBCVER >= 0x0300) +#define SQL_API_SQLFREEHANDLE 1006 +#endif +#define SQL_API_SQLFREESTMT 16 +#if (ODBCVER >= 0x0300) +#define SQL_API_SQLGETCONNECTATTR 1007 +#endif +#define SQL_API_SQLGETCONNECTOPTION 42 +#define SQL_API_SQLGETCURSORNAME 17 +#define SQL_API_SQLGETDATA 43 +#if (ODBCVER >= 0x0300) +#define SQL_API_SQLGETDESCFIELD 1008 +#define SQL_API_SQLGETDESCREC 1009 +#define SQL_API_SQLGETDIAGFIELD 1010 +#define SQL_API_SQLGETDIAGREC 1011 +#define SQL_API_SQLGETENVATTR 1012 +#endif +#define SQL_API_SQLGETFUNCTIONS 44 +#define SQL_API_SQLGETINFO 45 +#if (ODBCVER >= 0x0300) +#define SQL_API_SQLGETSTMTATTR 1014 +#endif +#define SQL_API_SQLGETSTMTOPTION 46 +#define SQL_API_SQLGETTYPEINFO 47 +#define SQL_API_SQLNUMRESULTCOLS 18 +#define SQL_API_SQLPARAMDATA 48 +#define SQL_API_SQLPREPARE 19 +#define SQL_API_SQLPUTDATA 49 +#define SQL_API_SQLROWCOUNT 20 +#if (ODBCVER >= 0x0300) +#define SQL_API_SQLSETCONNECTATTR 1016 +#endif +#define SQL_API_SQLSETCONNECTOPTION 50 +#define SQL_API_SQLSETCURSORNAME 21 +#if (ODBCVER >= 0x0300) +#define SQL_API_SQLSETDESCFIELD 1017 +#define SQL_API_SQLSETDESCREC 1018 +#define SQL_API_SQLSETENVATTR 1019 +#endif +#define SQL_API_SQLSETPARAM 22 +#if (ODBCVER >= 0x0300) +#define SQL_API_SQLSETSTMTATTR 1020 +#endif +#define SQL_API_SQLSETSTMTOPTION 51 +#define SQL_API_SQLSPECIALCOLUMNS 52 +#define SQL_API_SQLSTATISTICS 53 +#define SQL_API_SQLTABLES 54 +#define SQL_API_SQLTRANSACT 23 + +#if (ODBCVER >= 0x0380) +#define SQL_API_SQLCANCELHANDLE 1022 +#endif + +/* Information requested by SQLGetInfo() */ +#if (ODBCVER >= 0x0300) +#define SQL_MAX_DRIVER_CONNECTIONS 0 +#define SQL_MAXIMUM_DRIVER_CONNECTIONS SQL_MAX_DRIVER_CONNECTIONS +#define SQL_MAX_CONCURRENT_ACTIVITIES 1 +#define SQL_MAXIMUM_CONCURRENT_ACTIVITIES SQL_MAX_CONCURRENT_ACTIVITIES +#endif +#define SQL_DATA_SOURCE_NAME 2 +#define SQL_FETCH_DIRECTION 8 +#define SQL_SERVER_NAME 13 +#define SQL_SEARCH_PATTERN_ESCAPE 14 +#define SQL_DBMS_NAME 17 +#define SQL_DBMS_VER 18 +#define SQL_ACCESSIBLE_TABLES 19 +#define SQL_ACCESSIBLE_PROCEDURES 20 +#define SQL_CURSOR_COMMIT_BEHAVIOR 23 +#define SQL_DATA_SOURCE_READ_ONLY 25 +#define SQL_DEFAULT_TXN_ISOLATION 26 +#define SQL_IDENTIFIER_CASE 28 +#define SQL_IDENTIFIER_QUOTE_CHAR 29 +#define SQL_MAX_COLUMN_NAME_LEN 30 +#define SQL_MAXIMUM_COLUMN_NAME_LENGTH SQL_MAX_COLUMN_NAME_LEN +#define SQL_MAX_CURSOR_NAME_LEN 31 +#define SQL_MAXIMUM_CURSOR_NAME_LENGTH SQL_MAX_CURSOR_NAME_LEN +#define SQL_MAX_SCHEMA_NAME_LEN 32 +#define SQL_MAXIMUM_SCHEMA_NAME_LENGTH SQL_MAX_SCHEMA_NAME_LEN +#define SQL_MAX_CATALOG_NAME_LEN 34 +#define SQL_MAXIMUM_CATALOG_NAME_LENGTH SQL_MAX_CATALOG_NAME_LEN +#define SQL_MAX_TABLE_NAME_LEN 35 +#define SQL_SCROLL_CONCURRENCY 43 +#define SQL_TXN_CAPABLE 46 +#define SQL_TRANSACTION_CAPABLE SQL_TXN_CAPABLE +#define SQL_USER_NAME 47 +#define SQL_TXN_ISOLATION_OPTION 72 +#define SQL_TRANSACTION_ISOLATION_OPTION SQL_TXN_ISOLATION_OPTION +#define SQL_INTEGRITY 73 +#define SQL_GETDATA_EXTENSIONS 81 +#define SQL_NULL_COLLATION 85 +#define SQL_ALTER_TABLE 86 +#define SQL_ORDER_BY_COLUMNS_IN_SELECT 90 +#define SQL_SPECIAL_CHARACTERS 94 +#define SQL_MAX_COLUMNS_IN_GROUP_BY 97 +#define SQL_MAXIMUM_COLUMNS_IN_GROUP_BY SQL_MAX_COLUMNS_IN_GROUP_BY +#define SQL_MAX_COLUMNS_IN_INDEX 98 +#define SQL_MAXIMUM_COLUMNS_IN_INDEX SQL_MAX_COLUMNS_IN_INDEX +#define SQL_MAX_COLUMNS_IN_ORDER_BY 99 +#define SQL_MAXIMUM_COLUMNS_IN_ORDER_BY SQL_MAX_COLUMNS_IN_ORDER_BY +#define SQL_MAX_COLUMNS_IN_SELECT 100 +#define SQL_MAXIMUM_COLUMNS_IN_SELECT SQL_MAX_COLUMNS_IN_SELECT +#define SQL_MAX_COLUMNS_IN_TABLE 101 +#define SQL_MAX_INDEX_SIZE 102 +#define SQL_MAXIMUM_INDEX_SIZE SQL_MAX_INDEX_SIZE +#define SQL_MAX_ROW_SIZE 104 +#define SQL_MAXIMUM_ROW_SIZE SQL_MAX_ROW_SIZE +#define SQL_MAX_STATEMENT_LEN 105 +#define SQL_MAXIMUM_STATEMENT_LENGTH SQL_MAX_STATEMENT_LEN +#define SQL_MAX_TABLES_IN_SELECT 106 +#define SQL_MAXIMUM_TABLES_IN_SELECT SQL_MAX_TABLES_IN_SELECT +#define SQL_MAX_USER_NAME_LEN 107 +#define SQL_MAXIMUM_USER_NAME_LENGTH SQL_MAX_USER_NAME_LEN +#if (ODBCVER >= 0x0300) +#define SQL_OJ_CAPABILITIES 115 +#define SQL_OUTER_JOIN_CAPABILITIES SQL_OJ_CAPABILITIES +#endif /* ODBCVER >= 0x0300 */ + +#if (ODBCVER >= 0x0300) +#define SQL_XOPEN_CLI_YEAR 10000 +#define SQL_CURSOR_SENSITIVITY 10001 +#define SQL_DESCRIBE_PARAMETER 10002 +#define SQL_CATALOG_NAME 10003 +#define SQL_COLLATION_SEQ 10004 +#define SQL_MAX_IDENTIFIER_LEN 10005 +#define SQL_MAXIMUM_IDENTIFIER_LENGTH SQL_MAX_IDENTIFIER_LEN +#endif /* ODBCVER >= 0x0300 */ + +/* SQL_ALTER_TABLE bitmasks */ +#if (ODBCVER >= 0x0200) +#define SQL_AT_ADD_COLUMN 0x00000001L +#define SQL_AT_DROP_COLUMN 0x00000002L +#endif /* ODBCVER >= 0x0200 */ + +#if (ODBCVER >= 0x0300) +#define SQL_AT_ADD_CONSTRAINT 0x00000008L + +/* The following bitmasks are ODBC extensions and defined in sqlext.h +*#define SQL_AT_COLUMN_SINGLE 0x00000020L +*#define SQL_AT_ADD_COLUMN_DEFAULT 0x00000040L +*#define SQL_AT_ADD_COLUMN_COLLATION 0x00000080L +*#define SQL_AT_SET_COLUMN_DEFAULT 0x00000100L +*#define SQL_AT_DROP_COLUMN_DEFAULT 0x00000200L +*#define SQL_AT_DROP_COLUMN_CASCADE 0x00000400L +*#define SQL_AT_DROP_COLUMN_RESTRICT 0x00000800L +*#define SQL_AT_ADD_TABLE_CONSTRAINT 0x00001000L +*#define SQL_AT_DROP_TABLE_CONSTRAINT_CASCADE 0x00002000L +*#define SQL_AT_DROP_TABLE_CONSTRAINT_RESTRICT 0x00004000L +*#define SQL_AT_CONSTRAINT_NAME_DEFINITION 0x00008000L +*#define SQL_AT_CONSTRAINT_INITIALLY_DEFERRED 0x00010000L +*#define SQL_AT_CONSTRAINT_INITIALLY_IMMEDIATE 0x00020000L +*#define SQL_AT_CONSTRAINT_DEFERRABLE 0x00040000L +*#define SQL_AT_CONSTRAINT_NON_DEFERRABLE 0x00080000L +*/ +#endif /* ODBCVER >= 0x0300 */ + + +/* SQL_ASYNC_MODE values */ +#if (ODBCVER >= 0x0300) +#define SQL_AM_NONE 0 +#define SQL_AM_CONNECTION 1 +#define SQL_AM_STATEMENT 2 +#endif + +/* SQL_CURSOR_COMMIT_BEHAVIOR values */ +#define SQL_CB_DELETE 0 +#define SQL_CB_CLOSE 1 +#define SQL_CB_PRESERVE 2 + +/* SQL_FETCH_DIRECTION bitmasks */ +#define SQL_FD_FETCH_NEXT 0x00000001L +#define SQL_FD_FETCH_FIRST 0x00000002L +#define SQL_FD_FETCH_LAST 0x00000004L +#define SQL_FD_FETCH_PRIOR 0x00000008L +#define SQL_FD_FETCH_ABSOLUTE 0x00000010L +#define SQL_FD_FETCH_RELATIVE 0x00000020L + +/* SQL_GETDATA_EXTENSIONS bitmasks */ +#define SQL_GD_ANY_COLUMN 0x00000001L +#define SQL_GD_ANY_ORDER 0x00000002L + +/* SQL_IDENTIFIER_CASE values */ +#define SQL_IC_UPPER 1 +#define SQL_IC_LOWER 2 +#define SQL_IC_SENSITIVE 3 +#define SQL_IC_MIXED 4 + +/* SQL_OJ_CAPABILITIES bitmasks */ +/* NB: this means 'outer join', not what you may be thinking */ + + +#if (ODBCVER >= 0x0201) +#define SQL_OJ_LEFT 0x00000001L +#define SQL_OJ_RIGHT 0x00000002L +#define SQL_OJ_FULL 0x00000004L +#define SQL_OJ_NESTED 0x00000008L +#define SQL_OJ_NOT_ORDERED 0x00000010L +#define SQL_OJ_INNER 0x00000020L +#define SQL_OJ_ALL_COMPARISON_OPS 0x00000040L +#endif + +/* SQL_SCROLL_CONCURRENCY bitmasks */ +#define SQL_SCCO_READ_ONLY 0x00000001L +#define SQL_SCCO_LOCK 0x00000002L +#define SQL_SCCO_OPT_ROWVER 0x00000004L +#define SQL_SCCO_OPT_VALUES 0x00000008L + +/* SQL_TXN_CAPABLE values */ +#define SQL_TC_NONE 0 +#define SQL_TC_DML 1 +#define SQL_TC_ALL 2 +#define SQL_TC_DDL_COMMIT 3 +#define SQL_TC_DDL_IGNORE 4 + +/* SQL_TXN_ISOLATION_OPTION bitmasks */ +#define SQL_TXN_READ_UNCOMMITTED 0x00000001L +#define SQL_TRANSACTION_READ_UNCOMMITTED SQL_TXN_READ_UNCOMMITTED +#define SQL_TXN_READ_COMMITTED 0x00000002L +#define SQL_TRANSACTION_READ_COMMITTED SQL_TXN_READ_COMMITTED +#define SQL_TXN_REPEATABLE_READ 0x00000004L +#define SQL_TRANSACTION_REPEATABLE_READ SQL_TXN_REPEATABLE_READ +#define SQL_TXN_SERIALIZABLE 0x00000008L +#define SQL_TRANSACTION_SERIALIZABLE SQL_TXN_SERIALIZABLE + +/* SQL_NULL_COLLATION values */ +#define SQL_NC_HIGH 0 +#define SQL_NC_LOW 1 + + SQLRETURN SQL_API SQLAllocConnect(SQLHENV EnvironmentHandle, + SQLHDBC *ConnectionHandle); + + SQLRETURN SQL_API SQLAllocEnv(SQLHENV *EnvironmentHandle); + +#if (ODBCVER >= 0x0300) + SQLRETURN SQL_API SQLAllocHandle(SQLSMALLINT HandleType, + SQLHANDLE InputHandle, SQLHANDLE *OutputHandle); +#endif + + SQLRETURN SQL_API SQLAllocStmt(SQLHDBC ConnectionHandle, + SQLHSTMT *StatementHandle); + + SQLRETURN SQL_API SQLBindCol(SQLHSTMT StatementHandle, + SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, + SQLPOINTER TargetValue, SQLLEN BufferLength, + SQLLEN *StrLen_or_Ind); + +#if (ODBCVER >= 0x0300) + SQLRETURN SQL_API SQLBindParam(SQLHSTMT StatementHandle, + SQLUSMALLINT ParameterNumber, SQLSMALLINT ValueType, + SQLSMALLINT ParameterType, SQLULEN LengthPrecision, + SQLSMALLINT ParameterScale, SQLPOINTER ParameterValue, + SQLLEN *StrLen_or_Ind); +#endif + + SQLRETURN SQL_API SQLCancel(SQLHSTMT StatementHandle); + +#if (ODBCVER >= 0x0380) +SQLRETURN SQL_API SQLCancelHandle(SQLSMALLINT HandleType, SQLHANDLE InputHandle); +#endif + + +#if (ODBCVER >= 0x0300) + SQLRETURN SQL_API SQLCloseCursor(SQLHSTMT StatementHandle); + + SQLRETURN SQL_API SQLColAttribute(SQLHSTMT StatementHandle, + SQLUSMALLINT ColumnNumber, SQLUSMALLINT FieldIdentifier, + SQLPOINTER CharacterAttribute, SQLSMALLINT BufferLength, + SQLSMALLINT *StringLength, SQLLEN *NumericAttribute ); + + /* spec says (SQLPOINTER) not (SQLEN*) - PAH */ + /* Ms now say SQLLEN* + http://msdn.microsoft.com/library/en-us/odbc/htm/dasdkodbcoverview_64bit.asp - NG */ + +#endif + + + SQLRETURN SQL_API SQLColumns(SQLHSTMT StatementHandle, + SQLCHAR *CatalogName, SQLSMALLINT NameLength1, + SQLCHAR *SchemaName, SQLSMALLINT NameLength2, + SQLCHAR *TableName, SQLSMALLINT NameLength3, + SQLCHAR *ColumnName, SQLSMALLINT NameLength4); + + + SQLRETURN SQL_API SQLConnect(SQLHDBC ConnectionHandle, + SQLCHAR *ServerName, SQLSMALLINT NameLength1, + SQLCHAR *UserName, SQLSMALLINT NameLength2, + SQLCHAR *Authentication, SQLSMALLINT NameLength3); + +#if (ODBCVER >= 0x0300) + SQLRETURN SQL_API SQLCopyDesc(SQLHDESC SourceDescHandle, + SQLHDESC TargetDescHandle); +#endif + + SQLRETURN SQL_API SQLDataSources(SQLHENV EnvironmentHandle, + SQLUSMALLINT Direction, SQLCHAR *ServerName, + SQLSMALLINT BufferLength1, SQLSMALLINT *NameLength1, + SQLCHAR *Description, SQLSMALLINT BufferLength2, + SQLSMALLINT *NameLength2); + + SQLRETURN SQL_API SQLDescribeCol(SQLHSTMT StatementHandle, + SQLUSMALLINT ColumnNumber, SQLCHAR *ColumnName, + SQLSMALLINT BufferLength, SQLSMALLINT *NameLength, + SQLSMALLINT *DataType, SQLULEN *ColumnSize, + SQLSMALLINT *DecimalDigits, SQLSMALLINT *Nullable); + + SQLRETURN SQL_API SQLDisconnect(SQLHDBC ConnectionHandle); + +#if (ODBCVER >= 0x0300) + SQLRETURN SQL_API SQLEndTran(SQLSMALLINT HandleType, SQLHANDLE Handle, + SQLSMALLINT CompletionType); +#endif + + SQLRETURN SQL_API SQLError(SQLHENV EnvironmentHandle, + SQLHDBC ConnectionHandle, SQLHSTMT StatementHandle, + SQLCHAR *Sqlstate, SQLINTEGER *NativeError, + SQLCHAR *MessageText, SQLSMALLINT BufferLength, + SQLSMALLINT *TextLength); + + SQLRETURN SQL_API SQLExecDirect(SQLHSTMT StatementHandle, + SQLCHAR *StatementText, SQLINTEGER TextLength); + + SQLRETURN SQL_API SQLExecute(SQLHSTMT StatementHandle); + + SQLRETURN SQL_API SQLFetch(SQLHSTMT StatementHandle); + +#if (ODBCVER >= 0x0300) + SQLRETURN SQL_API SQLFetchScroll(SQLHSTMT StatementHandle, + SQLSMALLINT FetchOrientation, SQLLEN FetchOffset); +#endif + + SQLRETURN SQL_API SQLFreeConnect(SQLHDBC ConnectionHandle); + + SQLRETURN SQL_API SQLFreeEnv(SQLHENV EnvironmentHandle); + +#if (ODBCVER >= 0x0300) + SQLRETURN SQL_API SQLFreeHandle(SQLSMALLINT HandleType, SQLHANDLE Handle); +#endif + + SQLRETURN SQL_API SQLFreeStmt(SQLHSTMT StatementHandle, + SQLUSMALLINT Option); + +#if (ODBCVER >= 0x0300) + SQLRETURN SQL_API SQLGetConnectAttr(SQLHDBC ConnectionHandle, + SQLINTEGER Attribute, SQLPOINTER Value, + SQLINTEGER BufferLength, SQLINTEGER *StringLength); +#endif + + SQLRETURN SQL_API SQLGetConnectOption(SQLHDBC ConnectionHandle, + SQLUSMALLINT Option, SQLPOINTER Value); + + SQLRETURN SQL_API SQLGetCursorName(SQLHSTMT StatementHandle, + SQLCHAR *CursorName, SQLSMALLINT BufferLength, + SQLSMALLINT *NameLength); + + SQLRETURN SQL_API SQLGetData(SQLHSTMT StatementHandle, + SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, + SQLPOINTER TargetValue, SQLLEN BufferLength, + SQLLEN *StrLen_or_Ind); + +#if (ODBCVER >= 0x0300) + SQLRETURN SQLGetDescField(SQLHDESC DescriptorHandle, + SQLSMALLINT RecNumber, SQLSMALLINT FieldIdentifier, + SQLPOINTER Value, SQLINTEGER BufferLength, + SQLINTEGER *StringLength); + + SQLRETURN SQL_API SQLGetDescRec(SQLHDESC DescriptorHandle, + SQLSMALLINT RecNumber, SQLCHAR *Name, + SQLSMALLINT BufferLength, SQLSMALLINT *StringLength, + SQLSMALLINT *Type, SQLSMALLINT *SubType, + SQLLEN *Length, SQLSMALLINT *Precision, + SQLSMALLINT *Scale, SQLSMALLINT *Nullable); + + SQLRETURN SQL_API SQLGetDiagField(SQLSMALLINT HandleType, SQLHANDLE Handle, + SQLSMALLINT RecNumber, SQLSMALLINT DiagIdentifier, + SQLPOINTER DiagInfo, SQLSMALLINT BufferLength, + SQLSMALLINT *StringLength); + + SQLRETURN SQL_API SQLGetDiagRec(SQLSMALLINT HandleType, SQLHANDLE Handle, + SQLSMALLINT RecNumber, SQLCHAR *Sqlstate, + SQLINTEGER *NativeError, SQLCHAR *MessageText, + SQLSMALLINT BufferLength, SQLSMALLINT *TextLength); + + SQLRETURN SQL_API SQLGetEnvAttr(SQLHENV EnvironmentHandle, + SQLINTEGER Attribute, SQLPOINTER Value, + SQLINTEGER BufferLength, SQLINTEGER *StringLength); +#endif /* ODBCVER >= 0x0300 */ + + SQLRETURN SQL_API SQLGetFunctions(SQLHDBC ConnectionHandle, + SQLUSMALLINT FunctionId, SQLUSMALLINT *Supported); + + SQLRETURN SQL_API SQLGetInfo(SQLHDBC ConnectionHandle, + SQLUSMALLINT InfoType, SQLPOINTER InfoValue, + SQLSMALLINT BufferLength, SQLSMALLINT *StringLength); + +#if (ODBCVER >= 0x0300) + SQLRETURN SQL_API SQLGetStmtAttr(SQLHSTMT StatementHandle, + SQLINTEGER Attribute, SQLPOINTER Value, + SQLINTEGER BufferLength, SQLINTEGER *StringLength); +#endif /* ODBCVER >= 0x0300 */ + + SQLRETURN SQL_API SQLGetStmtOption(SQLHSTMT StatementHandle, + SQLUSMALLINT Option, SQLPOINTER Value); + + SQLRETURN SQL_API SQLGetTypeInfo(SQLHSTMT StatementHandle, + SQLSMALLINT DataType); + + SQLRETURN SQL_API SQLNumResultCols(SQLHSTMT StatementHandle, + SQLSMALLINT *ColumnCount); + + SQLRETURN SQL_API SQLParamData(SQLHSTMT StatementHandle, + SQLPOINTER *Value); + + SQLRETURN SQL_API SQLPrepare(SQLHSTMT StatementHandle, + SQLCHAR *StatementText, SQLINTEGER TextLength); + + SQLRETURN SQL_API SQLPutData(SQLHSTMT StatementHandle, + SQLPOINTER Data, SQLLEN StrLen_or_Ind); + + SQLRETURN SQL_API SQLRowCount(SQLHSTMT StatementHandle, + SQLLEN *RowCount); + +#if (ODBCVER >= 0x0300) + SQLRETURN SQL_API SQLSetConnectAttr(SQLHDBC ConnectionHandle, + SQLINTEGER Attribute, SQLPOINTER Value, + SQLINTEGER StringLength); +#endif /* ODBCVER >= 0x0300 */ + + SQLRETURN SQL_API SQLSetConnectOption(SQLHDBC ConnectionHandle, + SQLUSMALLINT Option, SQLULEN Value); + + SQLRETURN SQL_API SQLSetCursorName(SQLHSTMT StatementHandle, + SQLCHAR *CursorName, SQLSMALLINT NameLength); + +#if (ODBCVER >= 0x0300) + SQLRETURN SQL_API SQLSetDescField(SQLHDESC DescriptorHandle, + SQLSMALLINT RecNumber, SQLSMALLINT FieldIdentifier, + SQLPOINTER Value, SQLINTEGER BufferLength); + + SQLRETURN SQL_API SQLSetDescRec(SQLHDESC DescriptorHandle, + SQLSMALLINT RecNumber, SQLSMALLINT Type, + SQLSMALLINT SubType, SQLLEN Length, + SQLSMALLINT Precision, SQLSMALLINT Scale, + SQLPOINTER Data, SQLLEN *StringLength, + SQLLEN *Indicator); + + SQLRETURN SQL_API SQLSetEnvAttr(SQLHENV EnvironmentHandle, + SQLINTEGER Attribute, SQLPOINTER Value, + SQLINTEGER StringLength); +#endif /* ODBCVER >= 0x0300 */ + + SQLRETURN SQL_API SQLSetParam(SQLHSTMT StatementHandle, + SQLUSMALLINT ParameterNumber, SQLSMALLINT ValueType, + SQLSMALLINT ParameterType, SQLULEN LengthPrecision, + SQLSMALLINT ParameterScale, SQLPOINTER ParameterValue, + SQLLEN *StrLen_or_Ind); + +#if (ODBCVER >= 0x0300) + SQLRETURN SQL_API SQLSetStmtAttr(SQLHSTMT StatementHandle, + SQLINTEGER Attribute, SQLPOINTER Value, + SQLINTEGER StringLength); +#endif + + SQLRETURN SQL_API SQLSetStmtOption(SQLHSTMT StatementHandle, + SQLUSMALLINT Option, SQLULEN Value); + + SQLRETURN SQL_API SQLSpecialColumns(SQLHSTMT StatementHandle, + SQLUSMALLINT IdentifierType, SQLCHAR *CatalogName, + SQLSMALLINT NameLength1, SQLCHAR *SchemaName, + SQLSMALLINT NameLength2, SQLCHAR *TableName, + SQLSMALLINT NameLength3, SQLUSMALLINT Scope, + SQLUSMALLINT Nullable); + + SQLRETURN SQL_API SQLStatistics(SQLHSTMT StatementHandle, + SQLCHAR *CatalogName, SQLSMALLINT NameLength1, + SQLCHAR *SchemaName, SQLSMALLINT NameLength2, + SQLCHAR *TableName, SQLSMALLINT NameLength3, + SQLUSMALLINT Unique, SQLUSMALLINT Reserved); + + SQLRETURN SQL_API SQLTables(SQLHSTMT StatementHandle, + SQLCHAR *CatalogName, SQLSMALLINT NameLength1, + SQLCHAR *SchemaName, SQLSMALLINT NameLength2, + SQLCHAR *TableName, SQLSMALLINT NameLength3, + SQLCHAR *TableType, SQLSMALLINT NameLength4); + + SQLRETURN SQL_API SQLTransact(SQLHENV EnvironmentHandle, + SQLHDBC ConnectionHandle, SQLUSMALLINT CompletionType); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/mssql_python/libs/macos/odbc_include/sqlext.h b/mssql_python/libs/macos/odbc_include/sqlext.h new file mode 100644 index 00000000..30954618 --- /dev/null +++ b/mssql_python/libs/macos/odbc_include/sqlext.h @@ -0,0 +1,2204 @@ +/***************************************************** + * sqlext.h + * + * These should be consistent with the MS version. + * + *****************************************************/ +#ifndef __SQLEXT_H +#define __SQLEXT_H + + +/* BEGIN - unixODBC ONLY (programs like ODBCConfig and DataManager use these) */ + +/* COLUMNS IN SQLTables() RESULT SET */ +#define SQLTables_TABLE_CATALOG 1 +#define SQLTables_TABLE_SCHEM 2 +#define SQLTables_TABLE_NAME 3 +#define SQLTables_TABLE_TYPE 4 +#define SQLTables_REMARKS 5 + +/* COLUMNS IN SQLColumns() RESULT SET */ +#define SQLColumns_TABLE_CAT 1 +#define SQLColumns_TABLE_SCHEM 2 +#define SQLColumns_TABLE_NAME 3 +#define SQLColumns_COLUMN_NAME 4 +#define SQLColumns_DATA_TYPE 5 +#define SQLColumns_TYPE_NAME 6 +#define SQLColumns_COLUMN_SIZE 7 +#define SQLColumns_BUFFER_LENGTH 8 +#define SQLColumns_DECIMAL_DIGITS 9 +#define SQLColumns_NUM_PREC_RADIX 10 +#define SQLColumns_NULLABLE 11 +#define SQLColumns_REMARKS 12 +#define SQLColumns_COLUMN_DEF 13 +#define SQLColumns_SQL_DATA_TYPE 14 +#define SQLColumns_SQL_DATETIME_SUB 15 +#define SQLColumns_CHAR_OCTET_LENGTH 16 +#define SQLColumns_ORDINAL_POSITION 17 +#define SQLColumns_IS_NULLABLE 18 + +/* END - unixODBC ONLY */ + +#ifndef __SQL_H +#include "sql.h" +#endif + +#ifdef __cplusplus +extern "C" { /* Assume C declarations for C++ */ +#endif + +/* generally useful constants */ +#define SQL_SPEC_MAJOR 3 /* Major version of specification */ +#define SQL_SPEC_MINOR 52 /* Minor version of specification */ +#define SQL_SPEC_STRING "03.52" /* String constant for version */ + +#define SQL_SQLSTATE_SIZE 5 /* size of SQLSTATE */ +#define SQL_MAX_DSN_LENGTH 32 /* maximum data source name size */ + +#define SQL_MAX_OPTION_STRING_LENGTH 256 + +/* return code SQL_NO_DATA_FOUND is the same as SQL_NO_DATA */ +#if (ODBCVER < 0x0300) +#define SQL_NO_DATA_FOUND 100 +#else +#define SQL_NO_DATA_FOUND SQL_NO_DATA +#endif + +/* an end handle type */ +#if (ODBCVER >= 0x0300) +#define SQL_HANDLE_SENV 5 +#endif /* ODBCVER >= 0x0300 */ + +/* env attribute */ +#if (ODBCVER >= 0x0300) +#define SQL_ATTR_ODBC_VERSION 200 +#define SQL_ATTR_CONNECTION_POOLING 201 +#define SQL_ATTR_CP_MATCH 202 + +/* unixODBC additions */ +#define SQL_ATTR_UNIXODBC_SYSPATH 65001 +#define SQL_ATTR_UNIXODBC_VERSION 65002 +#define SQL_ATTR_UNIXODBC_ENVATTR 65003 +#endif /* ODBCVER >= 0x0300 */ + +#if (ODBCVER >= 0x0300) +/* values for SQL_ATTR_CONNECTION_POOLING */ +#define SQL_CP_OFF 0UL +#define SQL_CP_ONE_PER_DRIVER 1UL +#define SQL_CP_ONE_PER_HENV 2UL +#define SQL_CP_DEFAULT SQL_CP_OFF + +/* values for SQL_ATTR_CP_MATCH */ +#define SQL_CP_STRICT_MATCH 0UL +#define SQL_CP_RELAXED_MATCH 1UL +#define SQL_CP_MATCH_DEFAULT SQL_CP_STRICT_MATCH + +/* values for SQL_ATTR_ODBC_VERSION */ +#define SQL_OV_ODBC2 2UL +#define SQL_OV_ODBC3 3UL +#endif /* ODBCVER >= 0x0300 */ + +#if (ODBCVER >= 0x0380) +/* new values for SQL_ATTR_ODBC_VERSION */ +/* From ODBC 3.8 onwards, we should use * 100 + */ +#define SQL_OV_ODBC3_80 380UL +#endif /* ODBCVER >= 0x0380 */ + +/* connection attributes */ +#define SQL_ACCESS_MODE 101 +#define SQL_AUTOCOMMIT 102 +#define SQL_LOGIN_TIMEOUT 103 +#define SQL_OPT_TRACE 104 +#define SQL_OPT_TRACEFILE 105 +#define SQL_TRANSLATE_DLL 106 +#define SQL_TRANSLATE_OPTION 107 +#define SQL_TXN_ISOLATION 108 +#define SQL_CURRENT_QUALIFIER 109 +#define SQL_ODBC_CURSORS 110 +#define SQL_QUIET_MODE 111 +#define SQL_PACKET_SIZE 112 + +/* connection attributes with new names */ +#if (ODBCVER >= 0x0300) +#define SQL_ATTR_ACCESS_MODE SQL_ACCESS_MODE +#define SQL_ATTR_AUTOCOMMIT SQL_AUTOCOMMIT +#define SQL_ATTR_CONNECTION_TIMEOUT 113 +#define SQL_ATTR_CURRENT_CATALOG SQL_CURRENT_QUALIFIER +#define SQL_ATTR_DISCONNECT_BEHAVIOR 114 +#define SQL_ATTR_ENLIST_IN_DTC 1207 +#define SQL_ATTR_ENLIST_IN_XA 1208 +#define SQL_ATTR_LOGIN_TIMEOUT SQL_LOGIN_TIMEOUT +#define SQL_ATTR_ODBC_CURSORS SQL_ODBC_CURSORS +#define SQL_ATTR_PACKET_SIZE SQL_PACKET_SIZE +#define SQL_ATTR_QUIET_MODE SQL_QUIET_MODE +#define SQL_ATTR_TRACE SQL_OPT_TRACE +#define SQL_ATTR_TRACEFILE SQL_OPT_TRACEFILE +#define SQL_ATTR_TRANSLATE_LIB SQL_TRANSLATE_DLL +#define SQL_ATTR_TRANSLATE_OPTION SQL_TRANSLATE_OPTION +#define SQL_ATTR_TXN_ISOLATION SQL_TXN_ISOLATION +#endif /* ODBCVER >= 0x0300 */ + +#define SQL_ATTR_CONNECTION_DEAD 1209 /* GetConnectAttr only */ + +#define SQL_ATTR_DRIVER_THREADING 1028 /* Driver threading level */ + +#if (ODBCVER >= 0x0351) +/* ODBC Driver Manager sets this connection attribute to a unicode driver + (which supports SQLConnectW) when the application is an ANSI application + (which calls SQLConnect, SQLDriverConnect, or SQLBrowseConnect). + This is SetConnectAttr only and application does not set this attribute + This attribute was introduced because some unicode driver's some APIs may + need to behave differently on ANSI or Unicode applications. A unicode + driver, which has same behavior for both ANSI or Unicode applications, + should return SQL_ERROR when the driver manager sets this connection + attribute. When a unicode driver returns SQL_SUCCESS on this attribute, + the driver manager treates ANSI and Unicode connections differently in + connection pooling. +*/ +#define SQL_ATTR_ANSI_APP 115 +#endif + +#if (ODBCVER >= 0x0380) +#define SQL_ATTR_RESET_CONNECTION 116 +#define SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE 117 +#endif + +/* SQL_CONNECT_OPT_DRVR_START is not meaningful for 3.0 driver */ +#if (ODBCVER < 0x0300) +#define SQL_CONNECT_OPT_DRVR_START 1000 +#endif /* ODBCVER < 0x0300 */ + +#if (ODBCVER < 0x0300) +#define SQL_CONN_OPT_MAX SQL_PACKET_SIZE +#define SQL_CONN_OPT_MIN SQL_ACCESS_MODE +#endif /* ODBCVER < 0x0300 */ + +/* SQL_ACCESS_MODE options */ +#define SQL_MODE_READ_WRITE 0UL +#define SQL_MODE_READ_ONLY 1UL +#define SQL_MODE_DEFAULT SQL_MODE_READ_WRITE + +/* SQL_AUTOCOMMIT options */ +#define SQL_AUTOCOMMIT_OFF 0UL +#define SQL_AUTOCOMMIT_ON 1UL +#define SQL_AUTOCOMMIT_DEFAULT SQL_AUTOCOMMIT_ON + +/* SQL_LOGIN_TIMEOUT options */ +#define SQL_LOGIN_TIMEOUT_DEFAULT 15UL + +/* SQL_OPT_TRACE options */ +#define SQL_OPT_TRACE_OFF 0UL +#define SQL_OPT_TRACE_ON 1UL +#define SQL_OPT_TRACE_DEFAULT SQL_OPT_TRACE_OFF +#ifdef _WINDOWS_ +#define SQL_OPT_TRACE_FILE_DEFAULT "\\temp\\SQL.LOG" +#else +#define SQL_OPT_TRACE_FILE_DEFAULT "/tmp/SQL.LOG" +#endif + +/* SQL_ODBC_CURSORS options */ +#define SQL_CUR_USE_IF_NEEDED 0UL +#define SQL_CUR_USE_ODBC 1UL +#define SQL_CUR_USE_DRIVER 2UL +#define SQL_CUR_DEFAULT SQL_CUR_USE_DRIVER + +#if (ODBCVER >= 0x0300) +/* values for SQL_ATTR_DISCONNECT_BEHAVIOR */ +#define SQL_DB_RETURN_TO_POOL 0UL +#define SQL_DB_DISCONNECT 1UL +#define SQL_DB_DEFAULT SQL_DB_RETURN_TO_POOL + +/* values for SQL_ATTR_ENLIST_IN_DTC */ +#define SQL_DTC_DONE 0L +#endif /* ODBCVER >= 0x0300 */ + +/* values for SQL_ATTR_CONNECTION_DEAD */ +#define SQL_CD_TRUE 1L /* Connection is closed/dead */ +#define SQL_CD_FALSE 0L /* Connection is open/available */ + +/* values for SQL_ATTR_ANSI_APP */ +#if (ODBCVER >= 0x0351) +#define SQL_AA_TRUE 1L /* the application is an ANSI app */ +#define SQL_AA_FALSE 0L /* the application is a Unicode app */ +#endif + +/* values for SQL_ATTR_RESET_CONNECTION */ +#if (ODBCVER >= 0x0380) +#define SQL_RESET_CONNECTION_YES 1UL +#endif + +/* values for SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE */ +#if (ODBCVER >= 0x0380) +#define SQL_ASYNC_DBC_ENABLE_ON 1UL +#define SQL_ASYNC_DBC_ENABLE_OFF 0UL +#define SQL_ASYNC_DBC_ENABLE_DEFAULT SQL_ASYNC_DBC_ENABLE_OFF +#endif + +/* statement attributes */ +#define SQL_QUERY_TIMEOUT 0 +#define SQL_MAX_ROWS 1 +#define SQL_NOSCAN 2 +#define SQL_MAX_LENGTH 3 +#define SQL_ASYNC_ENABLE 4 /* same as SQL_ATTR_ASYNC_ENABLE */ +#define SQL_BIND_TYPE 5 +#define SQL_CURSOR_TYPE 6 +#define SQL_CONCURRENCY 7 +#define SQL_KEYSET_SIZE 8 +#define SQL_ROWSET_SIZE 9 +#define SQL_SIMULATE_CURSOR 10 +#define SQL_RETRIEVE_DATA 11 +#define SQL_USE_BOOKMARKS 12 +#define SQL_GET_BOOKMARK 13 /* GetStmtOption Only */ +#define SQL_ROW_NUMBER 14 /* GetStmtOption Only */ + +/* statement attributes for ODBC 3.0 */ +#if (ODBCVER >= 0x0300) +#define SQL_ATTR_ASYNC_ENABLE 4 +#define SQL_ATTR_CONCURRENCY SQL_CONCURRENCY +#define SQL_ATTR_CURSOR_TYPE SQL_CURSOR_TYPE +#define SQL_ATTR_ENABLE_AUTO_IPD 15 +#define SQL_ATTR_FETCH_BOOKMARK_PTR 16 +#define SQL_ATTR_KEYSET_SIZE SQL_KEYSET_SIZE +#define SQL_ATTR_MAX_LENGTH SQL_MAX_LENGTH +#define SQL_ATTR_MAX_ROWS SQL_MAX_ROWS +#define SQL_ATTR_NOSCAN SQL_NOSCAN +#define SQL_ATTR_PARAM_BIND_OFFSET_PTR 17 +#define SQL_ATTR_PARAM_BIND_TYPE 18 +#define SQL_ATTR_PARAM_OPERATION_PTR 19 +#define SQL_ATTR_PARAM_STATUS_PTR 20 +#define SQL_ATTR_PARAMS_PROCESSED_PTR 21 +#define SQL_ATTR_PARAMSET_SIZE 22 +#define SQL_ATTR_QUERY_TIMEOUT SQL_QUERY_TIMEOUT +#define SQL_ATTR_RETRIEVE_DATA SQL_RETRIEVE_DATA +#define SQL_ATTR_ROW_BIND_OFFSET_PTR 23 +#define SQL_ATTR_ROW_BIND_TYPE SQL_BIND_TYPE +#define SQL_ATTR_ROW_NUMBER SQL_ROW_NUMBER /*GetStmtAttr*/ +#define SQL_ATTR_ROW_OPERATION_PTR 24 +#define SQL_ATTR_ROW_STATUS_PTR 25 +#define SQL_ATTR_ROWS_FETCHED_PTR 26 +#define SQL_ATTR_ROW_ARRAY_SIZE 27 +#define SQL_ATTR_SIMULATE_CURSOR SQL_SIMULATE_CURSOR +#define SQL_ATTR_USE_BOOKMARKS SQL_USE_BOOKMARKS + +#endif /* ODBCVER >= 0x0300 */ + +#if (ODBCVER >= 0x0380) +#define SQL_ATTR_ASYNC_STMT_EVENT 29 +#endif /* ODBCVER >= 0x0380 */ + +#if (ODBCVER < 0x0300) +#define SQL_STMT_OPT_MAX SQL_ROW_NUMBER +#define SQL_STMT_OPT_MIN SQL_QUERY_TIMEOUT +#endif /* ODBCVER < 0x0300 */ + +/* New defines for SEARCHABLE column in SQLGetTypeInfo */ + +#if (ODBCVER >= 0x0300) +#define SQL_COL_PRED_CHAR SQL_LIKE_ONLY +#define SQL_COL_PRED_BASIC SQL_ALL_EXCEPT_LIKE +#endif /* ODBCVER >= 0x0300 */ + + + +/* whether an attribute is a pointer or not */ +#if (ODBCVER >= 0x0300) +#define SQL_IS_POINTER (-4) +#define SQL_IS_UINTEGER (-5) +#define SQL_IS_INTEGER (-6) +#define SQL_IS_USMALLINT (-7) +#define SQL_IS_SMALLINT (-8) +#endif /* ODBCVER >= 0x0300 */ + +/* the value of SQL_ATTR_PARAM_BIND_TYPE */ +#if (ODBCVER >= 0x0300) +#define SQL_PARAM_BIND_BY_COLUMN 0UL +#define SQL_PARAM_BIND_TYPE_DEFAULT SQL_PARAM_BIND_BY_COLUMN +#endif /* ODBCVER >= 0x0300 */ + +/* SQL_QUERY_TIMEOUT options */ +#define SQL_QUERY_TIMEOUT_DEFAULT 0UL + +/* SQL_MAX_ROWS options */ +#define SQL_MAX_ROWS_DEFAULT 0UL + +/* SQL_NOSCAN options */ +#define SQL_NOSCAN_OFF 0UL /* 1.0 FALSE */ +#define SQL_NOSCAN_ON 1UL /* 1.0 TRUE */ +#define SQL_NOSCAN_DEFAULT SQL_NOSCAN_OFF + +/* SQL_MAX_LENGTH options */ +#define SQL_MAX_LENGTH_DEFAULT 0UL + +/* values for SQL_ATTR_ASYNC_ENABLE */ +#define SQL_ASYNC_ENABLE_OFF 0UL +#define SQL_ASYNC_ENABLE_ON 1UL +#define SQL_ASYNC_ENABLE_DEFAULT SQL_ASYNC_ENABLE_OFF + +/* SQL_BIND_TYPE options */ +#define SQL_BIND_BY_COLUMN 0UL +#define SQL_BIND_TYPE_DEFAULT SQL_BIND_BY_COLUMN /* Default value */ + +/* SQL_CONCURRENCY options */ +#define SQL_CONCUR_READ_ONLY 1 +#define SQL_CONCUR_LOCK 2 +#define SQL_CONCUR_ROWVER 3 +#define SQL_CONCUR_VALUES 4 +#define SQL_CONCUR_DEFAULT SQL_CONCUR_READ_ONLY /* Default value */ + +/* SQL_CURSOR_TYPE options */ +#define SQL_CURSOR_FORWARD_ONLY 0UL +#define SQL_CURSOR_KEYSET_DRIVEN 1UL +#define SQL_CURSOR_DYNAMIC 2UL +#define SQL_CURSOR_STATIC 3UL +#define SQL_CURSOR_TYPE_DEFAULT SQL_CURSOR_FORWARD_ONLY /* Default value */ + +/* SQL_ROWSET_SIZE options */ +#define SQL_ROWSET_SIZE_DEFAULT 1UL + +/* SQL_KEYSET_SIZE options */ +#define SQL_KEYSET_SIZE_DEFAULT 0UL + +/* SQL_SIMULATE_CURSOR options */ +#define SQL_SC_NON_UNIQUE 0UL +#define SQL_SC_TRY_UNIQUE 1UL +#define SQL_SC_UNIQUE 2UL + +/* SQL_RETRIEVE_DATA options */ +#define SQL_RD_OFF 0UL +#define SQL_RD_ON 1UL +#define SQL_RD_DEFAULT SQL_RD_ON + +/* SQL_USE_BOOKMARKS options */ +#define SQL_UB_OFF 0UL +#define SQL_UB_ON 01UL +#define SQL_UB_DEFAULT SQL_UB_OFF + +/* New values for SQL_USE_BOOKMARKS attribute */ +#if (ODBCVER >= 0x0300) +#define SQL_UB_FIXED SQL_UB_ON +#define SQL_UB_VARIABLE 2UL +#endif /* ODBCVER >= 0x0300 */ + +/* extended descriptor field */ +#if (ODBCVER >= 0x0300) +#define SQL_DESC_ARRAY_SIZE 20 +#define SQL_DESC_ARRAY_STATUS_PTR 21 +#define SQL_DESC_AUTO_UNIQUE_VALUE SQL_COLUMN_AUTO_INCREMENT +#define SQL_DESC_BASE_COLUMN_NAME 22 +#define SQL_DESC_BASE_TABLE_NAME 23 +#define SQL_DESC_BIND_OFFSET_PTR 24 +#define SQL_DESC_BIND_TYPE 25 +#define SQL_DESC_CASE_SENSITIVE SQL_COLUMN_CASE_SENSITIVE +#define SQL_DESC_CATALOG_NAME SQL_COLUMN_QUALIFIER_NAME +#define SQL_DESC_CONCISE_TYPE SQL_COLUMN_TYPE +#define SQL_DESC_DATETIME_INTERVAL_PRECISION 26 +#define SQL_DESC_DISPLAY_SIZE SQL_COLUMN_DISPLAY_SIZE +#define SQL_DESC_FIXED_PREC_SCALE SQL_COLUMN_MONEY +#define SQL_DESC_LABEL SQL_COLUMN_LABEL +#define SQL_DESC_LITERAL_PREFIX 27 +#define SQL_DESC_LITERAL_SUFFIX 28 +#define SQL_DESC_LOCAL_TYPE_NAME 29 +#define SQL_DESC_MAXIMUM_SCALE 30 +#define SQL_DESC_MINIMUM_SCALE 31 +#define SQL_DESC_NUM_PREC_RADIX 32 +#define SQL_DESC_PARAMETER_TYPE 33 +#define SQL_DESC_ROWS_PROCESSED_PTR 34 +#if (ODBCVER >= 0x0350) +#define SQL_DESC_ROWVER 35 +#endif /* ODBCVER >= 0x0350 */ +#define SQL_DESC_SCHEMA_NAME SQL_COLUMN_OWNER_NAME +#define SQL_DESC_SEARCHABLE SQL_COLUMN_SEARCHABLE +#define SQL_DESC_TYPE_NAME SQL_COLUMN_TYPE_NAME +#define SQL_DESC_TABLE_NAME SQL_COLUMN_TABLE_NAME +#define SQL_DESC_UNSIGNED SQL_COLUMN_UNSIGNED +#define SQL_DESC_UPDATABLE SQL_COLUMN_UPDATABLE +#endif /* ODBCVER >= 0x0300 */ + + +/* defines for diagnostics fields */ +#if (ODBCVER >= 0x0300) +#define SQL_DIAG_CURSOR_ROW_COUNT (-1249) +#define SQL_DIAG_ROW_NUMBER (-1248) +#define SQL_DIAG_COLUMN_NUMBER (-1247) +#endif /* ODBCVER >= 0x0300 */ + +/* SQL extended datatypes */ +#define SQL_DATE 9 +#if (ODBCVER >= 0x0300) +#define SQL_INTERVAL 10 +#endif /* ODBCVER >= 0x0300 */ +#define SQL_TIME 10 +#define SQL_TIMESTAMP 11 +#define SQL_LONGVARCHAR (-1) +#define SQL_BINARY (-2) +#define SQL_VARBINARY (-3) +#define SQL_LONGVARBINARY (-4) +#define SQL_BIGINT (-5) +#define SQL_TINYINT (-6) +#define SQL_BIT (-7) +#if (ODBCVER >= 0x0350) +#define SQL_GUID (-11) +#endif /* ODBCVER >= 0x0350 */ + +#if (ODBCVER >= 0x0300) +/* interval code */ +#define SQL_CODE_YEAR 1 +#define SQL_CODE_MONTH 2 +#define SQL_CODE_DAY 3 +#define SQL_CODE_HOUR 4 +#define SQL_CODE_MINUTE 5 +#define SQL_CODE_SECOND 6 +#define SQL_CODE_YEAR_TO_MONTH 7 +#define SQL_CODE_DAY_TO_HOUR 8 +#define SQL_CODE_DAY_TO_MINUTE 9 +#define SQL_CODE_DAY_TO_SECOND 10 +#define SQL_CODE_HOUR_TO_MINUTE 11 +#define SQL_CODE_HOUR_TO_SECOND 12 +#define SQL_CODE_MINUTE_TO_SECOND 13 + +#define SQL_INTERVAL_YEAR (100 + SQL_CODE_YEAR) +#define SQL_INTERVAL_MONTH (100 + SQL_CODE_MONTH) +#define SQL_INTERVAL_DAY (100 + SQL_CODE_DAY) +#define SQL_INTERVAL_HOUR (100 + SQL_CODE_HOUR) +#define SQL_INTERVAL_MINUTE (100 + SQL_CODE_MINUTE) +#define SQL_INTERVAL_SECOND (100 + SQL_CODE_SECOND) +#define SQL_INTERVAL_YEAR_TO_MONTH (100 + SQL_CODE_YEAR_TO_MONTH) +#define SQL_INTERVAL_DAY_TO_HOUR (100 + SQL_CODE_DAY_TO_HOUR) +#define SQL_INTERVAL_DAY_TO_MINUTE (100 + SQL_CODE_DAY_TO_MINUTE) +#define SQL_INTERVAL_DAY_TO_SECOND (100 + SQL_CODE_DAY_TO_SECOND) +#define SQL_INTERVAL_HOUR_TO_MINUTE (100 + SQL_CODE_HOUR_TO_MINUTE) +#define SQL_INTERVAL_HOUR_TO_SECOND (100 + SQL_CODE_HOUR_TO_SECOND) +#define SQL_INTERVAL_MINUTE_TO_SECOND (100 + SQL_CODE_MINUTE_TO_SECOND) + +#else +#define SQL_INTERVAL_YEAR (-80) +#define SQL_INTERVAL_MONTH (-81) +#define SQL_INTERVAL_YEAR_TO_MONTH (-82) +#define SQL_INTERVAL_DAY (-83) +#define SQL_INTERVAL_HOUR (-84) +#define SQL_INTERVAL_MINUTE (-85) +#define SQL_INTERVAL_SECOND (-86) +#define SQL_INTERVAL_DAY_TO_HOUR (-87) +#define SQL_INTERVAL_DAY_TO_MINUTE (-88) +#define SQL_INTERVAL_DAY_TO_SECOND (-89) +#define SQL_INTERVAL_HOUR_TO_MINUTE (-90) +#define SQL_INTERVAL_HOUR_TO_SECOND (-91) +#define SQL_INTERVAL_MINUTE_TO_SECOND (-92) +#endif /* ODBCVER >= 0x0300 */ + + +#if (ODBCVER <= 0x0300) +#define SQL_UNICODE (-95) +#define SQL_UNICODE_VARCHAR (-96) +#define SQL_UNICODE_LONGVARCHAR (-97) +#define SQL_UNICODE_CHAR SQL_UNICODE +#else +/* The previous definitions for SQL_UNICODE_ are historical and obsolete */ + +#define SQL_UNICODE SQL_WCHAR +#define SQL_UNICODE_VARCHAR SQL_WVARCHAR +#define SQL_UNICODE_LONGVARCHAR SQL_WLONGVARCHAR +#define SQL_UNICODE_CHAR SQL_WCHAR +#endif + +#if (ODBCVER < 0x0300) +#define SQL_TYPE_DRIVER_START SQL_INTERVAL_YEAR +#define SQL_TYPE_DRIVER_END SQL_UNICODE_LONGVARCHAR +#endif /* ODBCVER < 0x0300 */ + +/* C datatype to SQL datatype mapping SQL types + ------------------- */ +#define SQL_C_CHAR SQL_CHAR /* CHAR, VARCHAR, DECIMAL, NUMERIC */ +#define SQL_C_LONG SQL_INTEGER /* INTEGER */ +#define SQL_C_SHORT SQL_SMALLINT /* SMALLINT */ +#define SQL_C_FLOAT SQL_REAL /* REAL */ +#define SQL_C_DOUBLE SQL_DOUBLE /* FLOAT, DOUBLE */ +#if (ODBCVER >= 0x0300) +#define SQL_C_NUMERIC SQL_NUMERIC +#endif /* ODBCVER >= 0x0300 */ +#define SQL_C_DEFAULT 99 + +#define SQL_SIGNED_OFFSET (-20) +#define SQL_UNSIGNED_OFFSET (-22) + +/* C datatype to SQL datatype mapping */ +#define SQL_C_DATE SQL_DATE +#define SQL_C_TIME SQL_TIME +#define SQL_C_TIMESTAMP SQL_TIMESTAMP +#if (ODBCVER >= 0x0300) +#define SQL_C_TYPE_DATE SQL_TYPE_DATE +#define SQL_C_TYPE_TIME SQL_TYPE_TIME +#define SQL_C_TYPE_TIMESTAMP SQL_TYPE_TIMESTAMP +#define SQL_C_INTERVAL_YEAR SQL_INTERVAL_YEAR +#define SQL_C_INTERVAL_MONTH SQL_INTERVAL_MONTH +#define SQL_C_INTERVAL_DAY SQL_INTERVAL_DAY +#define SQL_C_INTERVAL_HOUR SQL_INTERVAL_HOUR +#define SQL_C_INTERVAL_MINUTE SQL_INTERVAL_MINUTE +#define SQL_C_INTERVAL_SECOND SQL_INTERVAL_SECOND +#define SQL_C_INTERVAL_YEAR_TO_MONTH SQL_INTERVAL_YEAR_TO_MONTH +#define SQL_C_INTERVAL_DAY_TO_HOUR SQL_INTERVAL_DAY_TO_HOUR +#define SQL_C_INTERVAL_DAY_TO_MINUTE SQL_INTERVAL_DAY_TO_MINUTE +#define SQL_C_INTERVAL_DAY_TO_SECOND SQL_INTERVAL_DAY_TO_SECOND +#define SQL_C_INTERVAL_HOUR_TO_MINUTE SQL_INTERVAL_HOUR_TO_MINUTE +#define SQL_C_INTERVAL_HOUR_TO_SECOND SQL_INTERVAL_HOUR_TO_SECOND +#define SQL_C_INTERVAL_MINUTE_TO_SECOND SQL_INTERVAL_MINUTE_TO_SECOND +#endif /* ODBCVER >= 0x0300 */ +#define SQL_C_BINARY SQL_BINARY +#define SQL_C_BIT SQL_BIT +#if (ODBCVER >= 0x0300) +#define SQL_C_SBIGINT (SQL_BIGINT+SQL_SIGNED_OFFSET) /* SIGNED BIGINT */ +#define SQL_C_UBIGINT (SQL_BIGINT+SQL_UNSIGNED_OFFSET) /* UNSIGNED BIGINT */ +#endif /* ODBCVER >= 0x0300 */ +#define SQL_C_TINYINT SQL_TINYINT +#define SQL_C_SLONG (SQL_C_LONG+SQL_SIGNED_OFFSET) /* SIGNED INTEGER */ +#define SQL_C_SSHORT (SQL_C_SHORT+SQL_SIGNED_OFFSET) /* SIGNED SMALLINT */ +#define SQL_C_STINYINT (SQL_TINYINT+SQL_SIGNED_OFFSET) /* SIGNED TINYINT */ +#define SQL_C_ULONG (SQL_C_LONG+SQL_UNSIGNED_OFFSET) /* UNSIGNED INTEGER*/ +#define SQL_C_USHORT (SQL_C_SHORT+SQL_UNSIGNED_OFFSET) /* UNSIGNED SMALLINT*/ +#define SQL_C_UTINYINT (SQL_TINYINT+SQL_UNSIGNED_OFFSET) /* UNSIGNED TINYINT*/ + +#if (ODBCVER >= 0x0300) && (SIZEOF_LONG_INT == 8) && !defined(BUILD_LEGACY_64_BIT_MODE) +#define SQL_C_BOOKMARK SQL_C_UBIGINT /* BOOKMARK */ +#else +#define SQL_C_BOOKMARK SQL_C_ULONG /* BOOKMARK */ +#endif + +#if (ODBCVER >= 0x0350) +#define SQL_C_GUID SQL_GUID +#endif /* ODBCVER >= 0x0350 */ + +#define SQL_TYPE_NULL 0 +#if (ODBCVER < 0x0300) +#define SQL_TYPE_MIN SQL_BIT +#define SQL_TYPE_MAX SQL_VARCHAR +#endif + +/* base value of driver-specific C-Type (max is 0x7fff) */ +/* define driver-specific C-Type, named as SQL_DRIVER_C_TYPE_BASE, */ +/* SQL_DRIVER_C_TYPE_BASE+1, SQL_DRIVER_C_TYPE_BASE+2, etc. */ +#if (ODBCVER >= 0x380) +#define SQL_DRIVER_C_TYPE_BASE 0x4000 +#endif + +/* base value of driver-specific fields/attributes (max are 0x7fff [16-bit] or 0x00007fff [32-bit]) */ +/* define driver-specific SQL-Type, named as SQL_DRIVER_SQL_TYPE_BASE, */ +/* SQL_DRIVER_SQL_TYPE_BASE+1, SQL_DRIVER_SQL_TYPE_BASE+2, etc. */ +/* */ +/* Please note that there is no runtime change in this version of DM. */ +/* However, we suggest that driver manufacturers adhere to this range */ +/* as future versions of the DM may enforce these constraints */ +#if (ODBCVER >= 0x380) +#define SQL_DRIVER_SQL_TYPE_BASE 0x4000 +#define SQL_DRIVER_DESC_FIELD_BASE 0x4000 +#define SQL_DRIVER_DIAG_FIELD_BASE 0x4000 +#define SQL_DRIVER_INFO_TYPE_BASE 0x4000 +#define SQL_DRIVER_CONN_ATTR_BASE 0x00004000 +#define SQL_DRIVER_STMT_ATTR_BASE 0x00004000 +#endif + +#if (ODBCVER >= 0x0300) +#define SQL_C_VARBOOKMARK SQL_C_BINARY +#endif /* ODBCVER >= 0x0300 */ + +/* define for SQL_DIAG_ROW_NUMBER and SQL_DIAG_COLUMN_NUMBER */ +#if (ODBCVER >= 0x0300) +#define SQL_NO_ROW_NUMBER (-1) +#define SQL_NO_COLUMN_NUMBER (-1) +#define SQL_ROW_NUMBER_UNKNOWN (-2) +#define SQL_COLUMN_NUMBER_UNKNOWN (-2) +#endif + +/* SQLBindParameter extensions */ +#define SQL_DEFAULT_PARAM (-5) +#define SQL_IGNORE (-6) +#if (ODBCVER >= 0x0300) +#define SQL_COLUMN_IGNORE SQL_IGNORE +#endif /* ODBCVER >= 0x0300 */ +#define SQL_LEN_DATA_AT_EXEC_OFFSET (-100) +#define SQL_LEN_DATA_AT_EXEC(length) (-(length)+SQL_LEN_DATA_AT_EXEC_OFFSET) + +/* binary length for driver specific attributes */ +#define SQL_LEN_BINARY_ATTR_OFFSET (-100) +#define SQL_LEN_BINARY_ATTR(length) (-(length)+SQL_LEN_BINARY_ATTR_OFFSET) + +/* Defines used by Driver Manager when mapping SQLSetParam to SQLBindParameter +*/ +#define SQL_PARAM_TYPE_DEFAULT SQL_PARAM_INPUT_OUTPUT +#define SQL_SETPARAM_VALUE_MAX (-1L) + +/* SQLColAttributes defines */ +#define SQL_COLUMN_COUNT 0 +#define SQL_COLUMN_NAME 1 +#define SQL_COLUMN_TYPE 2 +#define SQL_COLUMN_LENGTH 3 +#define SQL_COLUMN_PRECISION 4 +#define SQL_COLUMN_SCALE 5 +#define SQL_COLUMN_DISPLAY_SIZE 6 +#define SQL_COLUMN_NULLABLE 7 +#define SQL_COLUMN_UNSIGNED 8 +#define SQL_COLUMN_MONEY 9 +#define SQL_COLUMN_UPDATABLE 10 +#define SQL_COLUMN_AUTO_INCREMENT 11 +#define SQL_COLUMN_CASE_SENSITIVE 12 +#define SQL_COLUMN_SEARCHABLE 13 +#define SQL_COLUMN_TYPE_NAME 14 +#define SQL_COLUMN_TABLE_NAME 15 +#define SQL_COLUMN_OWNER_NAME 16 +#define SQL_COLUMN_QUALIFIER_NAME 17 +#define SQL_COLUMN_LABEL 18 +#define SQL_COLATT_OPT_MAX SQL_COLUMN_LABEL +#if (ODBCVER < 0x0300) +#define SQL_COLUMN_DRIVER_START 1000 +#endif /* ODBCVER < 0x0300 */ + +#define SQL_COLATT_OPT_MIN SQL_COLUMN_COUNT + +/* SQLColAttributes subdefines for SQL_COLUMN_UPDATABLE */ +#define SQL_ATTR_READONLY 0 +#define SQL_ATTR_WRITE 1 +#define SQL_ATTR_READWRITE_UNKNOWN 2 + +/* SQLColAttributes subdefines for SQL_COLUMN_SEARCHABLE */ +/* These are also used by SQLGetInfo */ +#define SQL_UNSEARCHABLE 0 +#define SQL_LIKE_ONLY 1 +#define SQL_ALL_EXCEPT_LIKE 2 +#define SQL_SEARCHABLE 3 +#define SQL_PRED_SEARCHABLE SQL_SEARCHABLE + + +/* Special return values for SQLGetData */ +#define SQL_NO_TOTAL (-4) + +/********************************************/ +/* SQLGetFunctions: additional values for */ +/* fFunction to represent functions that */ +/* are not in the X/Open spec. */ +/********************************************/ + +#if (ODBCVER >= 0x0300) +#define SQL_API_SQLALLOCHANDLESTD 73 +#define SQL_API_SQLBULKOPERATIONS 24 +#endif /* ODBCVER >= 0x0300 */ +#define SQL_API_SQLBINDPARAMETER 72 +#define SQL_API_SQLBROWSECONNECT 55 +#define SQL_API_SQLCOLATTRIBUTES 6 +#define SQL_API_SQLCOLUMNPRIVILEGES 56 +#define SQL_API_SQLDESCRIBEPARAM 58 +#define SQL_API_SQLDRIVERCONNECT 41 +#define SQL_API_SQLDRIVERS 71 +#define SQL_API_SQLEXTENDEDFETCH 59 +#define SQL_API_SQLFOREIGNKEYS 60 +#define SQL_API_SQLMORERESULTS 61 +#define SQL_API_SQLNATIVESQL 62 +#define SQL_API_SQLNUMPARAMS 63 +#define SQL_API_SQLPARAMOPTIONS 64 +#define SQL_API_SQLPRIMARYKEYS 65 +#define SQL_API_SQLPROCEDURECOLUMNS 66 +#define SQL_API_SQLPROCEDURES 67 +#define SQL_API_SQLSETPOS 68 +#define SQL_API_SQLSETSCROLLOPTIONS 69 +#define SQL_API_SQLTABLEPRIVILEGES 70 + +/*-------------------------------------------*/ +/* SQL_EXT_API_LAST is not useful with ODBC */ +/* version 3.0 because some of the values */ +/* from X/Open are in the 10000 range. */ +/*-------------------------------------------*/ + +#if (ODBCVER < 0x0300) +#define SQL_EXT_API_LAST SQL_API_SQLBINDPARAMETER +#define SQL_NUM_FUNCTIONS 23 +#define SQL_EXT_API_START 40 +#define SQL_NUM_EXTENSIONS (SQL_EXT_API_LAST-SQL_EXT_API_START+1) +#endif + +/*--------------------------------------------*/ +/* SQL_API_ALL_FUNCTIONS returns an array */ +/* of 'booleans' representing whether a */ +/* function is implemented by the driver. */ +/* */ +/* CAUTION: Only functions defined in ODBC */ +/* version 2.0 and earlier are returned, the */ +/* new high-range function numbers defined by */ +/* X/Open break this scheme. See the new */ +/* method -- SQL_API_ODBC3_ALL_FUNCTIONS */ +/*--------------------------------------------*/ + +#define SQL_API_ALL_FUNCTIONS 0 /* See CAUTION above */ + +/*----------------------------------------------*/ +/* 2.X drivers export a dummy function with */ +/* ordinal number SQL_API_LOADBYORDINAL to speed*/ +/* loading under the windows operating system. */ +/* */ +/* CAUTION: Loading by ordinal is not supported */ +/* for 3.0 and above drivers. */ +/*----------------------------------------------*/ + +#define SQL_API_LOADBYORDINAL 199 /* See CAUTION above */ + +/*----------------------------------------------*/ +/* SQL_API_ODBC3_ALL_FUNCTIONS */ +/* This returns a bitmap, which allows us to */ +/* handle the higher-valued function numbers. */ +/* Use SQL_FUNC_EXISTS(bitmap,function_number) */ +/* to determine if the function exists. */ +/*----------------------------------------------*/ + + +#if (ODBCVER >= 0x0300) +#define SQL_API_ODBC3_ALL_FUNCTIONS 999 +#define SQL_API_ODBC3_ALL_FUNCTIONS_SIZE 250 /* array of 250 words */ + + +#define SQL_FUNC_EXISTS(pfExists, uwAPI) ((*(((UWORD*) (pfExists)) + ((uwAPI) >> 4)) & (1 << ((uwAPI) & 0x000F)) ) ? SQL_TRUE : SQL_FALSE ) + +#endif /* ODBCVER >= 0x0300 */ + + +/************************************************/ +/* Extended definitions for SQLGetInfo */ +/************************************************/ + +/*---------------------------------*/ +/* Values in ODBC 2.0 that are not */ +/* in the X/Open spec */ +/*---------------------------------*/ + +#define SQL_INFO_FIRST 0 +#define SQL_ACTIVE_CONNECTIONS 0 /* MAX_DRIVER_CONNECTIONS */ +#define SQL_ACTIVE_STATEMENTS 1 /* MAX_CONCURRENT_ACTIVITIES */ +#define SQL_DRIVER_HDBC 3 +#define SQL_DRIVER_HENV 4 +#define SQL_DRIVER_HSTMT 5 +#define SQL_DRIVER_NAME 6 +#define SQL_DRIVER_VER 7 +#define SQL_ODBC_API_CONFORMANCE 9 +#define SQL_ODBC_VER 10 +#define SQL_ROW_UPDATES 11 +#define SQL_ODBC_SAG_CLI_CONFORMANCE 12 +#define SQL_ODBC_SQL_CONFORMANCE 15 +#define SQL_PROCEDURES 21 +#define SQL_CONCAT_NULL_BEHAVIOR 22 +#define SQL_CURSOR_ROLLBACK_BEHAVIOR 24 +#define SQL_EXPRESSIONS_IN_ORDERBY 27 +#define SQL_MAX_OWNER_NAME_LEN 32 /* MAX_SCHEMA_NAME_LEN */ +#define SQL_MAX_PROCEDURE_NAME_LEN 33 +#define SQL_MAX_QUALIFIER_NAME_LEN 34 /* MAX_CATALOG_NAME_LEN */ +#define SQL_MULT_RESULT_SETS 36 +#define SQL_MULTIPLE_ACTIVE_TXN 37 +#define SQL_OUTER_JOINS 38 +#define SQL_OWNER_TERM 39 +#define SQL_PROCEDURE_TERM 40 +#define SQL_QUALIFIER_NAME_SEPARATOR 41 +#define SQL_QUALIFIER_TERM 42 +#define SQL_SCROLL_OPTIONS 44 +#define SQL_TABLE_TERM 45 +#define SQL_CONVERT_FUNCTIONS 48 +#define SQL_NUMERIC_FUNCTIONS 49 +#define SQL_STRING_FUNCTIONS 50 +#define SQL_SYSTEM_FUNCTIONS 51 +#define SQL_TIMEDATE_FUNCTIONS 52 +#define SQL_CONVERT_BIGINT 53 +#define SQL_CONVERT_BINARY 54 +#define SQL_CONVERT_BIT 55 +#define SQL_CONVERT_CHAR 56 +#define SQL_CONVERT_DATE 57 +#define SQL_CONVERT_DECIMAL 58 +#define SQL_CONVERT_DOUBLE 59 +#define SQL_CONVERT_FLOAT 60 +#define SQL_CONVERT_INTEGER 61 +#define SQL_CONVERT_LONGVARCHAR 62 +#define SQL_CONVERT_NUMERIC 63 +#define SQL_CONVERT_REAL 64 +#define SQL_CONVERT_SMALLINT 65 +#define SQL_CONVERT_TIME 66 +#define SQL_CONVERT_TIMESTAMP 67 +#define SQL_CONVERT_TINYINT 68 +#define SQL_CONVERT_VARBINARY 69 +#define SQL_CONVERT_VARCHAR 70 +#define SQL_CONVERT_LONGVARBINARY 71 +#define SQL_CONVERT_GUID 173 +#define SQL_ODBC_SQL_OPT_IEF 73 /* SQL_INTEGRITY */ +#define SQL_CORRELATION_NAME 74 +#define SQL_NON_NULLABLE_COLUMNS 75 +#define SQL_DRIVER_HLIB 76 +#define SQL_DRIVER_ODBC_VER 77 +#define SQL_LOCK_TYPES 78 +#define SQL_POS_OPERATIONS 79 +#define SQL_POSITIONED_STATEMENTS 80 +#define SQL_BOOKMARK_PERSISTENCE 82 +#define SQL_STATIC_SENSITIVITY 83 +#define SQL_FILE_USAGE 84 +#define SQL_COLUMN_ALIAS 87 +#define SQL_GROUP_BY 88 +#define SQL_KEYWORDS 89 +#define SQL_OWNER_USAGE 91 +#define SQL_QUALIFIER_USAGE 92 +#define SQL_QUOTED_IDENTIFIER_CASE 93 +#define SQL_SUBQUERIES 95 +#define SQL_UNION 96 +#define SQL_MAX_ROW_SIZE_INCLUDES_LONG 103 +#define SQL_MAX_CHAR_LITERAL_LEN 108 +#define SQL_TIMEDATE_ADD_INTERVALS 109 +#define SQL_TIMEDATE_DIFF_INTERVALS 110 +#define SQL_NEED_LONG_DATA_LEN 111 +#define SQL_MAX_BINARY_LITERAL_LEN 112 +#define SQL_LIKE_ESCAPE_CLAUSE 113 +#define SQL_QUALIFIER_LOCATION 114 + +#if (ODBCVER >= 0x0201 && ODBCVER < 0x0300) +#ifndef SQL_OJ_CAPABILITIES +#define SQL_OJ_CAPABILITIES 65003 /* Temp value until ODBC 3.0 */ +#endif +#endif /* ODBCVER >= 0x0201 && ODBCVER < 0x0300 */ + +/*----------------------------------------------*/ +/* SQL_INFO_LAST and SQL_INFO_DRIVER_START are */ +/* not useful anymore, because X/Open has */ +/* values in the 10000 range. You */ +/* must contact X/Open directly to get a range */ +/* of numbers for driver-specific values. */ +/*----------------------------------------------*/ + +#if (ODBCVER < 0x0300) +#define SQL_INFO_LAST SQL_QUALIFIER_LOCATION +#define SQL_INFO_DRIVER_START 1000 +#endif /* ODBCVER < 0x0300 */ + +/*-----------------------------------------------*/ +/* ODBC 3.0 SQLGetInfo values that are not part */ +/* of the X/Open standard at this time. X/Open */ +/* standard values are in sql.h. */ +/*-----------------------------------------------*/ + +#if (ODBCVER >= 0x0300) +#define SQL_ACTIVE_ENVIRONMENTS 116 +#define SQL_ALTER_DOMAIN 117 + +#define SQL_SQL_CONFORMANCE 118 +#define SQL_DATETIME_LITERALS 119 + +#define SQL_ASYNC_MODE 10021 /* new X/Open spec */ +#define SQL_BATCH_ROW_COUNT 120 +#define SQL_BATCH_SUPPORT 121 +#define SQL_CATALOG_LOCATION SQL_QUALIFIER_LOCATION +#define SQL_CATALOG_NAME_SEPARATOR SQL_QUALIFIER_NAME_SEPARATOR +#define SQL_CATALOG_TERM SQL_QUALIFIER_TERM +#define SQL_CATALOG_USAGE SQL_QUALIFIER_USAGE +#define SQL_CONVERT_WCHAR 122 +#define SQL_CONVERT_INTERVAL_DAY_TIME 123 +#define SQL_CONVERT_INTERVAL_YEAR_MONTH 124 +#define SQL_CONVERT_WLONGVARCHAR 125 +#define SQL_CONVERT_WVARCHAR 126 +#define SQL_CREATE_ASSERTION 127 +#define SQL_CREATE_CHARACTER_SET 128 +#define SQL_CREATE_COLLATION 129 +#define SQL_CREATE_DOMAIN 130 +#define SQL_CREATE_SCHEMA 131 +#define SQL_CREATE_TABLE 132 +#define SQL_CREATE_TRANSLATION 133 +#define SQL_CREATE_VIEW 134 +#define SQL_DRIVER_HDESC 135 +#define SQL_DROP_ASSERTION 136 +#define SQL_DROP_CHARACTER_SET 137 +#define SQL_DROP_COLLATION 138 +#define SQL_DROP_DOMAIN 139 +#define SQL_DROP_SCHEMA 140 +#define SQL_DROP_TABLE 141 +#define SQL_DROP_TRANSLATION 142 +#define SQL_DROP_VIEW 143 +#define SQL_DYNAMIC_CURSOR_ATTRIBUTES1 144 +#define SQL_DYNAMIC_CURSOR_ATTRIBUTES2 145 +#define SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1 146 +#define SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2 147 +#define SQL_INDEX_KEYWORDS 148 +#define SQL_INFO_SCHEMA_VIEWS 149 +#define SQL_KEYSET_CURSOR_ATTRIBUTES1 150 +#define SQL_KEYSET_CURSOR_ATTRIBUTES2 151 +#define SQL_MAX_ASYNC_CONCURRENT_STATEMENTS 10022 /* new X/Open spec */ +#define SQL_ODBC_INTERFACE_CONFORMANCE 152 +#define SQL_PARAM_ARRAY_ROW_COUNTS 153 +#define SQL_PARAM_ARRAY_SELECTS 154 +#define SQL_SCHEMA_TERM SQL_OWNER_TERM +#define SQL_SCHEMA_USAGE SQL_OWNER_USAGE +#define SQL_SQL92_DATETIME_FUNCTIONS 155 +#define SQL_SQL92_FOREIGN_KEY_DELETE_RULE 156 +#define SQL_SQL92_FOREIGN_KEY_UPDATE_RULE 157 +#define SQL_SQL92_GRANT 158 +#define SQL_SQL92_NUMERIC_VALUE_FUNCTIONS 159 +#define SQL_SQL92_PREDICATES 160 +#define SQL_SQL92_RELATIONAL_JOIN_OPERATORS 161 +#define SQL_SQL92_REVOKE 162 +#define SQL_SQL92_ROW_VALUE_CONSTRUCTOR 163 +#define SQL_SQL92_STRING_FUNCTIONS 164 +#define SQL_SQL92_VALUE_EXPRESSIONS 165 +#define SQL_STANDARD_CLI_CONFORMANCE 166 +#define SQL_STATIC_CURSOR_ATTRIBUTES1 167 +#define SQL_STATIC_CURSOR_ATTRIBUTES2 168 + +#define SQL_AGGREGATE_FUNCTIONS 169 +#define SQL_DDL_INDEX 170 +#define SQL_DM_VER 171 +#define SQL_INSERT_STATEMENT 172 +#define SQL_UNION_STATEMENT SQL_UNION +#endif /* ODBCVER >= 0x0300 */ + +#if (ODBCVER >= 0x0380) +/* Info Types */ +#define SQL_ASYNC_DBC_FUNCTIONS 10023 +#endif + +#define SQL_DRIVER_AWARE_POOLING_SUPPORTED 10024 + +#if (ODBCVER >= 0x0380) +#define SQL_ASYNC_NOTIFICATION 10025 + +/* Possible values for SQL_ASYNC_NOTIFICATION */ +#define SQL_ASYNC_NOTIFICATION_NOT_CAPABLE 0x00000000L +#define SQL_ASYNC_NOTIFICATION_CAPABLE 0x00000001L +#endif /* ODBCVER >= 0x0380 */ + +#define SQL_DTC_TRANSITION_COST 1750 + +/* SQL_ALTER_TABLE bitmasks */ +#if (ODBCVER >= 0x0300) +/* the following 5 bitmasks are defined in sql.h +*#define SQL_AT_ADD_COLUMN 0x00000001L +*#define SQL_AT_DROP_COLUMN 0x00000002L +*#define SQL_AT_ADD_CONSTRAINT 0x00000008L +*/ +#define SQL_AT_ADD_COLUMN_SINGLE 0x00000020L +#define SQL_AT_ADD_COLUMN_DEFAULT 0x00000040L +#define SQL_AT_ADD_COLUMN_COLLATION 0x00000080L +#define SQL_AT_SET_COLUMN_DEFAULT 0x00000100L +#define SQL_AT_DROP_COLUMN_DEFAULT 0x00000200L +#define SQL_AT_DROP_COLUMN_CASCADE 0x00000400L +#define SQL_AT_DROP_COLUMN_RESTRICT 0x00000800L +#define SQL_AT_ADD_TABLE_CONSTRAINT 0x00001000L +#define SQL_AT_DROP_TABLE_CONSTRAINT_CASCADE 0x00002000L +#define SQL_AT_DROP_TABLE_CONSTRAINT_RESTRICT 0x00004000L +#define SQL_AT_CONSTRAINT_NAME_DEFINITION 0x00008000L +#define SQL_AT_CONSTRAINT_INITIALLY_DEFERRED 0x00010000L +#define SQL_AT_CONSTRAINT_INITIALLY_IMMEDIATE 0x00020000L +#define SQL_AT_CONSTRAINT_DEFERRABLE 0x00040000L +#define SQL_AT_CONSTRAINT_NON_DEFERRABLE 0x00080000L +#endif /* ODBCVER >= 0x0300 */ + +/* SQL_CONVERT_* return value bitmasks */ + +#define SQL_CVT_CHAR 0x00000001L +#define SQL_CVT_NUMERIC 0x00000002L +#define SQL_CVT_DECIMAL 0x00000004L +#define SQL_CVT_INTEGER 0x00000008L +#define SQL_CVT_SMALLINT 0x00000010L +#define SQL_CVT_FLOAT 0x00000020L +#define SQL_CVT_REAL 0x00000040L +#define SQL_CVT_DOUBLE 0x00000080L +#define SQL_CVT_VARCHAR 0x00000100L +#define SQL_CVT_LONGVARCHAR 0x00000200L +#define SQL_CVT_BINARY 0x00000400L +#define SQL_CVT_VARBINARY 0x00000800L +#define SQL_CVT_BIT 0x00001000L +#define SQL_CVT_TINYINT 0x00002000L +#define SQL_CVT_BIGINT 0x00004000L +#define SQL_CVT_DATE 0x00008000L +#define SQL_CVT_TIME 0x00010000L +#define SQL_CVT_TIMESTAMP 0x00020000L +#define SQL_CVT_LONGVARBINARY 0x00040000L +#if (ODBCVER >= 0x0300) +#define SQL_CVT_INTERVAL_YEAR_MONTH 0x00080000L +#define SQL_CVT_INTERVAL_DAY_TIME 0x00100000L +#define SQL_CVT_WCHAR 0x00200000L +#define SQL_CVT_WLONGVARCHAR 0x00400000L +#define SQL_CVT_WVARCHAR 0x00800000L +#define SQL_CVT_GUID 0x01000000L + +#endif /* ODBCVER >= 0x0300 */ + + +/* SQL_CONVERT_FUNCTIONS functions */ +#define SQL_FN_CVT_CONVERT 0x00000001L +#if (ODBCVER >= 0x0300) +#define SQL_FN_CVT_CAST 0x00000002L +#endif /* ODBCVER >= 0x0300 */ + + +/* SQL_STRING_FUNCTIONS functions */ + +#define SQL_FN_STR_CONCAT 0x00000001L +#define SQL_FN_STR_INSERT 0x00000002L +#define SQL_FN_STR_LEFT 0x00000004L +#define SQL_FN_STR_LTRIM 0x00000008L +#define SQL_FN_STR_LENGTH 0x00000010L +#define SQL_FN_STR_LOCATE 0x00000020L +#define SQL_FN_STR_LCASE 0x00000040L +#define SQL_FN_STR_REPEAT 0x00000080L +#define SQL_FN_STR_REPLACE 0x00000100L +#define SQL_FN_STR_RIGHT 0x00000200L +#define SQL_FN_STR_RTRIM 0x00000400L +#define SQL_FN_STR_SUBSTRING 0x00000800L +#define SQL_FN_STR_UCASE 0x00001000L +#define SQL_FN_STR_ASCII 0x00002000L +#define SQL_FN_STR_CHAR 0x00004000L +#define SQL_FN_STR_DIFFERENCE 0x00008000L +#define SQL_FN_STR_LOCATE_2 0x00010000L +#define SQL_FN_STR_SOUNDEX 0x00020000L +#define SQL_FN_STR_SPACE 0x00040000L +#if (ODBCVER >= 0x0300) +#define SQL_FN_STR_BIT_LENGTH 0x00080000L +#define SQL_FN_STR_CHAR_LENGTH 0x00100000L +#define SQL_FN_STR_CHARACTER_LENGTH 0x00200000L +#define SQL_FN_STR_OCTET_LENGTH 0x00400000L +#define SQL_FN_STR_POSITION 0x00800000L +#endif /* ODBCVER >= 0x0300 */ + +/* SQL_SQL92_STRING_FUNCTIONS */ +#if (ODBCVER >= 0x0300) +#define SQL_SSF_CONVERT 0x00000001L +#define SQL_SSF_LOWER 0x00000002L +#define SQL_SSF_UPPER 0x00000004L +#define SQL_SSF_SUBSTRING 0x00000008L +#define SQL_SSF_TRANSLATE 0x00000010L +#define SQL_SSF_TRIM_BOTH 0x00000020L +#define SQL_SSF_TRIM_LEADING 0x00000040L +#define SQL_SSF_TRIM_TRAILING 0x00000080L +#endif /* ODBCVER >= 0x0300 */ + +/* SQL_NUMERIC_FUNCTIONS functions */ + +#define SQL_FN_NUM_ABS 0x00000001L +#define SQL_FN_NUM_ACOS 0x00000002L +#define SQL_FN_NUM_ASIN 0x00000004L +#define SQL_FN_NUM_ATAN 0x00000008L +#define SQL_FN_NUM_ATAN2 0x00000010L +#define SQL_FN_NUM_CEILING 0x00000020L +#define SQL_FN_NUM_COS 0x00000040L +#define SQL_FN_NUM_COT 0x00000080L +#define SQL_FN_NUM_EXP 0x00000100L +#define SQL_FN_NUM_FLOOR 0x00000200L +#define SQL_FN_NUM_LOG 0x00000400L +#define SQL_FN_NUM_MOD 0x00000800L +#define SQL_FN_NUM_SIGN 0x00001000L +#define SQL_FN_NUM_SIN 0x00002000L +#define SQL_FN_NUM_SQRT 0x00004000L +#define SQL_FN_NUM_TAN 0x00008000L +#define SQL_FN_NUM_PI 0x00010000L +#define SQL_FN_NUM_RAND 0x00020000L +#define SQL_FN_NUM_DEGREES 0x00040000L +#define SQL_FN_NUM_LOG10 0x00080000L +#define SQL_FN_NUM_POWER 0x00100000L +#define SQL_FN_NUM_RADIANS 0x00200000L +#define SQL_FN_NUM_ROUND 0x00400000L +#define SQL_FN_NUM_TRUNCATE 0x00800000L + +/* SQL_SQL92_NUMERIC_VALUE_FUNCTIONS */ +#if (ODBCVER >= 0x0300) +#define SQL_SNVF_BIT_LENGTH 0x00000001L +#define SQL_SNVF_CHAR_LENGTH 0x00000002L +#define SQL_SNVF_CHARACTER_LENGTH 0x00000004L +#define SQL_SNVF_EXTRACT 0x00000008L +#define SQL_SNVF_OCTET_LENGTH 0x00000010L +#define SQL_SNVF_POSITION 0x00000020L +#endif /* ODBCVER >= 0x0300 */ + +/* SQL_TIMEDATE_FUNCTIONS functions */ + +#define SQL_FN_TD_NOW 0x00000001L +#define SQL_FN_TD_CURDATE 0x00000002L +#define SQL_FN_TD_DAYOFMONTH 0x00000004L +#define SQL_FN_TD_DAYOFWEEK 0x00000008L +#define SQL_FN_TD_DAYOFYEAR 0x00000010L +#define SQL_FN_TD_MONTH 0x00000020L +#define SQL_FN_TD_QUARTER 0x00000040L +#define SQL_FN_TD_WEEK 0x00000080L +#define SQL_FN_TD_YEAR 0x00000100L +#define SQL_FN_TD_CURTIME 0x00000200L +#define SQL_FN_TD_HOUR 0x00000400L +#define SQL_FN_TD_MINUTE 0x00000800L +#define SQL_FN_TD_SECOND 0x00001000L +#define SQL_FN_TD_TIMESTAMPADD 0x00002000L +#define SQL_FN_TD_TIMESTAMPDIFF 0x00004000L +#define SQL_FN_TD_DAYNAME 0x00008000L +#define SQL_FN_TD_MONTHNAME 0x00010000L +#if (ODBCVER >= 0x0300) +#define SQL_FN_TD_CURRENT_DATE 0x00020000L +#define SQL_FN_TD_CURRENT_TIME 0x00040000L +#define SQL_FN_TD_CURRENT_TIMESTAMP 0x00080000L +#define SQL_FN_TD_EXTRACT 0x00100000L +#endif /* ODBCVER >= 0x0300 */ + +/* SQL_SQL92_DATETIME_FUNCTIONS */ +#if (ODBCVER >= 0x0300) +#define SQL_SDF_CURRENT_DATE 0x00000001L +#define SQL_SDF_CURRENT_TIME 0x00000002L +#define SQL_SDF_CURRENT_TIMESTAMP 0x00000004L +#endif /* ODBCVER >= 0x0300 */ + +/* SQL_SYSTEM_FUNCTIONS functions */ + +#define SQL_FN_SYS_USERNAME 0x00000001L +#define SQL_FN_SYS_DBNAME 0x00000002L +#define SQL_FN_SYS_IFNULL 0x00000004L + +/* SQL_TIMEDATE_ADD_INTERVALS and SQL_TIMEDATE_DIFF_INTERVALS functions */ + +#define SQL_FN_TSI_FRAC_SECOND 0x00000001L +#define SQL_FN_TSI_SECOND 0x00000002L +#define SQL_FN_TSI_MINUTE 0x00000004L +#define SQL_FN_TSI_HOUR 0x00000008L +#define SQL_FN_TSI_DAY 0x00000010L +#define SQL_FN_TSI_WEEK 0x00000020L +#define SQL_FN_TSI_MONTH 0x00000040L +#define SQL_FN_TSI_QUARTER 0x00000080L +#define SQL_FN_TSI_YEAR 0x00000100L + +/* bitmasks for SQL_DYNAMIC_CURSOR_ATTRIBUTES1, + * SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1, + * SQL_KEYSET_CURSOR_ATTRIBUTES1, and SQL_STATIC_CURSOR_ATTRIBUTES1 + */ +#if (ODBCVER >= 0x0300) +/* supported SQLFetchScroll FetchOrientation's */ +#define SQL_CA1_NEXT 0x00000001L +#define SQL_CA1_ABSOLUTE 0x00000002L +#define SQL_CA1_RELATIVE 0x00000004L +#define SQL_CA1_BOOKMARK 0x00000008L + +/* supported SQLSetPos LockType's */ +#define SQL_CA1_LOCK_NO_CHANGE 0x00000040L +#define SQL_CA1_LOCK_EXCLUSIVE 0x00000080L +#define SQL_CA1_LOCK_UNLOCK 0x00000100L + +/* supported SQLSetPos Operations */ +#define SQL_CA1_POS_POSITION 0x00000200L +#define SQL_CA1_POS_UPDATE 0x00000400L +#define SQL_CA1_POS_DELETE 0x00000800L +#define SQL_CA1_POS_REFRESH 0x00001000L + +/* positioned updates and deletes */ +#define SQL_CA1_POSITIONED_UPDATE 0x00002000L +#define SQL_CA1_POSITIONED_DELETE 0x00004000L +#define SQL_CA1_SELECT_FOR_UPDATE 0x00008000L + +/* supported SQLBulkOperations operations */ +#define SQL_CA1_BULK_ADD 0x00010000L +#define SQL_CA1_BULK_UPDATE_BY_BOOKMARK 0x00020000L +#define SQL_CA1_BULK_DELETE_BY_BOOKMARK 0x00040000L +#define SQL_CA1_BULK_FETCH_BY_BOOKMARK 0x00080000L +#endif /* ODBCVER >= 0x0300 */ + +/* bitmasks for SQL_DYNAMIC_CURSOR_ATTRIBUTES2, + * SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2, + * SQL_KEYSET_CURSOR_ATTRIBUTES2, and SQL_STATIC_CURSOR_ATTRIBUTES2 + */ +#if (ODBCVER >= 0x0300) +/* supported values for SQL_ATTR_SCROLL_CONCURRENCY */ +#define SQL_CA2_READ_ONLY_CONCURRENCY 0x00000001L +#define SQL_CA2_LOCK_CONCURRENCY 0x00000002L +#define SQL_CA2_OPT_ROWVER_CONCURRENCY 0x00000004L +#define SQL_CA2_OPT_VALUES_CONCURRENCY 0x00000008L + +/* sensitivity of the cursor to its own inserts, deletes, and updates */ +#define SQL_CA2_SENSITIVITY_ADDITIONS 0x00000010L +#define SQL_CA2_SENSITIVITY_DELETIONS 0x00000020L +#define SQL_CA2_SENSITIVITY_UPDATES 0x00000040L + +/* semantics of SQL_ATTR_MAX_ROWS */ +#define SQL_CA2_MAX_ROWS_SELECT 0x00000080L +#define SQL_CA2_MAX_ROWS_INSERT 0x00000100L +#define SQL_CA2_MAX_ROWS_DELETE 0x00000200L +#define SQL_CA2_MAX_ROWS_UPDATE 0x00000400L +#define SQL_CA2_MAX_ROWS_CATALOG 0x00000800L +#define SQL_CA2_MAX_ROWS_AFFECTS_ALL (SQL_CA2_MAX_ROWS_SELECT | SQL_CA2_MAX_ROWS_INSERT | SQL_CA2_MAX_ROWS_DELETE | SQL_CA2_MAX_ROWS_UPDATE | SQL_CA2_MAX_ROWS_CATALOG) + +/* semantics of SQL_DIAG_CURSOR_ROW_COUNT */ +#define SQL_CA2_CRC_EXACT 0x00001000L +#define SQL_CA2_CRC_APPROXIMATE 0x00002000L + +/* the kinds of positioned statements that can be simulated */ +#define SQL_CA2_SIMULATE_NON_UNIQUE 0x00004000L +#define SQL_CA2_SIMULATE_TRY_UNIQUE 0x00008000L +#define SQL_CA2_SIMULATE_UNIQUE 0x00010000L +#endif /* ODBCVER >= 0x0300 */ + +/* SQL_ODBC_API_CONFORMANCE values */ + +#define SQL_OAC_NONE 0x0000 +#define SQL_OAC_LEVEL1 0x0001 +#define SQL_OAC_LEVEL2 0x0002 + +/* SQL_ODBC_SAG_CLI_CONFORMANCE values */ + +#define SQL_OSCC_NOT_COMPLIANT 0x0000 +#define SQL_OSCC_COMPLIANT 0x0001 + +/* SQL_ODBC_SQL_CONFORMANCE values */ + +#define SQL_OSC_MINIMUM 0x0000 +#define SQL_OSC_CORE 0x0001 +#define SQL_OSC_EXTENDED 0x0002 + + +/* SQL_CONCAT_NULL_BEHAVIOR values */ + +#define SQL_CB_NULL 0x0000 +#define SQL_CB_NON_NULL 0x0001 + +/* SQL_SCROLL_OPTIONS masks */ + +#define SQL_SO_FORWARD_ONLY 0x00000001L +#define SQL_SO_KEYSET_DRIVEN 0x00000002L +#define SQL_SO_DYNAMIC 0x00000004L +#define SQL_SO_MIXED 0x00000008L +#define SQL_SO_STATIC 0x00000010L + +/* SQL_FETCH_DIRECTION masks */ + +/* SQL_FETCH_RESUME is no longer supported +#define SQL_FD_FETCH_RESUME 0x00000040L +*/ +#define SQL_FD_FETCH_BOOKMARK 0x00000080L + +/* SQL_TXN_ISOLATION_OPTION masks */ +/* SQL_TXN_VERSIONING is no longer supported +#define SQL_TXN_VERSIONING 0x00000010L +*/ + +/* SQL_CORRELATION_NAME values */ + +#define SQL_CN_NONE 0x0000 +#define SQL_CN_DIFFERENT 0x0001 +#define SQL_CN_ANY 0x0002 + +/* SQL_NON_NULLABLE_COLUMNS values */ + +#define SQL_NNC_NULL 0x0000 +#define SQL_NNC_NON_NULL 0x0001 + +/* SQL_NULL_COLLATION values */ + +#define SQL_NC_START 0x0002 +#define SQL_NC_END 0x0004 + +/* SQL_FILE_USAGE values */ + +#define SQL_FILE_NOT_SUPPORTED 0x0000 +#define SQL_FILE_TABLE 0x0001 +#define SQL_FILE_QUALIFIER 0x0002 +#define SQL_FILE_CATALOG SQL_FILE_QUALIFIER /* ODBC 3.0 */ + + +/* SQL_GETDATA_EXTENSIONS values */ + +#define SQL_GD_BLOCK 0x00000004L +#define SQL_GD_BOUND 0x00000008L +#if (ODBCVER >= 0x0380) + #define SQL_GD_OUTPUT_PARAMS 0x00000010L +#endif + +/* SQL_POSITIONED_STATEMENTS masks */ + +#define SQL_PS_POSITIONED_DELETE 0x00000001L +#define SQL_PS_POSITIONED_UPDATE 0x00000002L +#define SQL_PS_SELECT_FOR_UPDATE 0x00000004L + +/* SQL_GROUP_BY values */ + +#define SQL_GB_NOT_SUPPORTED 0x0000 +#define SQL_GB_GROUP_BY_EQUALS_SELECT 0x0001 +#define SQL_GB_GROUP_BY_CONTAINS_SELECT 0x0002 +#define SQL_GB_NO_RELATION 0x0003 +#if (ODBCVER >= 0x0300) +#define SQL_GB_COLLATE 0x0004 + +#endif /* ODBCVER >= 0x0300 */ + +/* SQL_OWNER_USAGE masks */ + +#define SQL_OU_DML_STATEMENTS 0x00000001L +#define SQL_OU_PROCEDURE_INVOCATION 0x00000002L +#define SQL_OU_TABLE_DEFINITION 0x00000004L +#define SQL_OU_INDEX_DEFINITION 0x00000008L +#define SQL_OU_PRIVILEGE_DEFINITION 0x00000010L + +/* SQL_SCHEMA_USAGE masks */ +#if (ODBCVER >= 0x0300) +#define SQL_SU_DML_STATEMENTS SQL_OU_DML_STATEMENTS +#define SQL_SU_PROCEDURE_INVOCATION SQL_OU_PROCEDURE_INVOCATION +#define SQL_SU_TABLE_DEFINITION SQL_OU_TABLE_DEFINITION +#define SQL_SU_INDEX_DEFINITION SQL_OU_INDEX_DEFINITION +#define SQL_SU_PRIVILEGE_DEFINITION SQL_OU_PRIVILEGE_DEFINITION +#endif /* ODBCVER >= 0x0300 */ + +/* SQL_QUALIFIER_USAGE masks */ + +#define SQL_QU_DML_STATEMENTS 0x00000001L +#define SQL_QU_PROCEDURE_INVOCATION 0x00000002L +#define SQL_QU_TABLE_DEFINITION 0x00000004L +#define SQL_QU_INDEX_DEFINITION 0x00000008L +#define SQL_QU_PRIVILEGE_DEFINITION 0x00000010L + +#if (ODBCVER >= 0x0300) +/* SQL_CATALOG_USAGE masks */ +#define SQL_CU_DML_STATEMENTS SQL_QU_DML_STATEMENTS +#define SQL_CU_PROCEDURE_INVOCATION SQL_QU_PROCEDURE_INVOCATION +#define SQL_CU_TABLE_DEFINITION SQL_QU_TABLE_DEFINITION +#define SQL_CU_INDEX_DEFINITION SQL_QU_INDEX_DEFINITION +#define SQL_CU_PRIVILEGE_DEFINITION SQL_QU_PRIVILEGE_DEFINITION +#endif /* ODBCVER >= 0x0300 */ + +/* SQL_SUBQUERIES masks */ + +#define SQL_SQ_COMPARISON 0x00000001L +#define SQL_SQ_EXISTS 0x00000002L +#define SQL_SQ_IN 0x00000004L +#define SQL_SQ_QUANTIFIED 0x00000008L +#define SQL_SQ_CORRELATED_SUBQUERIES 0x00000010L + +/* SQL_UNION masks */ + +#define SQL_U_UNION 0x00000001L +#define SQL_U_UNION_ALL 0x00000002L + +/* SQL_BOOKMARK_PERSISTENCE values */ + +#define SQL_BP_CLOSE 0x00000001L +#define SQL_BP_DELETE 0x00000002L +#define SQL_BP_DROP 0x00000004L +#define SQL_BP_TRANSACTION 0x00000008L +#define SQL_BP_UPDATE 0x00000010L +#define SQL_BP_OTHER_HSTMT 0x00000020L +#define SQL_BP_SCROLL 0x00000040L + +/* SQL_STATIC_SENSITIVITY values */ + +#define SQL_SS_ADDITIONS 0x00000001L +#define SQL_SS_DELETIONS 0x00000002L +#define SQL_SS_UPDATES 0x00000004L + +/* SQL_VIEW values */ +#define SQL_CV_CREATE_VIEW 0x00000001L +#define SQL_CV_CHECK_OPTION 0x00000002L +#define SQL_CV_CASCADED 0x00000004L +#define SQL_CV_LOCAL 0x00000008L + +/* SQL_LOCK_TYPES masks */ + +#define SQL_LCK_NO_CHANGE 0x00000001L +#define SQL_LCK_EXCLUSIVE 0x00000002L +#define SQL_LCK_UNLOCK 0x00000004L + +/* SQL_POS_OPERATIONS masks */ + +#define SQL_POS_POSITION 0x00000001L +#define SQL_POS_REFRESH 0x00000002L +#define SQL_POS_UPDATE 0x00000004L +#define SQL_POS_DELETE 0x00000008L +#define SQL_POS_ADD 0x00000010L + +/* SQL_QUALIFIER_LOCATION values */ + +#define SQL_QL_START 0x0001 +#define SQL_QL_END 0x0002 + +/* Here start return values for ODBC 3.0 SQLGetInfo */ + +#if (ODBCVER >= 0x0300) +/* SQL_AGGREGATE_FUNCTIONS bitmasks */ +#define SQL_AF_AVG 0x00000001L +#define SQL_AF_COUNT 0x00000002L +#define SQL_AF_MAX 0x00000004L +#define SQL_AF_MIN 0x00000008L +#define SQL_AF_SUM 0x00000010L +#define SQL_AF_DISTINCT 0x00000020L +#define SQL_AF_ALL 0x00000040L + +/* SQL_SQL_CONFORMANCE bit masks */ +#define SQL_SC_SQL92_ENTRY 0x00000001L +#define SQL_SC_FIPS127_2_TRANSITIONAL 0x00000002L +#define SQL_SC_SQL92_INTERMEDIATE 0x00000004L +#define SQL_SC_SQL92_FULL 0x00000008L + +/* SQL_DATETIME_LITERALS masks */ +#define SQL_DL_SQL92_DATE 0x00000001L +#define SQL_DL_SQL92_TIME 0x00000002L +#define SQL_DL_SQL92_TIMESTAMP 0x00000004L +#define SQL_DL_SQL92_INTERVAL_YEAR 0x00000008L +#define SQL_DL_SQL92_INTERVAL_MONTH 0x00000010L +#define SQL_DL_SQL92_INTERVAL_DAY 0x00000020L +#define SQL_DL_SQL92_INTERVAL_HOUR 0x00000040L +#define SQL_DL_SQL92_INTERVAL_MINUTE 0x00000080L +#define SQL_DL_SQL92_INTERVAL_SECOND 0x00000100L +#define SQL_DL_SQL92_INTERVAL_YEAR_TO_MONTH 0x00000200L +#define SQL_DL_SQL92_INTERVAL_DAY_TO_HOUR 0x00000400L +#define SQL_DL_SQL92_INTERVAL_DAY_TO_MINUTE 0x00000800L +#define SQL_DL_SQL92_INTERVAL_DAY_TO_SECOND 0x00001000L +#define SQL_DL_SQL92_INTERVAL_HOUR_TO_MINUTE 0x00002000L +#define SQL_DL_SQL92_INTERVAL_HOUR_TO_SECOND 0x00004000L +#define SQL_DL_SQL92_INTERVAL_MINUTE_TO_SECOND 0x00008000L + +/* SQL_CATALOG_LOCATION values */ +#define SQL_CL_START SQL_QL_START +#define SQL_CL_END SQL_QL_END + +/* values for SQL_BATCH_ROW_COUNT */ +#define SQL_BRC_PROCEDURES 0x0000001 +#define SQL_BRC_EXPLICIT 0x0000002 +#define SQL_BRC_ROLLED_UP 0x0000004 + +/* bitmasks for SQL_BATCH_SUPPORT */ +#define SQL_BS_SELECT_EXPLICIT 0x00000001L +#define SQL_BS_ROW_COUNT_EXPLICIT 0x00000002L +#define SQL_BS_SELECT_PROC 0x00000004L +#define SQL_BS_ROW_COUNT_PROC 0x00000008L + +/* Values for SQL_PARAM_ARRAY_ROW_COUNTS getinfo */ +#define SQL_PARC_BATCH 1 +#define SQL_PARC_NO_BATCH 2 + +/* values for SQL_PARAM_ARRAY_SELECTS */ +#define SQL_PAS_BATCH 1 +#define SQL_PAS_NO_BATCH 2 +#define SQL_PAS_NO_SELECT 3 + +/* Bitmasks for SQL_INDEX_KEYWORDS */ +#define SQL_IK_NONE 0x00000000L +#define SQL_IK_ASC 0x00000001L +#define SQL_IK_DESC 0x00000002L +#define SQL_IK_ALL (SQL_IK_ASC | SQL_IK_DESC) + +/* Bitmasks for SQL_INFO_SCHEMA_VIEWS */ + +#define SQL_ISV_ASSERTIONS 0x00000001L +#define SQL_ISV_CHARACTER_SETS 0x00000002L +#define SQL_ISV_CHECK_CONSTRAINTS 0x00000004L +#define SQL_ISV_COLLATIONS 0x00000008L +#define SQL_ISV_COLUMN_DOMAIN_USAGE 0x00000010L +#define SQL_ISV_COLUMN_PRIVILEGES 0x00000020L +#define SQL_ISV_COLUMNS 0x00000040L +#define SQL_ISV_CONSTRAINT_COLUMN_USAGE 0x00000080L +#define SQL_ISV_CONSTRAINT_TABLE_USAGE 0x00000100L +#define SQL_ISV_DOMAIN_CONSTRAINTS 0x00000200L +#define SQL_ISV_DOMAINS 0x00000400L +#define SQL_ISV_KEY_COLUMN_USAGE 0x00000800L +#define SQL_ISV_REFERENTIAL_CONSTRAINTS 0x00001000L +#define SQL_ISV_SCHEMATA 0x00002000L +#define SQL_ISV_SQL_LANGUAGES 0x00004000L +#define SQL_ISV_TABLE_CONSTRAINTS 0x00008000L +#define SQL_ISV_TABLE_PRIVILEGES 0x00010000L +#define SQL_ISV_TABLES 0x00020000L +#define SQL_ISV_TRANSLATIONS 0x00040000L +#define SQL_ISV_USAGE_PRIVILEGES 0x00080000L +#define SQL_ISV_VIEW_COLUMN_USAGE 0x00100000L +#define SQL_ISV_VIEW_TABLE_USAGE 0x00200000L +#define SQL_ISV_VIEWS 0x00400000L + +/* Bitmasks for SQL_ASYNC_MODE */ + +#define SQL_AM_NONE 0 +#define SQL_AM_CONNECTION 1 +#define SQL_AM_STATEMENT 2 + +/* Bitmasks for SQL_ALTER_DOMAIN */ +#define SQL_AD_CONSTRAINT_NAME_DEFINITION 0x00000001L +#define SQL_AD_ADD_DOMAIN_CONSTRAINT 0x00000002L +#define SQL_AD_DROP_DOMAIN_CONSTRAINT 0x00000004L +#define SQL_AD_ADD_DOMAIN_DEFAULT 0x00000008L +#define SQL_AD_DROP_DOMAIN_DEFAULT 0x00000010L +#define SQL_AD_ADD_CONSTRAINT_INITIALLY_DEFERRED 0x00000020L +#define SQL_AD_ADD_CONSTRAINT_INITIALLY_IMMEDIATE 0x00000040L +#define SQL_AD_ADD_CONSTRAINT_DEFERRABLE 0x00000080L +#define SQL_AD_ADD_CONSTRAINT_NON_DEFERRABLE 0x00000100L + + +/* SQL_CREATE_SCHEMA bitmasks */ +#define SQL_CS_CREATE_SCHEMA 0x00000001L +#define SQL_CS_AUTHORIZATION 0x00000002L +#define SQL_CS_DEFAULT_CHARACTER_SET 0x00000004L + +/* SQL_CREATE_TRANSLATION bitmasks */ +#define SQL_CTR_CREATE_TRANSLATION 0x00000001L + +/* SQL_CREATE_ASSERTION bitmasks */ +#define SQL_CA_CREATE_ASSERTION 0x00000001L +#define SQL_CA_CONSTRAINT_INITIALLY_DEFERRED 0x00000010L +#define SQL_CA_CONSTRAINT_INITIALLY_IMMEDIATE 0x00000020L +#define SQL_CA_CONSTRAINT_DEFERRABLE 0x00000040L +#define SQL_CA_CONSTRAINT_NON_DEFERRABLE 0x00000080L + +/* SQL_CREATE_CHARACTER_SET bitmasks */ +#define SQL_CCS_CREATE_CHARACTER_SET 0x00000001L +#define SQL_CCS_COLLATE_CLAUSE 0x00000002L +#define SQL_CCS_LIMITED_COLLATION 0x00000004L + +/* SQL_CREATE_COLLATION bitmasks */ +#define SQL_CCOL_CREATE_COLLATION 0x00000001L + +/* SQL_CREATE_DOMAIN bitmasks */ +#define SQL_CDO_CREATE_DOMAIN 0x00000001L +#define SQL_CDO_DEFAULT 0x00000002L +#define SQL_CDO_CONSTRAINT 0x00000004L +#define SQL_CDO_COLLATION 0x00000008L +#define SQL_CDO_CONSTRAINT_NAME_DEFINITION 0x00000010L +#define SQL_CDO_CONSTRAINT_INITIALLY_DEFERRED 0x00000020L +#define SQL_CDO_CONSTRAINT_INITIALLY_IMMEDIATE 0x00000040L +#define SQL_CDO_CONSTRAINT_DEFERRABLE 0x00000080L +#define SQL_CDO_CONSTRAINT_NON_DEFERRABLE 0x00000100L + +/* SQL_CREATE_TABLE bitmasks */ +#define SQL_CT_CREATE_TABLE 0x00000001L +#define SQL_CT_COMMIT_PRESERVE 0x00000002L +#define SQL_CT_COMMIT_DELETE 0x00000004L +#define SQL_CT_GLOBAL_TEMPORARY 0x00000008L +#define SQL_CT_LOCAL_TEMPORARY 0x00000010L +#define SQL_CT_CONSTRAINT_INITIALLY_DEFERRED 0x00000020L +#define SQL_CT_CONSTRAINT_INITIALLY_IMMEDIATE 0x00000040L +#define SQL_CT_CONSTRAINT_DEFERRABLE 0x00000080L +#define SQL_CT_CONSTRAINT_NON_DEFERRABLE 0x00000100L +#define SQL_CT_COLUMN_CONSTRAINT 0x00000200L +#define SQL_CT_COLUMN_DEFAULT 0x00000400L +#define SQL_CT_COLUMN_COLLATION 0x00000800L +#define SQL_CT_TABLE_CONSTRAINT 0x00001000L +#define SQL_CT_CONSTRAINT_NAME_DEFINITION 0x00002000L + +/* SQL_DDL_INDEX bitmasks */ +#define SQL_DI_CREATE_INDEX 0x00000001L +#define SQL_DI_DROP_INDEX 0x00000002L + +/* SQL_DROP_COLLATION bitmasks */ +#define SQL_DC_DROP_COLLATION 0x00000001L + +/* SQL_DROP_DOMAIN bitmasks */ +#define SQL_DD_DROP_DOMAIN 0x00000001L +#define SQL_DD_RESTRICT 0x00000002L +#define SQL_DD_CASCADE 0x00000004L + +/* SQL_DROP_SCHEMA bitmasks */ +#define SQL_DS_DROP_SCHEMA 0x00000001L +#define SQL_DS_RESTRICT 0x00000002L +#define SQL_DS_CASCADE 0x00000004L + +/* SQL_DROP_CHARACTER_SET bitmasks */ +#define SQL_DCS_DROP_CHARACTER_SET 0x00000001L + +/* SQL_DROP_ASSERTION bitmasks */ +#define SQL_DA_DROP_ASSERTION 0x00000001L + +/* SQL_DROP_TABLE bitmasks */ +#define SQL_DT_DROP_TABLE 0x00000001L +#define SQL_DT_RESTRICT 0x00000002L +#define SQL_DT_CASCADE 0x00000004L + +/* SQL_DROP_TRANSLATION bitmasks */ +#define SQL_DTR_DROP_TRANSLATION 0x00000001L + +/* SQL_DROP_VIEW bitmasks */ +#define SQL_DV_DROP_VIEW 0x00000001L +#define SQL_DV_RESTRICT 0x00000002L +#define SQL_DV_CASCADE 0x00000004L + +/* SQL_INSERT_STATEMENT bitmasks */ +#define SQL_IS_INSERT_LITERALS 0x00000001L +#define SQL_IS_INSERT_SEARCHED 0x00000002L +#define SQL_IS_SELECT_INTO 0x00000004L + +/* SQL_ODBC_INTERFACE_CONFORMANCE values */ +#define SQL_OIC_CORE 1UL +#define SQL_OIC_LEVEL1 2UL +#define SQL_OIC_LEVEL2 3UL + +/* SQL_SQL92_FOREIGN_KEY_DELETE_RULE bitmasks */ +#define SQL_SFKD_CASCADE 0x00000001L +#define SQL_SFKD_NO_ACTION 0x00000002L +#define SQL_SFKD_SET_DEFAULT 0x00000004L +#define SQL_SFKD_SET_NULL 0x00000008L + +/* SQL_SQL92_FOREIGN_KEY_UPDATE_RULE bitmasks */ +#define SQL_SFKU_CASCADE 0x00000001L +#define SQL_SFKU_NO_ACTION 0x00000002L +#define SQL_SFKU_SET_DEFAULT 0x00000004L +#define SQL_SFKU_SET_NULL 0x00000008L + +/* SQL_SQL92_GRANT bitmasks */ +#define SQL_SG_USAGE_ON_DOMAIN 0x00000001L +#define SQL_SG_USAGE_ON_CHARACTER_SET 0x00000002L +#define SQL_SG_USAGE_ON_COLLATION 0x00000004L +#define SQL_SG_USAGE_ON_TRANSLATION 0x00000008L +#define SQL_SG_WITH_GRANT_OPTION 0x00000010L +#define SQL_SG_DELETE_TABLE 0x00000020L +#define SQL_SG_INSERT_TABLE 0x00000040L +#define SQL_SG_INSERT_COLUMN 0x00000080L +#define SQL_SG_REFERENCES_TABLE 0x00000100L +#define SQL_SG_REFERENCES_COLUMN 0x00000200L +#define SQL_SG_SELECT_TABLE 0x00000400L +#define SQL_SG_UPDATE_TABLE 0x00000800L +#define SQL_SG_UPDATE_COLUMN 0x00001000L + +/* SQL_SQL92_PREDICATES bitmasks */ +#define SQL_SP_EXISTS 0x00000001L +#define SQL_SP_ISNOTNULL 0x00000002L +#define SQL_SP_ISNULL 0x00000004L +#define SQL_SP_MATCH_FULL 0x00000008L +#define SQL_SP_MATCH_PARTIAL 0x00000010L +#define SQL_SP_MATCH_UNIQUE_FULL 0x00000020L +#define SQL_SP_MATCH_UNIQUE_PARTIAL 0x00000040L +#define SQL_SP_OVERLAPS 0x00000080L +#define SQL_SP_UNIQUE 0x00000100L +#define SQL_SP_LIKE 0x00000200L +#define SQL_SP_IN 0x00000400L +#define SQL_SP_BETWEEN 0x00000800L +#define SQL_SP_COMPARISON 0x00001000L +#define SQL_SP_QUANTIFIED_COMPARISON 0x00002000L + +/* SQL_SQL92_RELATIONAL_JOIN_OPERATORS bitmasks */ +#define SQL_SRJO_CORRESPONDING_CLAUSE 0x00000001L +#define SQL_SRJO_CROSS_JOIN 0x00000002L +#define SQL_SRJO_EXCEPT_JOIN 0x00000004L +#define SQL_SRJO_FULL_OUTER_JOIN 0x00000008L +#define SQL_SRJO_INNER_JOIN 0x00000010L +#define SQL_SRJO_INTERSECT_JOIN 0x00000020L +#define SQL_SRJO_LEFT_OUTER_JOIN 0x00000040L +#define SQL_SRJO_NATURAL_JOIN 0x00000080L +#define SQL_SRJO_RIGHT_OUTER_JOIN 0x00000100L +#define SQL_SRJO_UNION_JOIN 0x00000200L + +/* SQL_SQL92_REVOKE bitmasks */ +#define SQL_SR_USAGE_ON_DOMAIN 0x00000001L +#define SQL_SR_USAGE_ON_CHARACTER_SET 0x00000002L +#define SQL_SR_USAGE_ON_COLLATION 0x00000004L +#define SQL_SR_USAGE_ON_TRANSLATION 0x00000008L +#define SQL_SR_GRANT_OPTION_FOR 0x00000010L +#define SQL_SR_CASCADE 0x00000020L +#define SQL_SR_RESTRICT 0x00000040L +#define SQL_SR_DELETE_TABLE 0x00000080L +#define SQL_SR_INSERT_TABLE 0x00000100L +#define SQL_SR_INSERT_COLUMN 0x00000200L +#define SQL_SR_REFERENCES_TABLE 0x00000400L +#define SQL_SR_REFERENCES_COLUMN 0x00000800L +#define SQL_SR_SELECT_TABLE 0x00001000L +#define SQL_SR_UPDATE_TABLE 0x00002000L +#define SQL_SR_UPDATE_COLUMN 0x00004000L + +/* SQL_SQL92_ROW_VALUE_CONSTRUCTOR bitmasks */ +#define SQL_SRVC_VALUE_EXPRESSION 0x00000001L +#define SQL_SRVC_NULL 0x00000002L +#define SQL_SRVC_DEFAULT 0x00000004L +#define SQL_SRVC_ROW_SUBQUERY 0x00000008L + +/* SQL_SQL92_VALUE_EXPRESSIONS bitmasks */ +#define SQL_SVE_CASE 0x00000001L +#define SQL_SVE_CAST 0x00000002L +#define SQL_SVE_COALESCE 0x00000004L +#define SQL_SVE_NULLIF 0x00000008L + +/* SQL_STANDARD_CLI_CONFORMANCE bitmasks */ +#define SQL_SCC_XOPEN_CLI_VERSION1 0x00000001L +#define SQL_SCC_ISO92_CLI 0x00000002L + +/* SQL_UNION_STATEMENT bitmasks */ +#define SQL_US_UNION SQL_U_UNION +#define SQL_US_UNION_ALL SQL_U_UNION_ALL + +/* values for SQL_DRIVER_AWARE_POOLING_SUPPORTED */ +#define SQL_DRIVER_AWARE_POOLING_NOT_CAPABLE 0x00000000L +#define SQL_DRIVER_AWARE_POOLING_CAPABLE 0x00000001L +#endif /* ODBCVER >= 0x0300 */ + +/* SQL_DTC_TRANSITION_COST bitmasks */ +#define SQL_DTC_ENLIST_EXPENSIVE 0x00000001L +#define SQL_DTC_UNENLIST_EXPENSIVE 0x00000002L + +#if (ODBCVER >= 0x0380) +/* possible values for SQL_ASYNC_DBC_FUNCTIONS */ +#define SQL_ASYNC_DBC_NOT_CAPABLE 0x00000000L +#define SQL_ASYNC_DBC_CAPABLE 0x00000001L +#endif + +/* additional SQLDataSources fetch directions */ +#if (ODBCVER >= 0x0300) +#define SQL_FETCH_FIRST_USER 31 +#define SQL_FETCH_FIRST_SYSTEM 32 +#endif /* ODBCVER >= 0x0300 */ + + +/* Defines for SQLSetPos */ +#define SQL_ENTIRE_ROWSET 0 + +/* Operations in SQLSetPos */ +#define SQL_POSITION 0 /* 1.0 FALSE */ +#define SQL_REFRESH 1 /* 1.0 TRUE */ +#define SQL_UPDATE 2 +#define SQL_DELETE 3 + +/* Operations in SQLBulkOperations */ +#define SQL_ADD 4 +#define SQL_SETPOS_MAX_OPTION_VALUE SQL_ADD +#if (ODBCVER >= 0x0300) +#define SQL_UPDATE_BY_BOOKMARK 5 +#define SQL_DELETE_BY_BOOKMARK 6 +#define SQL_FETCH_BY_BOOKMARK 7 + +#endif /* ODBCVER >= 0x0300 */ + +/* Lock options in SQLSetPos */ +#define SQL_LOCK_NO_CHANGE 0 /* 1.0 FALSE */ +#define SQL_LOCK_EXCLUSIVE 1 /* 1.0 TRUE */ +#define SQL_LOCK_UNLOCK 2 + +#define SQL_SETPOS_MAX_LOCK_VALUE SQL_LOCK_UNLOCK + +/* Macros for SQLSetPos */ +#define SQL_POSITION_TO(hstmt,irow) SQLSetPos(hstmt,irow,SQL_POSITION,SQL_LOCK_NO_CHANGE) +#define SQL_LOCK_RECORD(hstmt,irow,fLock) SQLSetPos(hstmt,irow,SQL_POSITION,fLock) +#define SQL_REFRESH_RECORD(hstmt,irow,fLock) SQLSetPos(hstmt,irow,SQL_REFRESH,fLock) +#define SQL_UPDATE_RECORD(hstmt,irow) SQLSetPos(hstmt,irow,SQL_UPDATE,SQL_LOCK_NO_CHANGE) +#define SQL_DELETE_RECORD(hstmt,irow) SQLSetPos(hstmt,irow,SQL_DELETE,SQL_LOCK_NO_CHANGE) +#define SQL_ADD_RECORD(hstmt,irow) SQLSetPos(hstmt,irow,SQL_ADD,SQL_LOCK_NO_CHANGE) + +/* Column types and scopes in SQLSpecialColumns. */ +#define SQL_BEST_ROWID 1 +#define SQL_ROWVER 2 + +/* Defines for SQLSpecialColumns (returned in the result set) + SQL_PC_UNKNOWN and SQL_PC_PSEUDO are defined in sql.h */ +#define SQL_PC_NOT_PSEUDO 1 + +/* Defines for SQLStatistics */ +#define SQL_QUICK 0 +#define SQL_ENSURE 1 + +/* Defines for SQLStatistics (returned in the result set) + SQL_INDEX_CLUSTERED, SQL_INDEX_HASHED, and SQL_INDEX_OTHER are + defined in sql.h */ +#define SQL_TABLE_STAT 0 + + +/* Defines for SQLTables */ +#if (ODBCVER >= 0x0300) +#define SQL_ALL_CATALOGS "%" +#define SQL_ALL_SCHEMAS "%" +#define SQL_ALL_TABLE_TYPES "%" +#endif /* ODBCVER >= 0x0300 */ + +/* Options for SQLDriverConnect */ +#define SQL_DRIVER_NOPROMPT 0 +#define SQL_DRIVER_COMPLETE 1 +#define SQL_DRIVER_PROMPT 2 +#define SQL_DRIVER_COMPLETE_REQUIRED 3 + +SQLRETURN SQL_API SQLDriverConnect( + SQLHDBC hdbc, + SQLHWND hwnd, + SQLCHAR *szConnStrIn, + SQLSMALLINT cbConnStrIn, + SQLCHAR *szConnStrOut, + SQLSMALLINT cbConnStrOutMax, + SQLSMALLINT *pcbConnStrOut, + SQLUSMALLINT fDriverCompletion); + +/* Level 2 Functions */ + +/* SQLExtendedFetch "fFetchType" values */ +#define SQL_FETCH_BOOKMARK 8 + +/* SQLExtendedFetch "rgfRowStatus" element values */ +#define SQL_ROW_SUCCESS 0 +#define SQL_ROW_DELETED 1 +#define SQL_ROW_UPDATED 2 +#define SQL_ROW_NOROW 3 +#define SQL_ROW_ADDED 4 +#define SQL_ROW_ERROR 5 +#if (ODBCVER >= 0x0300) +#define SQL_ROW_SUCCESS_WITH_INFO 6 +#define SQL_ROW_PROCEED 0 +#define SQL_ROW_IGNORE 1 +#endif + +/* value for SQL_DESC_ARRAY_STATUS_PTR */ +#if (ODBCVER >= 0x0300) +#define SQL_PARAM_SUCCESS 0 +#define SQL_PARAM_SUCCESS_WITH_INFO 6 +#define SQL_PARAM_ERROR 5 +#define SQL_PARAM_UNUSED 7 +#define SQL_PARAM_DIAG_UNAVAILABLE 1 + +#define SQL_PARAM_PROCEED 0 +#define SQL_PARAM_IGNORE 1 +#endif /* ODBCVER >= 0x0300 */ + +/* Defines for SQLForeignKeys (UPDATE_RULE and DELETE_RULE) */ +#define SQL_CASCADE 0 +#define SQL_RESTRICT 1 +#define SQL_SET_NULL 2 +#if (ODBCVER >= 0x0250) +#define SQL_NO_ACTION 3 +#define SQL_SET_DEFAULT 4 +#endif /* ODBCVER >= 0x0250 */ + +#if (ODBCVER >= 0x0300) +/* Note that the following are in a different column of SQLForeignKeys than */ +/* the previous #defines. These are for DEFERRABILITY. */ + +#define SQL_INITIALLY_DEFERRED 5 +#define SQL_INITIALLY_IMMEDIATE 6 +#define SQL_NOT_DEFERRABLE 7 + +#endif /* ODBCVER >= 0x0300 */ + +/* Defines for SQLBindParameter and + SQLProcedureColumns (returned in the result set) */ +#define SQL_PARAM_TYPE_UNKNOWN 0 +#define SQL_PARAM_INPUT 1 +#define SQL_PARAM_INPUT_OUTPUT 2 +#define SQL_RESULT_COL 3 +#define SQL_PARAM_OUTPUT 4 +#define SQL_RETURN_VALUE 5 +#if (ODBCVER >= 0x0380) + #define SQL_PARAM_INPUT_OUTPUT_STREAM 8 + #define SQL_PARAM_OUTPUT_STREAM 16 +#endif + + +/* Defines for SQLProcedures (returned in the result set) */ +#define SQL_PT_UNKNOWN 0 +#define SQL_PT_PROCEDURE 1 +#define SQL_PT_FUNCTION 2 + +/* This define is too large for RC */ +#define SQL_ODBC_KEYWORDS "ABSOLUTE,ACTION,ADA,ADD,ALL,ALLOCATE,ALTER,AND,ANY,ARE,AS,"\ +"ASC,ASSERTION,AT,AUTHORIZATION,AVG,"\ +"BEGIN,BETWEEN,BIT,BIT_LENGTH,BOTH,BY,CASCADE,CASCADED,CASE,CAST,CATALOG,"\ +"CHAR,CHAR_LENGTH,CHARACTER,CHARACTER_LENGTH,CHECK,CLOSE,COALESCE,"\ +"COLLATE,COLLATION,COLUMN,COMMIT,CONNECT,CONNECTION,CONSTRAINT,"\ +"CONSTRAINTS,CONTINUE,CONVERT,CORRESPONDING,COUNT,CREATE,CROSS,CURRENT,"\ +"CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP,CURRENT_USER,CURSOR,"\ +"DATE,DAY,DEALLOCATE,DEC,DECIMAL,DECLARE,DEFAULT,DEFERRABLE,"\ +"DEFERRED,DELETE,DESC,DESCRIBE,DESCRIPTOR,DIAGNOSTICS,DISCONNECT,"\ +"DISTINCT,DOMAIN,DOUBLE,DROP,"\ +"ELSE,END,END-EXEC,ESCAPE,EXCEPT,EXCEPTION,EXEC,EXECUTE,"\ +"EXISTS,EXTERNAL,EXTRACT,"\ +"FALSE,FETCH,FIRST,FLOAT,FOR,FOREIGN,FORTRAN,FOUND,FROM,FULL,"\ +"GET,GLOBAL,GO,GOTO,GRANT,GROUP,HAVING,HOUR,"\ +"IDENTITY,IMMEDIATE,IN,INCLUDE,INDEX,INDICATOR,INITIALLY,INNER,"\ +"INPUT,INSENSITIVE,INSERT,INT,INTEGER,INTERSECT,INTERVAL,INTO,IS,ISOLATION,"\ +"JOIN,KEY,LANGUAGE,LAST,LEADING,LEFT,LEVEL,LIKE,LOCAL,LOWER,"\ +"MATCH,MAX,MIN,MINUTE,MODULE,MONTH,"\ +"NAMES,NATIONAL,NATURAL,NCHAR,NEXT,NO,NONE,NOT,NULL,NULLIF,NUMERIC,"\ +"OCTET_LENGTH,OF,ON,ONLY,OPEN,OPTION,OR,ORDER,OUTER,OUTPUT,OVERLAPS,"\ +"PAD,PARTIAL,PASCAL,PLI,POSITION,PRECISION,PREPARE,PRESERVE,"\ +"PRIMARY,PRIOR,PRIVILEGES,PROCEDURE,PUBLIC,"\ +"READ,REAL,REFERENCES,RELATIVE,RESTRICT,REVOKE,RIGHT,ROLLBACK,ROWS"\ +"SCHEMA,SCROLL,SECOND,SECTION,SELECT,SESSION,SESSION_USER,SET,SIZE,"\ +"SMALLINT,SOME,SPACE,SQL,SQLCA,SQLCODE,SQLERROR,SQLSTATE,SQLWARNING,"\ +"SUBSTRING,SUM,SYSTEM_USER,"\ +"TABLE,TEMPORARY,THEN,TIME,TIMESTAMP,TIMEZONE_HOUR,TIMEZONE_MINUTE,"\ +"TO,TRAILING,TRANSACTION,TRANSLATE,TRANSLATION,TRIM,TRUE,"\ +"UNION,UNIQUE,UNKNOWN,UPDATE,UPPER,USAGE,USER,USING,"\ +"VALUE,VALUES,VARCHAR,VARYING,VIEW,WHEN,WHENEVER,WHERE,WITH,WORK,WRITE,"\ +"YEAR,ZONE" + +SQLRETURN SQL_API SQLBrowseConnect( + SQLHDBC hdbc, + SQLCHAR *szConnStrIn, + SQLSMALLINT cbConnStrIn, + SQLCHAR *szConnStrOut, + SQLSMALLINT cbConnStrOutMax, + SQLSMALLINT *pcbConnStrOut); + +#if (ODBCVER >= 0x0300) +SQLRETURN SQL_API SQLBulkOperations( + SQLHSTMT StatementHandle, + SQLSMALLINT Operation); +#endif /* ODBCVER >= 0x0300 */ + +SQLRETURN SQL_API SQLColAttributes( + SQLHSTMT hstmt, + SQLUSMALLINT icol, + SQLUSMALLINT fDescType, + SQLPOINTER rgbDesc, + SQLSMALLINT cbDescMax, + SQLSMALLINT *pcbDesc, + SQLLEN *pfDesc); + +SQLRETURN SQL_API SQLColumnPrivileges( + SQLHSTMT hstmt, + SQLCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLCHAR *szTableName, + SQLSMALLINT cbTableName, + SQLCHAR *szColumnName, + SQLSMALLINT cbColumnName); + +SQLRETURN SQL_API SQLDescribeParam( + SQLHSTMT hstmt, + SQLUSMALLINT ipar, + SQLSMALLINT *pfSqlType, + SQLULEN *pcbParamDef, + SQLSMALLINT *pibScale, + SQLSMALLINT *pfNullable); + +SQLRETURN SQL_API SQLExtendedFetch( + SQLHSTMT hstmt, + SQLUSMALLINT fFetchType, + SQLLEN irow, + SQLULEN *pcrow, + SQLUSMALLINT *rgfRowStatus); + +SQLRETURN SQL_API SQLForeignKeys( + SQLHSTMT hstmt, + SQLCHAR *szPkCatalogName, + SQLSMALLINT cbPkCatalogName, + SQLCHAR *szPkSchemaName, + SQLSMALLINT cbPkSchemaName, + SQLCHAR *szPkTableName, + SQLSMALLINT cbPkTableName, + SQLCHAR *szFkCatalogName, + SQLSMALLINT cbFkCatalogName, + SQLCHAR *szFkSchemaName, + SQLSMALLINT cbFkSchemaName, + SQLCHAR *szFkTableName, + SQLSMALLINT cbFkTableName); + +SQLRETURN SQL_API SQLMoreResults( + SQLHSTMT hstmt); + +SQLRETURN SQL_API SQLNativeSql( + SQLHDBC hdbc, + SQLCHAR *szSqlStrIn, + SQLINTEGER cbSqlStrIn, + SQLCHAR *szSqlStr, + SQLINTEGER cbSqlStrMax, + SQLINTEGER *pcbSqlStr); + +SQLRETURN SQL_API SQLNumParams( + SQLHSTMT hstmt, + SQLSMALLINT *pcpar); + +SQLRETURN SQL_API SQLParamOptions( + SQLHSTMT hstmt, + SQLULEN crow, + SQLULEN *pirow); + +SQLRETURN SQL_API SQLPrimaryKeys( + SQLHSTMT hstmt, + SQLCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLCHAR *szTableName, + SQLSMALLINT cbTableName); + +SQLRETURN SQL_API SQLProcedureColumns( + SQLHSTMT hstmt, + SQLCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLCHAR *szProcName, + SQLSMALLINT cbProcName, + SQLCHAR *szColumnName, + SQLSMALLINT cbColumnName); + +SQLRETURN SQL_API SQLProcedures( + SQLHSTMT hstmt, + SQLCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLCHAR *szProcName, + SQLSMALLINT cbProcName); + +SQLRETURN SQL_API SQLSetPos( + SQLHSTMT hstmt, + SQLSETPOSIROW irow, + SQLUSMALLINT fOption, + SQLUSMALLINT fLock); + +SQLRETURN SQL_API SQLTablePrivileges( + SQLHSTMT hstmt, + SQLCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLCHAR *szTableName, + SQLSMALLINT cbTableName); + +SQLRETURN SQL_API SQLDrivers( + SQLHENV henv, + SQLUSMALLINT fDirection, + SQLCHAR *szDriverDesc, + SQLSMALLINT cbDriverDescMax, + SQLSMALLINT *pcbDriverDesc, + SQLCHAR *szDriverAttributes, + SQLSMALLINT cbDrvrAttrMax, + SQLSMALLINT *pcbDrvrAttr); + +SQLRETURN SQL_API SQLBindParameter( + SQLHSTMT hstmt, + SQLUSMALLINT ipar, + SQLSMALLINT fParamType, + SQLSMALLINT fCType, + SQLSMALLINT fSqlType, + SQLULEN cbColDef, + SQLSMALLINT ibScale, + SQLPOINTER rgbValue, + SQLLEN cbValueMax, + SQLLEN *pcbValue); + +/*---------------------------------------------------------*/ +/* SQLAllocHandleStd is implemented to make SQLAllocHandle */ +/* compatible with X/Open standard. an application should */ +/* not call SQLAllocHandleStd directly */ +/*---------------------------------------------------------*/ +#ifdef ODBC_STD +#define SQLAllocHandle SQLAllocHandleStd +#define SQLAllocEnv(phenv) SQLAllocHandleStd(SQL_HANDLE_ENV, SQL_NULL_HANDLE, phenv) + +/* Internal type subcodes */ +#define SQL_YEAR SQL_CODE_YEAR +#define SQL_MONTH SQL_CODE_MONTH +#define SQL_DAY SQL_CODE_DAY +#define SQL_HOUR SQL_CODE_HOUR +#define SQL_MINUTE SQL_CODE_MINUTE +#define SQL_SECOND SQL_CODE_SECOND +#define SQL_YEAR_TO_MONTH SQL_CODE_YEAR_TO_MONTH +#define SQL_DAY_TO_HOUR SQL_CODE_DAY_TO_HOUR +#define SQL_DAY_TO_MINUTE SQL_CODE_DAY_TO_MINUTE +#define SQL_DAY_TO_SECOND SQL_CODE_DAY_TO_SECOND +#define SQL_HOUR_TO_MINUTE SQL_CODE_HOUR_TO_MINUTE +#define SQL_HOUR_TO_SECOND SQL_CODE_HOUR_TO_SECOND +#define SQL_MINUTE_TO_SECOND SQL_CODE_MINUTE_TO_SECOND +#endif /* ODBC_STD */ + +#if (ODBCVER >= 0x0300) +SQLRETURN SQL_API SQLAllocHandleStd( + SQLSMALLINT fHandleType, + SQLHANDLE hInput, + SQLHANDLE *phOutput); +#endif + +/* Deprecated defines from prior versions of ODBC */ +#define SQL_DATABASE_NAME 16 /* Use SQLGetConnectOption/SQL_CURRENT_QUALIFIER */ +#define SQL_FD_FETCH_PREV SQL_FD_FETCH_PRIOR +#define SQL_FETCH_PREV SQL_FETCH_PRIOR +#define SQL_CONCUR_TIMESTAMP SQL_CONCUR_ROWVER +#define SQL_SCCO_OPT_TIMESTAMP SQL_SCCO_OPT_ROWVER +#define SQL_CC_DELETE SQL_CB_DELETE +#define SQL_CR_DELETE SQL_CB_DELETE +#define SQL_CC_CLOSE SQL_CB_CLOSE +#define SQL_CR_CLOSE SQL_CB_CLOSE +#define SQL_CC_PRESERVE SQL_CB_PRESERVE +#define SQL_CR_PRESERVE SQL_CB_PRESERVE +/* SQL_FETCH_RESUME is not supported by 2.0+ drivers +#define SQL_FETCH_RESUME 7 +*/ +#define SQL_SCROLL_FORWARD_ONLY 0L /*-SQL_CURSOR_FORWARD_ONLY */ +#define SQL_SCROLL_KEYSET_DRIVEN (-1L) /*-SQL_CURSOR_KEYSET_DRIVEN */ +#define SQL_SCROLL_DYNAMIC (-2L) /*-SQL_CURSOR_DYNAMIC */ +#define SQL_SCROLL_STATIC (-3L) /*-SQL_CURSOR_STATIC */ + +/* Deprecated functions from prior versions of ODBC */ +SQLRETURN SQL_API SQLSetScrollOptions( /* Use SQLSetStmtOptions */ + SQLHSTMT hstmt, + SQLUSMALLINT fConcurrency, + SQLLEN crowKeyset, + SQLUSMALLINT crowRowset); + +/*! + * \defgroup Tracing. + * + * unixODBC implements a slight variation of the tracing mechanism used + * on MS platforms. The unixODBC method loses the ability to produce trace + * output for invalid handles but gains the following; + * + * - better concurrency + * - allows tracing to be turned on/off and configured at finer granularity + * - hopefully; better performance + * + * unixODBC provides a cross-platform helper library called 'trace' and an + * example/default trace plugin called 'odbctrac'. Those writing an ODBC + * driver can use the 'trace' helper library (a static library). Those wanting + * to create custom trace output can implement a different version of the + * 'odbctrac' plugin. + * + * The text file driver (odbctxt) included with unixODBC is an example of a + * driver using the 'trace' helper library. + * + * The 'trace' library and the example plugin 'odbctrac' are designed to be + * portable on all platforms where unixODBC is available and on MS platforms. + * This will allow drivers using 'trace' and 'odbctrac' plugin to equilly + * portable. On MS platforms - this compliments traditional tracing (mostly + * just used by the Driver Manager). + * + * \sa trace + * odbctxt + * odbctrac + */ +/**@{*/ +#define TRACE_VERSION 1000 /*!< Version of trace API */ +#ifdef UNICODE +RETCODE TraceOpenLogFile(SQLPOINTER,LPWSTR,LPWSTR,DWORD); /*!< open a trace log file */ +#else +RETCODE TraceOpenLogFile(SQLPOINTER,LPSTR,LPSTR,DWORD); /*!< open a trace log file */ +#endif +RETCODE TraceCloseLogFile(SQLPOINTER); /*!< Request to close a trace log */ +SQLRETURN TraceReturn(SQLPOINTER,SQLRETURN); /*!< Call to produce trace output upon function return. */ +DWORD TraceVersion(void); /*!< Returns trace API version */ + +/* Functions for Visual Studio Analyzer*/ +/* to turn on/off tracing or VS events, call TraceVSControl by setting or clearing the following bits */ +#define TRACE_ON 0x00000001L +#define TRACE_VS_EVENT_ON 0x00000002L + +RETCODE TraceVSControl(DWORD); + +/* the flags in ODBC_VS_ARGS */ +#define ODBC_VS_FLAG_UNICODE_ARG 0x00000001L /* the argument is unicode */ +#define ODBC_VS_FLAG_UNICODE_COR 0x00000002L /* the correlation is unicode */ +#define ODBC_VS_FLAG_RETCODE 0x00000004L /* RetCode field is set */ +#define ODBC_VS_FLAG_STOP 0x00000008L /* Stop firing visual studio analyzer events */ + +typedef struct tagODBC_VS_ARGS { +#ifdef GUID_DEFINED + const GUID *pguidEvent; /* the GUID for event */ +#else + const void *pguidEvent; /* the GUID for event */ +#endif + DWORD dwFlags; /* flags for the call */ + union { + WCHAR *wszArg; + CHAR *szArg; + }u1; + union { + WCHAR *wszCorrelation; + CHAR *szCorrelation; + }u2; + RETCODE RetCode; +} ODBC_VS_ARGS, *PODBC_VS_ARGS; + +void FireVSDebugEvent(PODBC_VS_ARGS); +/**@}*/ + +#ifdef __cplusplus +} +#endif + +/* + * connection pooling retry times + */ + +BOOL ODBCSetTryWaitValue ( DWORD dwValue ); +#ifdef __cplusplus +DWORD ODBCGetTryWaitValue ( ); +#else +DWORD ODBCGetTryWaitValue ( void ); +#endif + +#ifndef __SQLUCODE_H +#include "sqlucode.h" +#endif + +#endif diff --git a/mssql_python/libs/macos/odbc_include/sqlspi.h b/mssql_python/libs/macos/odbc_include/sqlspi.h new file mode 100644 index 00000000..e0a9d26d --- /dev/null +++ b/mssql_python/libs/macos/odbc_include/sqlspi.h @@ -0,0 +1,173 @@ +/*----------------------------------------------------------------------------- + File: sqlspi.h + + Contents: This is the header for driver writers to support new ODBC + features. Application writers should not include + this header file + Please include and before including this + file + + Based on the sqlspi.h provided by Microsoft + +-----------------------------------------------------------------------------*/ + +#ifndef __SQLSPI__ +#define __SQLSPI__ + +#ifdef __cplusplus +extern "C" { // Assume C declarations for C++ +#endif // End of __cplusplus + +/* SQL_SPI is just a marker for "Service Provider Interface", otherwise it is the same as API + Application should not call functions that are marked as SQL_SPI directly */ +#define SQL_SPI SQL_API + +/*-------------------- ODBC Connection Info Handle -----------------------------*/ +/* handle for storing connection information for ODBC driver connection pooling */ +#define SQL_HANDLE_DBC_INFO_TOKEN 6 // Handle type, used in SQLAllocHandle +typedef SQLHANDLE SQLHDBC_INFO_TOKEN; + +/*-------------------- ODBC Pool ID for driver-aware pooling -----------------------------*/ +typedef SQLULEN POOLID; +typedef DWORD* TRANSID; + +/*-------------------- Driver-aware Connection Pooling --------------------------*/ +/* We define a few scores with special meaning */ +/* But driver can return any score between 0 and 100 */ +typedef DWORD SQLConnPoolRating; +#define SQL_CONN_POOL_RATING_BEST 100 /* the best of the rating */ +#define SQL_CONN_POOL_RATING_GOOD_ENOUGH 99 /* the rating is good enough and we can stop rating */ +#define SQL_CONN_POOL_RATING_USELESS 0 /* the candidate connection must not be reused for the current request */ + +/* SQLSetConnectAttr */ +#define SQL_ATTR_DBC_INFO_TOKEN 118 /* reset the pooled connection in case it is not a perfect match */ + +/* Set connection attributes into DBC info token */ +SQLRETURN SQL_SPI SQLSetConnectAttrForDbcInfoW( + SQLHDBC_INFO_TOKEN hDbcInfoToken, + SQLINTEGER Attribute, + SQLPOINTER Value, + SQLINTEGER StringLength); + +/* Set connection information for SQLDriverConnect */ +SQLRETURN SQL_SPI SQLSetDriverConnectInfoW( + SQLHDBC_INFO_TOKEN hDbcInfoToken, + SQLWCHAR *szConnStrIn, + SQLSMALLINT cchConnStrIn); + +/* Set connection information for SQLConnect */ +SQLRETURN SQL_SPI SQLSetConnectInfoW +( + SQLHDBC_INFO_TOKEN hDbcInfoToken, + SQLWCHAR *szDSN, + SQLSMALLINT cchDSN, + SQLWCHAR *szUID, + SQLSMALLINT cchUID, + SQLWCHAR *szAuthStr, + SQLSMALLINT cchAuthStr +); + +/* Get the pool ID for the token */ +SQLRETURN SQL_SPI SQLGetPoolID( + SQLHDBC_INFO_TOKEN hDbcInfoToken, + POOLID* pPoolID); + +/* Return how close hCandidateConnection matches with hRequest */ +/* *pRating must be between SQL_CONN_POOL_RATING_USELESS and SQL_CONN_POOL_RATING_BEST (inclusively) */ +/* If return value is not SQL_SUCCESS or *pRating > SQL_CONN_POOL_RATING_BEST, the candidate */ +/* connection will not be used any more in any other connection request */ +/* If fRequiresTransactionEnlistment is TRUE, transId represents the DTC transaction ID that */ +/* should be enlisted to (transId == 0 means unenlistment). Otherwise, transId should be ignored */ +SQLRETURN SQL_SPI SQLRateConnection( + SQLHDBC_INFO_TOKEN hRequest, + SQLHDBC hCandidateConnection, + BOOL fRequiresTransactionEnlistment, + TRANSID transId, + SQLConnPoolRating *pRating); + +/* Create a physical connection */ +/* If application is calling SQLDriverConnect, szConnStrOut is non-NULL at input. */ +/* Otherwise, it will be set to NULL */ +SQLRETURN SQL_SPI SQLPoolConnectW( + SQLHDBC hdbc, + SQLHDBC_INFO_TOKEN hDbcInfoToken, + SQLWCHAR *szConnStrOut, + SQLSMALLINT cchConnStrOutMax, + SQLSMALLINT *pcchConnStrOut); + +/* Clean up a pool Id that was timed out */ +/*/ poolID [in]: the pool ID (under EnvironmentHandle) to be cleaned */ +SQLRETURN SQL_SPI SQLCleanupConnectionPoolID( + SQLHENV EnvironmentHandle, + POOLID poolID); + +/*-----------------------------------------------------------------------------*/ +/* functions for ANSI drivers */ + +/* Set connection attributes into DBC info token */ +SQLRETURN SQL_SPI SQLSetConnectAttrForDbcInfoA( + SQLHDBC_INFO_TOKEN hDbcInfoToken, + SQLINTEGER Attribute, + SQLPOINTER Value, + SQLINTEGER StringLength); + +/* Set connection information for SQLDriverConnect */ +SQLRETURN SQL_SPI SQLSetDriverConnectInfoA( + SQLHDBC_INFO_TOKEN hDbcInfoToken, + SQLCHAR *szConnStrIn, + SQLSMALLINT cchConnStrIn); + +/* Set connection information for SQLConnect */ +SQLRETURN SQL_SPI SQLSetConnectInfoA +( + SQLHDBC_INFO_TOKEN hDbcInfoToken, + SQLCHAR *szDSN, + SQLSMALLINT cchDSN, + SQLCHAR *szUID, + SQLSMALLINT cchUID, + SQLCHAR *szAuthStr, + SQLSMALLINT cchAuthStr +); + +/* Create a physical connection */ +/* If application is calling SQLDriverConnect, szConnStrOut is non-NULL at input. */ +/* Otherwise, it will be set to NULL */ +SQLRETURN SQL_SPI SQLPoolConnectA( + SQLHDBC hdbc, + SQLHDBC_INFO_TOKEN hDbcInfoToken, + SQLCHAR *szConnStrOut, + SQLSMALLINT cchConnStrOutMax, + SQLSMALLINT *pcchConnStrOut); + +/*-----------------------------------------------------------------------------*/ +/* Unicode mapping */ +/* Define SQL_NOUNICODEMAP to disable the mapping */ +#if (!defined(SQL_NOUNICODEMAP) && defined(UNICODE)) +#define SQLSetConnectAttrForDbcInfo SQLSetConnectAttrForDbcInfoW +#define SQLSetDriverConnectInfo SQLSetDriverConnectInfoW +#define SQLSetConnectInfo SQLSetConnectInfoW +#define SQLPoolConnect SQLPoolConnectW +#else +#define SQLSetConnectAttrForDbcInfo SQLSetConnectAttrForDbcInfoA +#define SQLSetDriverConnectInfo SQLSetDriverConnectInfoA +#define SQLSetConnectInfo SQLSetConnectInfoA +#define SQLPoolConnect SQLPoolConnectA +#endif +/*------------------------------------------------------------------------------*/ + +/*-------------------- Async Notification --------------------------*/ +#if (ODBCVER >= 0x0380) +#define SQL_ATTR_ASYNC_DBC_NOTIFICATION_CALLBACK 120 +#define SQL_ATTR_ASYNC_DBC_NOTIFICATION_CONTEXT 121 + +#define SQL_ATTR_ASYNC_STMT_NOTIFICATION_CALLBACK 30 +#define SQL_ATTR_ASYNC_STMT_NOTIFICATION_CONTEXT 31 + +typedef SQLRETURN (SQL_API *SQL_ASYNC_NOTIFICATION_CALLBACK)(SQLPOINTER pContext, BOOL fLast); +#endif /* ODBCVER >= 0x0380 */ + + +#ifdef __cplusplus +} // End of extern "C" { +#endif +#endif diff --git a/mssql_python/libs/macos/odbc_include/sqltypes.h b/mssql_python/libs/macos/odbc_include/sqltypes.h new file mode 100644 index 00000000..c3350c2c --- /dev/null +++ b/mssql_python/libs/macos/odbc_include/sqltypes.h @@ -0,0 +1,482 @@ +/************************************************************* + * sqltypes.h + * + * This is the lowest level include in unixODBC. It defines + * the basic types required by unixODBC and is heavily based + * upon the MS include of the same name (it has to be for + * binary compatability between drivers developed under different + * packages). + * + * You can include this file directly, but it is almost always + * included indirectly, by including, for example sqlext.h + * + * This include makes no effort to be useful on any platforms other + * than Linux (with some exceptions for UNIX in general). + * + * !!!DO NOT CONTAMINATE THIS FILE WITH NON-Linux CODE!!! + * + *************************************************************/ +#ifndef __SQLTYPES_H +#define __SQLTYPES_H + +/**************************** + * default to the 3.80 definitions. should define ODBCVER before here if you want an older set of defines + ***************************/ +#ifndef ODBCVER +#define ODBCVER 0x0380 +#endif + +/* + * if this is set, then use a 4 byte unicode definition, instead of the 2 byte definition that MS use + */ + +#ifdef SQL_WCHART_CONVERT +/* + * Use this if you want to use the C/C++ portable definition of a wide char, wchar_t + * Microsoft hardcoded a definition of unsigned short which may not be compatible with + * your platform specific wide char definition. + */ +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * unixODBC needs to know the size of a long integer to #define certain data types. + * SIZEOF_LONG_INT is defined by unixODBC but is not usually defined by other programs. + * In these cases, the compiler uses #defines stored in unixodbc.h to determine the + * correct data types for the target system. + * + * Refer to unixodbc_conf.h for other build-time settings. + */ + +#ifndef SIZEOF_LONG_INT +#include "unixodbc.h" +#endif + +#ifndef SIZEOF_LONG_INT +#error "unixODBC needs to know the size of a `long int' to continue!!!" +#endif + +/**************************** + * These make up for having no windows.h + ***************************/ +#ifndef ALREADY_HAVE_WINDOWS_TYPE + +#define FAR +#define CALLBACK +#ifdef __OS2__ +#define SQL_API _System +#else +#define SQL_API +#endif +#define BOOL int +#ifndef _WINDOWS_ +typedef void* HWND; +#endif +typedef char CHAR; +#ifdef UNICODE + +/* + * NOTE: The Microsoft unicode define is only for apps that want to use TCHARs and + * be able to compile for both unicode and non-unicode with the same source. + * This is not recommended for linux applications and is not supported + * by the standard linux string header files. + */ +#ifdef SQL_WCHART_CONVERT +typedef wchar_t TCHAR; +#else +typedef signed short TCHAR; +#endif + +#else +typedef char TCHAR; +#endif + +typedef unsigned short WORD; +#if (SIZEOF_LONG_INT == 4) +typedef unsigned long DWORD; +#else +typedef unsigned int DWORD; +#endif +typedef unsigned char BYTE; + +#ifdef SQL_WCHART_CONVERT +typedef wchar_t WCHAR; +#else +typedef unsigned short WCHAR; +#endif + +typedef WCHAR* LPWSTR; +typedef const char* LPCSTR; +typedef const WCHAR* LPCWSTR; +typedef TCHAR* LPTSTR; +typedef char* LPSTR; +typedef DWORD* LPDWORD; + +#ifndef _WINDOWS_ +typedef void* HINSTANCE; +#endif + +#endif + + +/**************************** + * standard SQL* data types. use these as much as possible when using ODBC calls/vars + ***************************/ +typedef unsigned char SQLCHAR; + +#if (ODBCVER >= 0x0300) +typedef unsigned char SQLDATE; +typedef unsigned char SQLDECIMAL; +typedef double SQLDOUBLE; +typedef double SQLFLOAT; +#endif + +/* + * can't use a long; it fails on 64 platforms + */ + +/* + * Hopefully by now it should be safe to assume most drivers know about SQLLEN now + * and the default is now sizeof( SQLLEN ) = 8 on 64 bit platforms + * + */ + +#if (SIZEOF_LONG_INT == 8) +#ifdef BUILD_LEGACY_64_BIT_MODE +typedef int SQLINTEGER; +typedef unsigned int SQLUINTEGER; +#define SQLLEN SQLINTEGER +#define SQLULEN SQLUINTEGER +#define SQLSETPOSIROW SQLUSMALLINT +/* + * These are not supprted on 64bit ODBC according to MS, removed, so use at your peril + * + typedef SQLULEN SQLROWCOUNT; + typedef SQLULEN SQLROWSETSIZE; + typedef SQLULEN SQLTRANSID; + typedef SQLLEN SQLROWOFFSET; +*/ +#else +typedef int SQLINTEGER; +typedef unsigned int SQLUINTEGER; +typedef long SQLLEN; +typedef unsigned long SQLULEN; +typedef unsigned long SQLSETPOSIROW; +/* + * These are not supprted on 64bit ODBC according to MS, removed, so use at your peril + * + typedef SQLULEN SQLTRANSID; + typedef SQLULEN SQLROWCOUNT; + typedef SQLUINTEGER SQLROWSETSIZE; + typedef SQLLEN SQLROWOFFSET; + */ +#endif +#else +typedef long SQLINTEGER; +typedef unsigned long SQLUINTEGER; + +/* Handle case of building on mingw-w64 */ + +#ifdef _WIN64 +typedef long long SQLLEN; +typedef unsigned long long SQLULEN; +typedef unsigned long long SQLSETPOSIROW; +#else +#define SQLLEN SQLINTEGER +#define SQLULEN SQLUINTEGER +#define SQLSETPOSIROW SQLUSMALLINT +#endif + +typedef SQLULEN SQLROWCOUNT; +typedef SQLULEN SQLROWSETSIZE; +typedef SQLULEN SQLTRANSID; +typedef SQLLEN SQLROWOFFSET; +#endif + +#if (ODBCVER >= 0x0300) +typedef unsigned char SQLNUMERIC; +#endif + +typedef void * SQLPOINTER; + +#if (ODBCVER >= 0x0300) +typedef float SQLREAL; +#endif + +typedef signed short int SQLSMALLINT; +typedef unsigned short SQLUSMALLINT; + +#if (ODBCVER >= 0x0300) +typedef unsigned char SQLTIME; +typedef unsigned char SQLTIMESTAMP; +typedef unsigned char SQLVARCHAR; +#endif + +typedef SQLSMALLINT SQLRETURN; + +#if (ODBCVER >= 0x0300) +typedef void * SQLHANDLE; +typedef SQLHANDLE SQLHENV; +typedef SQLHANDLE SQLHDBC; +typedef SQLHANDLE SQLHSTMT; +typedef SQLHANDLE SQLHDESC; +#else +typedef void * SQLHENV; +typedef void * SQLHDBC; +typedef void * SQLHSTMT; +/* + * some things like PHP won't build without this + */ +typedef void * SQLHANDLE; +#endif + +/**************************** + * These are cast into the actual struct that is being passed around. The + * DriverManager knows what its structs look like and the Driver knows about its + * structs... the app knows nothing about them... just void* + * These are deprecated in favour of SQLHENV, SQLHDBC, SQLHSTMT + ***************************/ + +#if (ODBCVER >= 0x0300) +typedef SQLHANDLE HENV; +typedef SQLHANDLE HDBC; +typedef SQLHANDLE HSTMT; +#else +typedef void * HENV; +typedef void * HDBC; +typedef void * HSTMT; +#endif + + +/**************************** + * more basic data types to augment what windows.h provides + ***************************/ +#ifndef ALREADY_HAVE_WINDOWS_TYPE + +typedef unsigned char UCHAR; +typedef signed char SCHAR; +typedef SCHAR SQLSCHAR; +#if (SIZEOF_LONG_INT == 4) +typedef long int SDWORD; +typedef unsigned long int UDWORD; +#else +typedef int SDWORD; +typedef unsigned int UDWORD; +#endif +typedef signed short int SWORD; +typedef unsigned short int UWORD; +typedef unsigned int UINT; +typedef signed long SLONG; +typedef signed short SSHORT; +typedef unsigned long ULONG; +typedef unsigned short USHORT; +typedef double SDOUBLE; +typedef double LDOUBLE; +typedef float SFLOAT; +typedef void* PTR; +typedef signed short RETCODE; +typedef void* SQLHWND; + +#endif + +/**************************** + * standard structs for working with date/times + ***************************/ +#ifndef __SQLDATE +#define __SQLDATE +typedef struct tagDATE_STRUCT +{ + SQLSMALLINT year; + SQLUSMALLINT month; + SQLUSMALLINT day; +} DATE_STRUCT; + +#if (ODBCVER >= 0x0300) +typedef DATE_STRUCT SQL_DATE_STRUCT; +#endif + +typedef struct tagTIME_STRUCT +{ + SQLUSMALLINT hour; + SQLUSMALLINT minute; + SQLUSMALLINT second; +} TIME_STRUCT; + +#if (ODBCVER >= 0x0300) +typedef TIME_STRUCT SQL_TIME_STRUCT; +#endif + +typedef struct tagTIMESTAMP_STRUCT +{ + SQLSMALLINT year; + SQLUSMALLINT month; + SQLUSMALLINT day; + SQLUSMALLINT hour; + SQLUSMALLINT minute; + SQLUSMALLINT second; + SQLUINTEGER fraction; +} TIMESTAMP_STRUCT; + +#if (ODBCVER >= 0x0300) +typedef TIMESTAMP_STRUCT SQL_TIMESTAMP_STRUCT; +#endif + + +#if (ODBCVER >= 0x0300) +typedef enum +{ + SQL_IS_YEAR = 1, + SQL_IS_MONTH = 2, + SQL_IS_DAY = 3, + SQL_IS_HOUR = 4, + SQL_IS_MINUTE = 5, + SQL_IS_SECOND = 6, + SQL_IS_YEAR_TO_MONTH = 7, + SQL_IS_DAY_TO_HOUR = 8, + SQL_IS_DAY_TO_MINUTE = 9, + SQL_IS_DAY_TO_SECOND = 10, + SQL_IS_HOUR_TO_MINUTE = 11, + SQL_IS_HOUR_TO_SECOND = 12, + SQL_IS_MINUTE_TO_SECOND = 13 +} SQLINTERVAL; + +#endif + +#if (ODBCVER >= 0x0300) +typedef struct tagSQL_YEAR_MONTH +{ + SQLUINTEGER year; + SQLUINTEGER month; +} SQL_YEAR_MONTH_STRUCT; + +typedef struct tagSQL_DAY_SECOND +{ + SQLUINTEGER day; + SQLUINTEGER hour; + SQLUINTEGER minute; + SQLUINTEGER second; + SQLUINTEGER fraction; +} SQL_DAY_SECOND_STRUCT; + +typedef struct tagSQL_INTERVAL_STRUCT +{ + SQLINTERVAL interval_type; + SQLSMALLINT interval_sign; + union { + SQL_YEAR_MONTH_STRUCT year_month; + SQL_DAY_SECOND_STRUCT day_second; + } intval; + +} SQL_INTERVAL_STRUCT; + +#endif + +#endif + +/**************************** + * + ***************************/ +#ifndef ODBCINT64 +# if (ODBCVER >= 0x0300) +# if (SIZEOF_LONG_INT == 8) +# define ODBCINT64 long +# define UODBCINT64 unsigned long +# define ODBCINT64_TYPE "long" +# define UODBCINT64_TYPE "unsigned long" +# else +# ifdef HAVE_LONG_LONG +# define ODBCINT64 long long +# define UODBCINT64 unsigned long long +# define ODBCINT64_TYPE "long long" +# define UODBCINT64_TYPE "unsigned long long" +# else +/* + * may fail in some cases, but what else can we do ? + */ +struct __bigint_struct +{ + int hiword; + unsigned int loword; +}; +struct __bigint_struct_u +{ + unsigned int hiword; + unsigned int loword; +}; +# define ODBCINT64 struct __bigint_struct +# define UODBCINT64 struct __bigint_struct_u +# define ODBCINT64_TYPE "struct __bigint_struct" +# define UODBCINT64_TYPE "struct __bigint_struct_u" +# endif +# endif +#endif +#endif + +#ifdef ODBCINT64 +typedef ODBCINT64 SQLBIGINT; +#endif +#ifdef UODBCINT64 +typedef UODBCINT64 SQLUBIGINT; +#endif + + +/**************************** + * cursor and bookmark + ***************************/ +#if (ODBCVER >= 0x0300) +#define SQL_MAX_NUMERIC_LEN 16 +typedef struct tagSQL_NUMERIC_STRUCT +{ + SQLCHAR precision; + SQLSCHAR scale; + SQLCHAR sign; /* 1=pos 0=neg */ + SQLCHAR val[SQL_MAX_NUMERIC_LEN]; +} SQL_NUMERIC_STRUCT; +#endif + +#if (ODBCVER >= 0x0350) +#ifdef GUID_DEFINED +#ifndef ALREADY_HAVE_WINDOWS_TYPE +typedef GUID SQLGUID; +#else +typedef struct tagSQLGUID +{ + DWORD Data1; + WORD Data2; + WORD Data3; + BYTE Data4[ 8 ]; +} SQLGUID; +#endif +#else +typedef struct tagSQLGUID +{ + DWORD Data1; + WORD Data2; + WORD Data3; + BYTE Data4[ 8 ]; +} SQLGUID; +#endif +#endif + +typedef SQLULEN BOOKMARK; + +typedef WCHAR SQLWCHAR; + +#ifdef UNICODE +typedef SQLWCHAR SQLTCHAR; +#else +typedef SQLCHAR SQLTCHAR; +#endif + +#ifdef __cplusplus +} +#endif + +#endif + + + diff --git a/mssql_python/libs/macos/odbc_include/sqlucode.h b/mssql_python/libs/macos/odbc_include/sqlucode.h new file mode 100644 index 00000000..7b29bde8 --- /dev/null +++ b/mssql_python/libs/macos/odbc_include/sqlucode.h @@ -0,0 +1,789 @@ +/************************************************** + * sqlucode.h + * + * These should be consistent with the MS version. + * + **************************************************/ +#ifndef __SQLUCODE_H +#define __SQLUCODE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define SQL_WCHAR (-8) +#define SQL_WVARCHAR (-9) +#define SQL_WLONGVARCHAR (-10) +#define SQL_C_WCHAR SQL_WCHAR + +#ifdef UNICODE +#define SQL_C_TCHAR SQL_C_WCHAR +#else +#define SQL_C_TCHAR SQL_C_CHAR +#endif + +#define SQL_SQLSTATE_SIZEW 10 /* size of SQLSTATE for unicode */ + +/* UNICODE versions */ + +SQLRETURN SQL_API SQLColAttributeW( + SQLHSTMT hstmt, + SQLUSMALLINT iCol, + SQLUSMALLINT iField, + SQLPOINTER pCharAttr, + SQLSMALLINT cbCharAttrMax, + SQLSMALLINT *pcbCharAttr, + SQLLEN *pNumAttr); + +SQLRETURN SQL_API SQLColAttributesW( + SQLHSTMT hstmt, + SQLUSMALLINT icol, + SQLUSMALLINT fDescType, + SQLPOINTER rgbDesc, + SQLSMALLINT cbDescMax, + SQLSMALLINT *pcbDesc, + SQLLEN *pfDesc); + +SQLRETURN SQL_API SQLConnectW( + SQLHDBC hdbc, + SQLWCHAR *szDSN, + SQLSMALLINT cbDSN, + SQLWCHAR *szUID, + SQLSMALLINT cbUID, + SQLWCHAR *szAuthStr, + SQLSMALLINT cbAuthStr); + + +SQLRETURN SQL_API SQLDescribeColW( + SQLHSTMT hstmt, + SQLUSMALLINT icol, + SQLWCHAR *szColName, + SQLSMALLINT cbColNameMax, + SQLSMALLINT *pcbColName, + SQLSMALLINT *pfSqlType, + SQLULEN *pcbColDef, + SQLSMALLINT *pibScale, + SQLSMALLINT *pfNullable); + + +SQLRETURN SQL_API SQLErrorW( + SQLHENV henv, + SQLHDBC hdbc, + SQLHSTMT hstmt, + SQLWCHAR *szSqlState, + SQLINTEGER *pfNativeError, + SQLWCHAR *szErrorMsg, + SQLSMALLINT cbErrorMsgMax, + SQLSMALLINT *pcbErrorMsg); + +SQLRETURN SQL_API SQLExecDirectW( + SQLHSTMT hstmt, + SQLWCHAR *szSqlStr, + SQLINTEGER cbSqlStr); + +SQLRETURN SQL_API SQLGetConnectAttrW( + SQLHDBC hdbc, + SQLINTEGER fAttribute, + SQLPOINTER rgbValue, + SQLINTEGER cbValueMax, + SQLINTEGER *pcbValue); + +SQLRETURN SQL_API SQLGetCursorNameW( + SQLHSTMT hstmt, + SQLWCHAR *szCursor, + SQLSMALLINT cbCursorMax, + SQLSMALLINT *pcbCursor); + +#if (ODBCVER >= 0x0300) +SQLRETURN SQL_API SQLSetDescFieldW(SQLHDESC DescriptorHandle, + SQLSMALLINT RecNumber, + SQLSMALLINT FieldIdentifier, + SQLPOINTER Value, + SQLINTEGER BufferLength); + + + +SQLRETURN SQL_API SQLGetDescFieldW( + SQLHDESC hdesc, + SQLSMALLINT iRecord, + SQLSMALLINT iField, + SQLPOINTER rgbValue, + SQLINTEGER cbValueMax, + SQLINTEGER *pcbValue); + +SQLRETURN SQL_API SQLGetDescRecW( + SQLHDESC hdesc, + SQLSMALLINT iRecord, + SQLWCHAR *szName, + SQLSMALLINT cbNameMax, + SQLSMALLINT *pcbName, + SQLSMALLINT *pfType, + SQLSMALLINT *pfSubType, + SQLLEN *pLength, + SQLSMALLINT *pPrecision, + SQLSMALLINT *pScale, + SQLSMALLINT *pNullable); + +SQLRETURN SQL_API SQLGetDiagFieldW( + SQLSMALLINT fHandleType, + SQLHANDLE handle, + SQLSMALLINT iRecord, + SQLSMALLINT fDiagField, + SQLPOINTER rgbDiagInfo, + SQLSMALLINT cbDiagInfoMax, + SQLSMALLINT *pcbDiagInfo); + +SQLRETURN SQL_API SQLGetDiagRecW( + SQLSMALLINT fHandleType, + SQLHANDLE handle, + SQLSMALLINT iRecord, + SQLWCHAR *szSqlState, + SQLINTEGER *pfNativeError, + SQLWCHAR *szErrorMsg, + SQLSMALLINT cbErrorMsgMax, + SQLSMALLINT *pcbErrorMsg); + + +#endif + + +SQLRETURN SQL_API SQLPrepareW( + SQLHSTMT hstmt, + SQLWCHAR *szSqlStr, + SQLINTEGER cbSqlStr); + +SQLRETURN SQL_API SQLSetConnectAttrW( + SQLHDBC hdbc, + SQLINTEGER fAttribute, + SQLPOINTER rgbValue, + SQLINTEGER cbValue); + +SQLRETURN SQL_API SQLSetCursorNameW( + SQLHSTMT hstmt, + SQLWCHAR *szCursor, + SQLSMALLINT cbCursor); + + + + + + + +SQLRETURN SQL_API SQLColumnsW( + SQLHSTMT hstmt, + SQLWCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLWCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLWCHAR *szTableName, + SQLSMALLINT cbTableName, + SQLWCHAR *szColumnName, + SQLSMALLINT cbColumnName); + +SQLRETURN SQL_API SQLGetConnectOptionW( + SQLHDBC hdbc, + SQLUSMALLINT fOption, + SQLPOINTER pvParam); + + + +SQLRETURN SQL_API SQLGetInfoW( + SQLHDBC hdbc, + SQLUSMALLINT fInfoType, + SQLPOINTER rgbInfoValue, + SQLSMALLINT cbInfoValueMax, + SQLSMALLINT *pcbInfoValue); + +SQLRETURN SQL_API SQLGetTypeInfoW( + SQLHSTMT StatementHandle, + SQLSMALLINT DataType); + + +SQLRETURN SQL_API SQLSetConnectOptionW( + SQLHDBC hdbc, + SQLUSMALLINT fOption, + SQLULEN vParam); + + +SQLRETURN SQL_API SQLSpecialColumnsW( + SQLHSTMT hstmt, + SQLUSMALLINT fColType, + SQLWCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLWCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLWCHAR *szTableName, + SQLSMALLINT cbTableName, + SQLUSMALLINT fScope, + SQLUSMALLINT fNullable); + +SQLRETURN SQL_API SQLStatisticsW( + SQLHSTMT hstmt, + SQLWCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLWCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLWCHAR *szTableName, + SQLSMALLINT cbTableName, + SQLUSMALLINT fUnique, + SQLUSMALLINT fAccuracy); + +SQLRETURN SQL_API SQLTablesW( + SQLHSTMT hstmt, + SQLWCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLWCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLWCHAR *szTableName, + SQLSMALLINT cbTableName, + SQLWCHAR *szTableType, + SQLSMALLINT cbTableType); + + + +SQLRETURN SQL_API SQLDataSourcesW( + SQLHENV henv, + SQLUSMALLINT fDirection, + SQLWCHAR *szDSN, + SQLSMALLINT cbDSNMax, + SQLSMALLINT *pcbDSN, + SQLWCHAR *szDescription, + SQLSMALLINT cbDescriptionMax, + SQLSMALLINT *pcbDescription); + + + + +SQLRETURN SQL_API SQLDriverConnectW( + SQLHDBC hdbc, + SQLHWND hwnd, + SQLWCHAR *szConnStrIn, + SQLSMALLINT cbConnStrIn, + SQLWCHAR *szConnStrOut, + SQLSMALLINT cbConnStrOutMax, + SQLSMALLINT *pcbConnStrOut, + SQLUSMALLINT fDriverCompletion); + + +SQLRETURN SQL_API SQLBrowseConnectW( + SQLHDBC hdbc, + SQLWCHAR *szConnStrIn, + SQLSMALLINT cbConnStrIn, + SQLWCHAR *szConnStrOut, + SQLSMALLINT cbConnStrOutMax, + SQLSMALLINT *pcbConnStrOut); + +SQLRETURN SQL_API SQLColumnPrivilegesW( + SQLHSTMT hstmt, + SQLWCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLWCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLWCHAR *szTableName, + SQLSMALLINT cbTableName, + SQLWCHAR *szColumnName, + SQLSMALLINT cbColumnName); + +SQLRETURN SQL_API SQLGetStmtAttrW( + SQLHSTMT hstmt, + SQLINTEGER fAttribute, + SQLPOINTER rgbValue, + SQLINTEGER cbValueMax, + SQLINTEGER *pcbValue); + +SQLRETURN SQL_API SQLSetStmtAttrW( + SQLHSTMT hstmt, + SQLINTEGER fAttribute, + SQLPOINTER rgbValue, + SQLINTEGER cbValueMax); + +SQLRETURN SQL_API SQLForeignKeysW( + SQLHSTMT hstmt, + SQLWCHAR *szPkCatalogName, + SQLSMALLINT cbPkCatalogName, + SQLWCHAR *szPkSchemaName, + SQLSMALLINT cbPkSchemaName, + SQLWCHAR *szPkTableName, + SQLSMALLINT cbPkTableName, + SQLWCHAR *szFkCatalogName, + SQLSMALLINT cbFkCatalogName, + SQLWCHAR *szFkSchemaName, + SQLSMALLINT cbFkSchemaName, + SQLWCHAR *szFkTableName, + SQLSMALLINT cbFkTableName); + + +SQLRETURN SQL_API SQLNativeSqlW( + SQLHDBC hdbc, + SQLWCHAR *szSqlStrIn, + SQLINTEGER cbSqlStrIn, + SQLWCHAR *szSqlStr, + SQLINTEGER cbSqlStrMax, + SQLINTEGER *pcbSqlStr); + + +SQLRETURN SQL_API SQLPrimaryKeysW( + SQLHSTMT hstmt, + SQLWCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLWCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLWCHAR *szTableName, + SQLSMALLINT cbTableName); + +SQLRETURN SQL_API SQLProcedureColumnsW( + SQLHSTMT hstmt, + SQLWCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLWCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLWCHAR *szProcName, + SQLSMALLINT cbProcName, + SQLWCHAR *szColumnName, + SQLSMALLINT cbColumnName); + +SQLRETURN SQL_API SQLProceduresW( + SQLHSTMT hstmt, + SQLWCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLWCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLWCHAR *szProcName, + SQLSMALLINT cbProcName); + + +SQLRETURN SQL_API SQLTablePrivilegesW( + SQLHSTMT hstmt, + SQLWCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLWCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLWCHAR *szTableName, + SQLSMALLINT cbTableName); + +SQLRETURN SQL_API SQLDriversW( + SQLHENV henv, + SQLUSMALLINT fDirection, + SQLWCHAR *szDriverDesc, + SQLSMALLINT cbDriverDescMax, + SQLSMALLINT *pcbDriverDesc, + SQLWCHAR *szDriverAttributes, + SQLSMALLINT cbDrvrAttrMax, + SQLSMALLINT *pcbDrvrAttr); + + +/* ANSI versions */ + +SQLRETURN SQL_API SQLColAttributeA( + SQLHSTMT hstmt, + SQLSMALLINT iCol, + SQLSMALLINT iField, + SQLPOINTER pCharAttr, + SQLSMALLINT cbCharAttrMax, + SQLSMALLINT *pcbCharAttr, + SQLLEN *pNumAttr); + +SQLRETURN SQL_API SQLColAttributesA( + SQLHSTMT hstmt, + SQLUSMALLINT icol, + SQLUSMALLINT fDescType, + SQLPOINTER rgbDesc, + SQLSMALLINT cbDescMax, + SQLSMALLINT *pcbDesc, + SQLLEN *pfDesc); + +SQLRETURN SQL_API SQLConnectA( + SQLHDBC hdbc, + SQLCHAR *szDSN, + SQLSMALLINT cbDSN, + SQLCHAR *szUID, + SQLSMALLINT cbUID, + SQLCHAR *szAuthStr, + SQLSMALLINT cbAuthStr); + + +SQLRETURN SQL_API SQLDescribeColA( + SQLHSTMT hstmt, + SQLUSMALLINT icol, + SQLCHAR *szColName, + SQLSMALLINT cbColNameMax, + SQLSMALLINT *pcbColName, + SQLSMALLINT *pfSqlType, + SQLULEN *pcbColDef, + SQLSMALLINT *pibScale, + SQLSMALLINT *pfNullable); + + +SQLRETURN SQL_API SQLErrorA( + SQLHENV henv, + SQLHDBC hdbc, + SQLHSTMT hstmt, + SQLCHAR *szSqlState, + SQLINTEGER *pfNativeError, + SQLCHAR *szErrorMsg, + SQLSMALLINT cbErrorMsgMax, + SQLSMALLINT *pcbErrorMsg); + +SQLRETURN SQL_API SQLExecDirectA( + SQLHSTMT hstmt, + SQLCHAR *szSqlStr, + SQLINTEGER cbSqlStr); + +SQLRETURN SQL_API SQLGetConnectAttrA( + SQLHDBC hdbc, + SQLINTEGER fAttribute, + SQLPOINTER rgbValue, + SQLINTEGER cbValueMax, + SQLINTEGER *pcbValue); + +SQLRETURN SQL_API SQLGetCursorNameA( + SQLHSTMT hstmt, + SQLCHAR *szCursor, + SQLSMALLINT cbCursorMax, + SQLSMALLINT *pcbCursor); + +#if (ODBCVER >= 0x0300) +SQLRETURN SQL_API SQLGetDescFieldA( + SQLHDESC hdesc, + SQLSMALLINT iRecord, + SQLSMALLINT iField, + SQLPOINTER rgbValue, + SQLINTEGER cbValueMax, + SQLINTEGER *pcbValue); + +SQLRETURN SQL_API SQLGetDescRecA( + SQLHDESC hdesc, + SQLSMALLINT iRecord, + SQLCHAR *szName, + SQLSMALLINT cbNameMax, + SQLSMALLINT *pcbName, + SQLSMALLINT *pfType, + SQLSMALLINT *pfSubType, + SQLLEN *pLength, + SQLSMALLINT *pPrecision, + SQLSMALLINT *pScale, + SQLSMALLINT *pNullable); + +SQLRETURN SQL_API SQLGetDiagFieldA( + SQLSMALLINT fHandleType, + SQLHANDLE handle, + SQLSMALLINT iRecord, + SQLSMALLINT fDiagField, + SQLPOINTER rgbDiagInfo, + SQLSMALLINT cbDiagInfoMax, + SQLSMALLINT *pcbDiagInfo); + +SQLRETURN SQL_API SQLGetDiagRecA( + SQLSMALLINT fHandleType, + SQLHANDLE handle, + SQLSMALLINT iRecord, + SQLCHAR *szSqlState, + SQLINTEGER *pfNativeError, + SQLCHAR *szErrorMsg, + SQLSMALLINT cbErrorMsgMax, + SQLSMALLINT *pcbErrorMsg); + + +SQLRETURN SQL_API SQLGetStmtAttrA( + SQLHSTMT hstmt, + SQLINTEGER fAttribute, + SQLPOINTER rgbValue, + SQLINTEGER cbValueMax, + SQLINTEGER *pcbValue); + +#endif + +SQLRETURN SQL_API SQLGetTypeInfoA( + SQLHSTMT StatementHandle, + SQLSMALLINT DataTyoe); + +SQLRETURN SQL_API SQLPrepareA( + SQLHSTMT hstmt, + SQLCHAR *szSqlStr, + SQLINTEGER cbSqlStr); + +SQLRETURN SQL_API SQLSetConnectAttrA( + SQLHDBC hdbc, + SQLINTEGER fAttribute, + SQLPOINTER rgbValue, + SQLINTEGER cbValue); + +SQLRETURN SQL_API SQLSetCursorNameA( + SQLHSTMT hstmt, + SQLCHAR *szCursor, + SQLSMALLINT cbCursor); + + + + + + + +SQLRETURN SQL_API SQLColumnsA( + SQLHSTMT hstmt, + SQLCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLCHAR *szTableName, + SQLSMALLINT cbTableName, + SQLCHAR *szColumnName, + SQLSMALLINT cbColumnName); + +SQLRETURN SQL_API SQLGetConnectOptionA( + SQLHDBC hdbc, + SQLUSMALLINT fOption, + SQLPOINTER pvParam); + + + +SQLRETURN SQL_API SQLGetInfoA( + SQLHDBC hdbc, + SQLUSMALLINT fInfoType, + SQLPOINTER rgbInfoValue, + SQLSMALLINT cbInfoValueMax, + SQLSMALLINT* pcbInfoValue); + +SQLRETURN SQL_API SQLGetStmtOptionA( + SQLHSTMT hstmt, + SQLUSMALLINT fOption, + SQLPOINTER pvParam); + +SQLRETURN SQL_API SQLSetConnectOptionA( + SQLHDBC hdbc, + SQLUSMALLINT fOption, + SQLULEN vParam); + +SQLRETURN SQL_API SQLSetStmtOptionA( + SQLHSTMT hstmt, + SQLUSMALLINT fOption, + SQLULEN vParam); + +SQLRETURN SQL_API SQLSpecialColumnsA( + SQLHSTMT hstmt, + SQLUSMALLINT fColType, + SQLCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLCHAR *szTableName, + SQLSMALLINT cbTableName, + SQLUSMALLINT fScope, + SQLUSMALLINT fNullable); + +SQLRETURN SQL_API SQLStatisticsA( + SQLHSTMT hstmt, + + SQLCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLCHAR *szTableName, + SQLSMALLINT cbTableName, + SQLUSMALLINT fUnique, + SQLUSMALLINT fAccuracy); + +SQLRETURN SQL_API SQLTablesA( + SQLHSTMT hstmt, + + SQLCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLCHAR *szTableName, + SQLSMALLINT cbTableName, + SQLCHAR *szTableType, + + SQLSMALLINT cbTableType); + + + +SQLRETURN SQL_API SQLDataSourcesA( + SQLHENV henv, + SQLUSMALLINT fDirection, + SQLCHAR *szDSN, + SQLSMALLINT cbDSNMax, + SQLSMALLINT *pcbDSN, + SQLCHAR *szDescription, + SQLSMALLINT cbDescriptionMax, + SQLSMALLINT *pcbDescription); + + + + +SQLRETURN SQL_API SQLDriverConnectA( + SQLHDBC hdbc, + SQLHWND hwnd, + SQLCHAR *szConnStrIn, + SQLSMALLINT cbConnStrIn, + SQLCHAR *szConnStrOut, + SQLSMALLINT cbConnStrOutMax, + SQLSMALLINT *pcbConnStrOut, + SQLUSMALLINT fDriverCompletion); + + +SQLRETURN SQL_API SQLBrowseConnectA( + SQLHDBC hdbc, + SQLCHAR *szConnStrIn, + SQLSMALLINT cbConnStrIn, + SQLCHAR *szConnStrOut, + SQLSMALLINT cbConnStrOutMax, + SQLSMALLINT *pcbConnStrOut); + +SQLRETURN SQL_API SQLColumnPrivilegesA( + SQLHSTMT hstmt, + SQLCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLCHAR *szTableName, + SQLSMALLINT cbTableName, + SQLCHAR *szColumnName, + SQLSMALLINT cbColumnName); + +SQLRETURN SQL_API SQLDescribeParamA( + SQLHSTMT hstmt, + SQLUSMALLINT ipar, + SQLSMALLINT *pfSqlType, + SQLUINTEGER *pcbParamDef, + SQLSMALLINT *pibScale, + SQLSMALLINT *pfNullable); + + +SQLRETURN SQL_API SQLForeignKeysA( + SQLHSTMT hstmt, + SQLCHAR *szPkCatalogName, + SQLSMALLINT cbPkCatalogName, + SQLCHAR *szPkSchemaName, + SQLSMALLINT cbPkSchemaName, + SQLCHAR *szPkTableName, + SQLSMALLINT cbPkTableName, + SQLCHAR *szFkCatalogName, + SQLSMALLINT cbFkCatalogName, + SQLCHAR *szFkSchemaName, + SQLSMALLINT cbFkSchemaName, + SQLCHAR *szFkTableName, + SQLSMALLINT cbFkTableName); + + +SQLRETURN SQL_API SQLNativeSqlA( + SQLHDBC hdbc, + SQLCHAR *szSqlStrIn, + SQLINTEGER cbSqlStrIn, + SQLCHAR *szSqlStr, + SQLINTEGER cbSqlStrMax, + SQLINTEGER *pcbSqlStr); + + +SQLRETURN SQL_API SQLPrimaryKeysA( + SQLHSTMT hstmt, + SQLCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLCHAR *szTableName, + SQLSMALLINT cbTableName); + +SQLRETURN SQL_API SQLProcedureColumnsA( + SQLHSTMT hstmt, + SQLCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLCHAR *szProcName, + SQLSMALLINT cbProcName, + SQLCHAR *szColumnName, + SQLSMALLINT cbColumnName); + +SQLRETURN SQL_API SQLProceduresA( + SQLHSTMT hstmt, + SQLCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLCHAR *szProcName, + SQLSMALLINT cbProcName); + + +SQLRETURN SQL_API SQLTablePrivilegesA( + SQLHSTMT hstmt, + SQLCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, + SQLCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, + SQLCHAR *szTableName, + SQLSMALLINT cbTableName); + +SQLRETURN SQL_API SQLDriversA( + SQLHENV henv, + SQLUSMALLINT fDirection, + SQLCHAR *szDriverDesc, + SQLSMALLINT cbDriverDescMax, + SQLSMALLINT *pcbDriverDesc, + SQLCHAR *szDriverAttributes, + SQLSMALLINT cbDrvrAttrMax, + SQLSMALLINT *pcbDrvrAttr); + + + + + +/*---------------------------------------------*/ +/* Mapping macros for Unicode */ +/*---------------------------------------------*/ + +#ifndef SQL_NOUNICODEMAP /* define this to disable the mapping */ +#ifdef UNICODE + +#define SQLColAttribute SQLColAttributeW +#define SQLColAttributes SQLColAttributesW +#define SQLConnect SQLConnectW +#define SQLDescribeCol SQLDescribeColW +#define SQLError SQLErrorW +#define SQLExecDirect SQLExecDirectW +#define SQLGetConnectAttr SQLGetConnectAttrW +#define SQLGetCursorName SQLGetCursorNameW +#define SQLGetDescField SQLGetDescFieldW +#define SQLGetDescRec SQLGetDescRecW +#define SQLGetDiagField SQLGetDiagFieldW +#define SQLGetDiagRec SQLGetDiagRecW +#define SQLPrepare SQLPrepareW +#define SQLSetConnectAttr SQLSetConnectAttrW +#define SQLSetCursorName SQLSetCursorNameW +#define SQLSetDescField SQLSetDescFieldW +#define SQLSetStmtAttr SQLSetStmtAttrW +#define SQLGetStmtAttr SQLGetStmtAttrW +#define SQLColumns SQLColumnsW +#define SQLGetConnectOption SQLGetConnectOptionW +#define SQLGetInfo SQLGetInfoW +#define SQLGetTypeInfo SQLGetTypeInfoW +#define SQLSetConnectOption SQLSetConnectOptionW +#define SQLSpecialColumns SQLSpecialColumnsW +#define SQLStatistics SQLStatisticsW +#define SQLTables SQLTablesW +#define SQLDataSources SQLDataSourcesW +#define SQLDriverConnect SQLDriverConnectW +#define SQLBrowseConnect SQLBrowseConnectW +#define SQLColumnPrivileges SQLColumnPrivilegesW +#define SQLForeignKeys SQLForeignKeysW +#define SQLNativeSql SQLNativeSqlW +#define SQLPrimaryKeys SQLPrimaryKeysW +#define SQLProcedureColumns SQLProcedureColumnsW +#define SQLProcedures SQLProceduresW +#define SQLTablePrivileges SQLTablePrivilegesW +#define SQLDrivers SQLDriversW + +#endif /* UNICODE */ +#endif /* SQL_NOUNICODEMAP */ + +#ifdef __cplusplus +} +#endif + +#ifndef __SQLEXT_H +#include + +#endif + + +#endif diff --git a/mssql_python/libs/macos/odbc_include/unixODBC/unixodbc_conf.h b/mssql_python/libs/macos/odbc_include/unixODBC/unixodbc_conf.h new file mode 100644 index 00000000..b81ab0d1 --- /dev/null +++ b/mssql_python/libs/macos/odbc_include/unixODBC/unixodbc_conf.h @@ -0,0 +1,484 @@ +/* unixodbc_conf.h. Generated from unixodbc_conf.h.in by configure. */ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Encoding to use for CHAR */ +#define ASCII_ENCODING "auto-search" + +/* Install bindir */ +#define BIN_PREFIX "/opt/homebrew/Cellar/unixodbc/2.3.12/bin" + +/* Use a semaphore to allow ODBCConfig to display running counts */ +/* #undef COLLECT_STATS */ + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +/* #undef CRAY_STACKSEG_END */ + +/* Define to 1 if using `alloca.c'. */ +/* #undef C_ALLOCA */ + +/* Lib directory */ +#define DEFLIB_PATH "/opt/homebrew/Cellar/unixodbc/2.3.12/lib" + +/* Using perdriver iconv */ +/* #undef ENABLE_DRIVER_ICONV */ + +/* Using ini cacheing */ +#define ENABLE_INI_CACHING /**/ + +/* Install exec_prefix */ +#define EXEC_PREFIX "/opt/homebrew/Cellar/unixodbc/2.3.12" + +/* Disable the precise but slow checking of the validity of handles */ +/* #undef FAST_HANDLE_VALIDATE */ + +/* Define to 1 if you have `alloca', as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have and it should be used (not on Ultrix). + */ +#define HAVE_ALLOCA_H 1 + +/* Define to 1 if you have the `argz_add' function. */ +/* #undef HAVE_ARGZ_ADD */ + +/* Define to 1 if you have the `argz_append' function. */ +/* #undef HAVE_ARGZ_APPEND */ + +/* Define to 1 if you have the `argz_count' function. */ +/* #undef HAVE_ARGZ_COUNT */ + +/* Define to 1 if you have the `argz_create_sep' function. */ +/* #undef HAVE_ARGZ_CREATE_SEP */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_ARGZ_H */ + +/* Define to 1 if you have the `argz_insert' function. */ +/* #undef HAVE_ARGZ_INSERT */ + +/* Define to 1 if you have the `argz_next' function. */ +/* #undef HAVE_ARGZ_NEXT */ + +/* Define to 1 if you have the `argz_stringify' function. */ +/* #undef HAVE_ARGZ_STRINGIFY */ + +/* Define to 1 if you have the `atoll' function. */ +#define HAVE_ATOLL 1 + +/* Define to 1 if you have the `closedir' function. */ +#define HAVE_CLOSEDIR 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_CRYPT_H */ + +/* Define to 1 if you have the declaration of `cygwin_conv_path', and to 0 if + you don't. */ +/* #undef HAVE_DECL_CYGWIN_CONV_PATH */ + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#define HAVE_DIRENT_H 1 + +/* Define if you have the GNU dld library. */ +/* #undef HAVE_DLD */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DLD_H */ + +/* Define to 1 if you have the `dlerror' function. */ +#define HAVE_DLERROR 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DL_H */ + +/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ +/* #undef HAVE_DOPRNT */ + +/* Define if you have the _dyld_func_lookup function. */ +/* #undef HAVE_DYLD */ + +/* Add editline support */ +/* #undef HAVE_EDITLINE */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_EDITLINE_READLINE_H */ + +/* Define to 1 if you have the `endpwent' function. */ +#define HAVE_ENDPWENT 1 + +/* Define to 1 if the system has the type `error_t'. */ +/* #undef HAVE_ERROR_T */ + +/* Define to 1 if you have the `ftime' function. */ +#define HAVE_FTIME 1 + +/* Define to 1 if you have the `ftok' function. */ +/* #undef HAVE_FTOK */ + +/* Define to 1 if you have the `getpwuid' function. */ +#define HAVE_GETPWUID 1 + +/* Define to 1 if you have the `gettimeofday' function. */ +#define HAVE_GETTIMEOFDAY 1 + +/* Define to 1 if you have the `getuid' function. */ +#define HAVE_GETUID 1 + +/* Define if you have the iconv() function. */ +#define HAVE_ICONV 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define if you have and nl_langinfo(CODESET). */ +#define HAVE_LANGINFO_CODESET 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_LANGINFO_H 1 + +/* Add -lcrypt to lib list */ +/* #undef HAVE_LIBCRYPT */ + +/* Define if you have the libdl library or equivalent. */ +#define HAVE_LIBDL 1 + +/* Define if libdlloader will be built on this platform */ +#define HAVE_LIBDLLOADER 1 + +/* Use the -lpth thread library */ +/* #undef HAVE_LIBPTH */ + +/* Use -lpthread threading lib */ +#define HAVE_LIBPTHREAD 1 + +/* Use the -lthread threading lib */ +/* #undef HAVE_LIBTHREAD */ + +/* Define to 1 if you have the header file. */ +#define HAVE_LIMITS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_LOCALE_H 1 + +/* Use rentrant version of localtime */ +#define HAVE_LOCALTIME_R 1 + +/* Define this if a modern libltdl is already installed */ +#define HAVE_LTDL 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MACH_O_DYLD_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MALLOC_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MSQL_H */ + +/* Define to 1 if you have the header file, and it defines `DIR'. */ +/* #undef HAVE_NDIR_H */ + +/* Define to 1 if you have the `nl_langinfo' function. */ +#define HAVE_NL_LANGINFO 1 + +/* Define to 1 if you have the `opendir' function. */ +#define HAVE_OPENDIR 1 + +/* Define if libtool can extract symbol lists from object files. */ +#define HAVE_PRELOADED_SYMBOLS 1 + +/* Define to 1 if the system has the type `ptrdiff_t'. */ +#define HAVE_PTRDIFF_T 1 + +/* Define to 1 if you have the `putenv' function. */ +#define HAVE_PUTENV 1 + +/* Define to 1 if you have the `readdir' function. */ +#define HAVE_READDIR 1 + +/* Add readline support */ +#define HAVE_READLINE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_READLINE_HISTORY_H 1 + +/* Use the scandir lib */ +/* #undef HAVE_SCANDIR */ + +/* Define to 1 if you have the `semget' function. */ +/* #undef HAVE_SEMGET */ + +/* Define to 1 if you have the `semop' function. */ +/* #undef HAVE_SEMOP */ + +/* Define to 1 if you have the `setenv' function. */ +#define HAVE_SETENV 1 + +/* Define to 1 if you have the `setlocale' function. */ +#define HAVE_SETLOCALE 1 + +/* Define if you have the shl_load function. */ +/* #undef HAVE_SHL_LOAD */ + +/* Define to 1 if you have the `shmget' function. */ +/* #undef HAVE_SHMGET */ + +/* Define to 1 if you have the `snprintf' function. */ +#define HAVE_SNPRINTF 1 + +/* Define to 1 if you have the `socket' function. */ +#define HAVE_SOCKET 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDARG_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDDEF_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strcasecmp' function. */ +#define HAVE_STRCASECMP 1 + +/* Define to 1 if you have the `strchr' function. */ +#define HAVE_STRCHR 1 + +/* Define to 1 if you have the `strdup' function. */ +#define HAVE_STRDUP 1 + +/* Define to 1 if you have the `stricmp' function. */ +/* #undef HAVE_STRICMP */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strlcat' function. */ +#define HAVE_STRLCAT 1 + +/* Define to 1 if you have the `strlcpy' function. */ +#define HAVE_STRLCPY 1 + +/* Define to 1 if you have the `strncasecmp' function. */ +#define HAVE_STRNCASECMP 1 + +/* Define to 1 if you have the `strnicmp' function. */ +/* #undef HAVE_STRNICMP */ + +/* Define to 1 if you have the `strstr' function. */ +#define HAVE_STRSTR 1 + +/* Define to 1 if you have the `strtol' function. */ +#define HAVE_STRTOL 1 + +/* Define to 1 if you have the `strtoll' function. */ +#define HAVE_STRTOLL 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYNCH_H */ + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +/* #undef HAVE_SYS_DIR_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_DL_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_MALLOC_H 1 + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +/* #undef HAVE_SYS_NDIR_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SEM_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIMEB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the `time' function. */ +#define HAVE_TIME 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_TIME_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_VARARGS_H */ + +/* Define to 1 if you have the `vprintf' function. */ +#define HAVE_VPRINTF 1 + +/* Define to 1 if you have the `vsnprintf' function. */ +#define HAVE_VSNPRINTF 1 + +/* This value is set to 1 to indicate that the system argz facility works */ +/* #undef HAVE_WORKING_ARGZ */ + +/* Define as const if the declaration of iconv() needs const. */ +#define ICONV_CONST + +/* Install includedir */ +#define INCLUDE_PREFIX "/opt/homebrew/Cellar/unixodbc/2.3.12/include" + +/* Lib directory */ +#define LIB_PREFIX "/opt/homebrew/Cellar/unixodbc/2.3.12/lib" + +/* Define if the OS needs help to load dependent libraries for dlopen(). */ +/* #undef LTDL_DLOPEN_DEPLIBS */ + +/* Define to the system default library search path. */ +#define LT_DLSEARCH_PATH "/usr/local/lib:/lib:/usr/lib" + +/* The archive extension */ +#define LT_LIBEXT "a" + +/* The archive prefix */ +#define LT_LIBPREFIX "lib" + +/* Define to the extension used for runtime loadable modules, say, ".so". */ +#define LT_MODULE_EXT ".so" + +/* Define to the name of the environment variable that determines the run-time + module search path. */ +#define LT_MODULE_PATH_VAR "DYLD_LIBRARY_PATH" + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#define LT_OBJDIR ".libs/" + +/* Define to the shared library suffix, say, ".dylib". */ +#define LT_SHARED_EXT ".dylib" + +/* Define to the shared archive member specification, say "(shr.o)". */ +/* #undef LT_SHARED_LIB_MEMBER */ + +/* Define if you need semundo union */ +/* #undef NEED_SEMUNDO_UNION */ + +/* Define if dlsym() requires a leading underscore in symbol names. */ +/* #undef NEED_USCORE */ + +/* Using OSX */ +#define OSXHEADER /**/ + +/* Name of package */ + +/* Define to the address where bug reports for this package should be sent. */ + +/* Define to the full name of this package. */ + +/* Define to the full name and version of this package. */ + +/* Define to the one symbol short name of this package. */ + +/* Define to the home page for this package. */ + +/* Define to the version of this package. */ + +/* Platform is 64 bit */ +#define PLATFORM64 /**/ + +/* Install prefix */ +#define PREFIX "/opt/homebrew/Cellar/unixodbc/2.3.12" + +/* Using QNX */ +/* #undef QNX_LIBLTDL */ + +/* Shared lib extension */ +#define SHLIBEXT "`test .$module = .yes && echo .so || echo .dylib`" + +/* The size of `long', as computed by sizeof. */ +#define SIZEOF_LONG 8 + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +/* #undef STACK_DIRECTION */ + +/* Filename to use for ftok */ +#define STATS_FTOK_NAME "odbc.ini" + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* don't include unixODBC prefix in driver error messages */ +#define STRICT_ODBC_ERROR /**/ + +/* System file path */ +#define SYSTEM_FILE_PATH "/opt/homebrew/etc" + +/* Lib path */ +#define SYSTEM_LIB_PATH "/opt/homebrew/Cellar/unixodbc/2.3.12/lib" + +/* Define to 1 if you can safely include both and . */ +#define TIME_WITH_SYS_TIME 1 + +/* Define to 1 if your declares `struct tm'. */ +/* #undef TM_IN_SYS_TIME */ + +/* Encoding to use for UNICODE */ +#define UNICODE_ENCODING "auto-search" + +/* Flag that we are not using another DM */ +#define UNIXODBC /**/ + +/* We are building inside the unixODBC source tree */ + +/* Version number of package */ + +/* Work with IBM drivers that use 32 bit handles on 64 bit platforms */ +/* #undef WITH_HANDLE_REDIRECT */ + +/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a + `char[]'. */ +#define YYTEXT_POINTER 1 + +/* Build flag for AIX */ +/* #undef _ALL_SOURCE */ + +/* Build flag for AIX */ +/* #undef _LONG_LONG */ + +/* Build flag for AIX */ +/* #undef _THREAD_SAFE */ + +/* Define so that glibc/gnulib argp.h does not typedef error_t. */ +#define __error_t_defined 1 + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to a type to use for 'error_t' if it is not otherwise available. */ +#define error_t int + +/* Define to `int' if doesn't define. */ +/* #undef gid_t */ + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ + +/* Define to `int' if doesn't define. */ +/* #undef uid_t */ diff --git a/mssql_python/libs/macos/odbc_include/unixodbc.h b/mssql_python/libs/macos/odbc_include/unixodbc.h new file mode 100644 index 00000000..0ebcd18b --- /dev/null +++ b/mssql_python/libs/macos/odbc_include/unixodbc.h @@ -0,0 +1,17 @@ +/* unixodbc.h. Generated from unixodbc.h.in by configure. */ +/* Preprocessor constants for unixODBC */ + +/* Define to 1 if `long long' is available */ +#define HAVE_LONG_LONG 1 + +/* Define to 1 if the header file is present */ +#define HAVE_PWD_H 1 + +/* Define to 1 if the header file is present */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if the header file is present */ +#define HAVE_UNISTD_H 1 + +/* Define to the value of sizeof(long) */ +#define SIZEOF_LONG_INT 8 diff --git a/mssql_python/libs/macos/odbc_include/uodbc_extras.h b/mssql_python/libs/macos/odbc_include/uodbc_extras.h new file mode 100644 index 00000000..aaaef32f --- /dev/null +++ b/mssql_python/libs/macos/odbc_include/uodbc_extras.h @@ -0,0 +1,85 @@ +/********************************************************************* + * + * This is based on code created by Peter Harvey, + * (pharvey@codebydesign.com). + * + * Modified and extended by Nick Gorham + * (nick@lurcher.org). + * + * Further modified and extend by Eric Sharkey + * (sharkey@netrics.com). + * + * Any bugs or problems should be considered the fault of Nick or + * Eric and not Peter. + * + * copyright (c) 2005 Eric Sharkey + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ********************************************************************** + * + * $Id: uodbc_extras.h,v 1.1 2005/03/04 20:08:45 sharkey Exp $ + * + **********************************************************************/ +#ifndef UODBC__extras_h +#define UODBC__extras_h 1 + +#if defined(HAVE_STDARG_H) +# include +# define HAVE_STDARGS +#else +# if defined(HAVE_VARARGS_H) +# include +# ifdef HAVE_STDARGS +# undef HAVE_STDARGS +# endif +# endif +#endif + +#if defined(__cplusplus) + extern "C" { +#endif + +extern int uodbc_vsnprintf (char *str, size_t count, const char *fmt, va_list args); + +#ifdef HAVE_STDARGS + int uodbc_snprintf (char *str,size_t count,const char *fmt,...); +#else + int uodbc_snprintf (va_alist) va_dcl; +#endif + +#ifndef HAVE_SNPRINTF +#define snprintf uodbc_snprintf +#endif + +#ifndef HAVE_VSNPRINTF +#define vsnprintf uodbc_vsnprintf +#endif + +#ifndef HAVE_STRCASECMP +extern int strcasecmp( const char *s1, const char * s2 ); +#endif + +#ifndef HAVE_STRNCASECMP +extern int strncasecmp (const char *s1, const char *s2, int n ); +#endif + + +#if defined(__cplusplus) + } +#endif + +#endif /* UODBC__extras_h */ + diff --git a/mssql_python/libs/macos/odbc_include/uodbc_stats.h b/mssql_python/libs/macos/odbc_include/uodbc_stats.h new file mode 100644 index 00000000..87f4ebbc --- /dev/null +++ b/mssql_python/libs/macos/odbc_include/uodbc_stats.h @@ -0,0 +1,83 @@ +/********************************************************************* + * + * This is based on code created by Peter Harvey, + * (pharvey@codebydesign.com). + * + * Modified and extended by Nick Gorham + * (nick@lurcher.org). + * + * Any bugs or problems should be considered the fault of Nick and not + * Peter. + * + * copyright (c) 1999 Nick Gorham + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ********************************************************************** + * + * $Id: uodbc_stats.h,v 1.1.1.1 2001/10/17 16:40:28 lurcher Exp $ + * + * $Log: uodbc_stats.h,v $ + * Revision 1.1.1.1 2001/10/17 16:40:28 lurcher + * + * First upload to SourceForge + * + * Revision 1.2 2000/12/19 07:28:45 pharvey + * - added first pass at Stats page content + * - wrapped public stats functions for C++ + * + * Revision 1.1 2000/12/18 11:54:22 martin + * + * handle statistic API. + * + * + **********************************************************************/ +#ifndef UODBC__stats_h +#define UODBC__stats_h 1 + +#include +#include + +typedef struct uodbc_stats_retentry +{ + unsigned long type; /* type of statistic */ +# define UODBC_STAT_STRING 1 +# define UODBC_STAT_LONG 2 + union + { + char s_value[256]; /* string type */ + long l_value; /* number type */ + } value; + char name[32]; /* name of statistic */ +} uodbc_stats_retentry; + +#if defined(__cplusplus) + extern "C" { +#endif + +int uodbc_open_stats(void **rh, unsigned int mode); +#define UODBC_STATS_READ 0x1 +#define UODBC_STATS_WRITE 0x2 +int uodbc_close_stats(void *rh); +int uodbc_get_stats(void *h, pid_t request_pid, + uodbc_stats_retentry *s, int n_stats); +char *uodbc_stats_error(char *buf, size_t buflen); + +#if defined(__cplusplus) + } +#endif + +#endif /* UODBC__stats_h */ + diff --git a/mssql_python/libs/macos/share/doc/msodbcsql18/LICENSE.txt b/mssql_python/libs/macos/share/doc/msodbcsql18/LICENSE.txt new file mode 100644 index 00000000..065f1195 --- /dev/null +++ b/mssql_python/libs/macos/share/doc/msodbcsql18/LICENSE.txt @@ -0,0 +1,101 @@ +MICROSOFT SOFTWARE LICENSE TERMS +MICROSOFT ODBC DRIVER 18 FOR SQL SERVER + +These license terms are an agreement between you and Microsoft Corporation (or one of its affiliates). They apply to the software named above and any Microsoft services or software updates (except to the extent such services or updates are accompanied by new or additional terms, in which case those different terms apply prospectively and do not alter your or Microsoft’s rights relating to pre-updated software or services). IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW. BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. + +1. INSTALLATION AND USE RIGHTS. + + a) General. You may install and use any number of copies of the software to develop and test your applications. + + b) Third Party Software. The software may include third party applications that Microsoft, not the third party, licenses to you under this agreement. Any included notices for third party applications are for your information only. + +2. DISTRIBUTABLE CODE. The software may contain code you are permitted to distribute (i.e. make available for third parties) in applications you develop, as described in this Section. + + a) Distribution Rights. The code and test files described below are distributable if included with the software. + + i. REDIST.TXT Files. You may copy and distribute the object code form of code listed on the REDIST list in the software, if any, or listed at REDIST; + + ii. Image Library. You may copy and distribute images, graphics, and animations in the Image Library as described in the software documentation; + + iii. Sample Code, Templates, and Styles. You may copy, modify, and distribute the source and object code form of code marked as “sample”, “template”, “simple styles”, and “sketch styles”; and + + iv. Third Party Distribution. You may permit distributors of your applications to copy and distribute any of this distributable code you elect to distribute with your applications. + + b) Distribution Requirements. For any code you distribute, you must: + + i. add significant primary functionality to it in your applications; + + ii. require distributors and external end users to agree to terms that protect it and Microsoft at least as much as this agreement; and + + iii. indemnify, defend, and hold harmless Microsoft from any claims, including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the unmodified distributable code. + + c) Distribution Restrictions. You may not: + + i. use Microsoft’s trademarks or trade dress in your application in any way that suggests your application comes from or is endorsed by Microsoft; or + + ii. modify or distribute the source code of any distributable code so that any part of it becomes subject to any license that requires that the distributable +code, any other part of the software, or any of Microsoft’s other intellectual property be disclosed or distributed in source code form, or that others have the right to modify it. + +3. DATA COLLECTION. Some features in the software may enable collection of data from users of your applications that access or use the software. If you use these features to enable data collection in your applications, you must comply with applicable law, including getting any required user consent, and maintain a prominent privacy policy that accurately informs users about how you use, collect, and share their data. You agree to comply with all applicable provisions of the Microsoft Privacy Statement at [https://go.microsoft.com/fwlink/?LinkId=521839]. + +4. SCOPE OF LICENSE. The software is licensed, not sold. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you will not (and have no right to): + + a) work around any technical limitations in the software that only allow you to use it in certain ways; + + b) reverse engineer, decompile or disassemble the software; + + c) remove, minimize, block, or modify any notices of Microsoft or its suppliers in the software; + + d) use the software in any way that is against the law or to create or propagate malware; or + + e) share, publish, distribute, or lend the software (except for any distributable code, subject to the terms above), provide the software as a stand-alone hosted solution for others to use, or transfer the software or this agreement to any third party. + +5. EXPORT RESTRICTIONS. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information on export restrictions, visit http://aka.ms/exporting. + +6. SUPPORT SERVICES. Microsoft is not obligated under this agreement to provide any support services for the software. Any support provided is “as is”, “with all faults”, and without warranty of any kind. + +7. UPDATES. The software may periodically check for updates, and download and install them for you. You may obtain updates only from Microsoft or authorized sources. Microsoft may need to update your system to provide you with updates. You agree to receive these automatic updates without any additional notice. Updates may not include or support all existing software features, services, or peripheral devices. + +8. ENTIRE AGREEMENT. This agreement, and any other terms Microsoft may provide for supplements, updates, or third-party applications, is the entire agreement for the software. + +9. APPLICABLE LAW AND PLACE TO RESOLVE DISPUTES. If you acquired the software in the United States or Canada, the laws of the state or province where you live (or, if a business, where your principal place of business is located) govern the interpretation of this agreement, claims for its breach, and all other claims (including consumer protection, unfair competition, and tort claims), regardless of conflict of laws principles. If you acquired the software in any other country, its laws apply. If U.S. federal jurisdiction exists, you and Microsoft consent to exclusive jurisdiction and venue in the federal court in King County, Washington for all disputes heard in court. If not, you and Microsoft consent to exclusive jurisdiction and venue in the Superior Court of King County, Washington for all disputes heard in court. + +10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You may have other rights, including consumer rights, under the laws of your state or country. Separate and apart from your relationship with Microsoft, you may also have rights with respect to the party from which you acquired the software. This agreement does not change those other rights if the laws of your state or country do not permit it to do so. For example, if you acquired the software in one of the below regions, or mandatory country law applies, then the following provisions apply to you: + + a) Australia. You have statutory guarantees under the Australian Consumer Law and nothing in this agreement is intended to affect those rights. + + b) Canada. If you acquired this software in Canada, you may stop receiving updates by turning off the automatic update feature, disconnecting your device from the Internet (if and when you re-connect to the Internet, however, the software will resume checking for and installing updates), or uninstalling the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. + + c) Germany and Austria. + + i. Warranty. The properly licensed software will perform substantially as described in any Microsoft materials that accompany the software. However, Microsoft gives no contractual guarantee in relation to the licensed software. + + ii. Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as, in case of death or personal or physical injury, Microsoft is liable according to the statutory law. + + Subject to the foregoing clause ii., Microsoft will only be liable for slight negligence if Microsoft is in breach of such material contractual obligations, the fulfillment of which facilitate the due performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence. + +11. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES, OR CONDITIONS. TO THE EXTENT PERMITTED UNDER APPLICABLE LAWS, MICROSOFT EXCLUDES ALL IMPLIED WARRANTIES, INCLUDING MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + +12. LIMITATION ON AND EXCLUSION OF DAMAGES. IF YOU HAVE ANY BASIS FOR RECOVERING DAMAGES DESPITE THE PRECEDING DISCLAIMER OF WARRANTY, YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT, OR INCIDENTAL DAMAGES. + + This limitation applies to (a) anything related to the software, services, content (including code) on third party Internet sites, or third party applications; and (b) claims for breach of contract, warranty, guarantee, or condition; strict liability, negligence, or other tort; or any other claim; in each case to the extent permitted by applicable law. + + It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your state, province, or country may not allow the exclusion or limitation of incidental, consequential, or other damages. + +Please note: As this software is distributed in Canada, some of the clauses in this agreement are provided below in French. + +Remarque: Ce logiciel étant distribué au Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en français. + +EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel ». Toute utilisation de ce logiciel est à votre seule risque et péril. Microsoft n’accorde aucune autre garantie expresse. Vous pouvez bénéficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualité marchande, d’adéquation à un usage particulier et d’absence de contrefaçon sont exclues. + +LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES DOMMAGES. Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune indemnisation pour les autres dommages, y compris les dommages spéciaux, indirects ou accessoires et pertes de bénéfices. + +Cette limitation concerne: + + • tout ce qui est relié au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers; et + + • les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité stricte, de négligence ou d’une autre faute dans la limite autorisée par la loi en vigueur. + +Elle s’applique également, même si Microsoft connaissait ou devrait connaître l’éventualité d’un tel dommage. Si votre pays n’autorise pas l’exclusion ou la limitation de responsabilité pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l’exclusion ci-dessus ne s’appliquera pas à votre égard. + +EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres droits prévus par les lois de votre pays. Le présent contrat ne modifie pas les droits que vous confèrent les lois de votre pays si celles-ci ne le permettent pas. \ No newline at end of file diff --git a/mssql_python/libs/macos/share/doc/msodbcsql18/RELEASE_NOTES b/mssql_python/libs/macos/share/doc/msodbcsql18/RELEASE_NOTES new file mode 100644 index 00000000..dee7af85 --- /dev/null +++ b/mssql_python/libs/macos/share/doc/msodbcsql18/RELEASE_NOTES @@ -0,0 +1,465 @@ +ChangeLog (Release Notes) + +18.5.1.1 - 2025-03-17 + +Fixed: + - Fix connection recovery to obtain the active primary node when a server moves. + - Fix crashes under low-memory conditions. + +Added: + - Expose Packet Size as a connection string option. + - Support macOS 15 + - Support Azure Linux 3.0 + - Support Alpine Linux 3.20 + - Support Oracle Linux 9 + + +18.4.1.1 - 2024-07-31 + +Fixed: + - Fix crashes when receiving invalid data from server + - Fix sending of null data for fixed-length types using DAE + - Fix 10-minute delay upon disconnection after timeout + - Fix memory leak upon disconnection when an error occurs + - Fix memory leak upon reconnection with Strict encryption + - Fix intermittent crash when connecting with Strict encryption and TLS 1.3 + - Fix crashes under low-memory conditions + +Added: + - Option to accept EULA via the presence of a file + - Renamed Azure Active Directory to Microsoft Entra ID + - Support Ubuntu 24.04 + - Support Alpine 3.19 + + +18.3.3.1 - 2024-04-09 + +Fixed: + - Fix crashes when receiving invalid data from server + - Fix infinite loop when receiving invalid data from server + - Fix App Service Containers MSI Authentication + +18.3.2.1 - 2023-10-10 + +Fixed: + - Fix crashes when receiving invalid data from server + - Fix infinite loop when receiving invalid data from server + - Fix a crash when attempting to connect under low-memory conditions + + +18.3.1.1 - 2023-07-31 + +Fixed: + - Setting of Data Classification Version connection attribute + +Added: + - Improved performance via more efficient packet buffer memory allocation + - Add support for Managed Identity (MSI) Authentication for Azure Arc and Azure + Cloudshell and updated to a newer Azure App Service API version + - Support Ubuntu 23.04 + - Support Alpine 3.17 and 3.18 + +18.2.2.1 - 2023-06-13 + +Fixed: + - Fix a crash when retrieving data with AutoTranslate option off + - Fix partial writes on Linux in presence of signals + - Fix crashes when receiving invalid data from server + - Fix memory leak when processing encrypted columns + - Fix errors with long enclave queries + +18.2.1.1 - 2023-01-31 + +Fixed: + - Fix VBS-NONE enclave attestation protocol + - Fix error when retrieving numeric column with Regional=Yes + - Fix intermittent lack of error when server is stopped during bcp out operation + - Fix error when stored procedure call contains unquoted string parameter + - Fix a memory leak upon reconnect + +Added: + - Add original and redirected server names to connect errors + - Support Ubuntu 22.10 + - Support macOS 13 + - Support Alpine 3.16 + +18.1.2.1 - 2022-11-03 + +Fixed: + - Fix VBS-NONE enclave attestation protocol + - Fix error when retrieving numeric column with Regional=Yes + - Fix intermittent lack of error when server is stopped during bcp out operation + - Fix error when stored procedure call contains unquoted string parameter + + +18.1.1.1 - 2022-08-05 + +Fixed: + - Fix polling for first successful connection with MultiSubnetFailover + - Fix connecting with Strict and non-Strict encryption modes simultaneously + - Allow Azure Active Directory authentication with Strict encryption mode + - Fix idle connection resiliency reconnection when using Kerberos authentication + - Fix rare hang when using SQLBulkOperations in async mode + +Added: + - Configurable retry of query execution + - Configurable preference of IPv4 or IPv6 + - VBS-NONE enclave attestation protocol + - Wildcard matching of HostnameInCertificate + - Exact match for server certificate with ServerCertificate keyword + - TrustedConnection_UseAAD keyword controls use of Kerberos or Azure Active Directory + authentication modes + - Support TDS 8.0 ALPN + - Support TLS 1.3 (when using TDS 8.0) + - Support Ubuntu 22.04 + - Support RedHat 9 + - Support ARM64 Linux platforms: Debian 11, RedHat 8 and 9, Ubuntu 18.04, 20.04, 22.04 + + +18.0.1.1 - 2022-02-15 + +Fixed: + - Reduce excessive stack consumption when retrieving diagnostic records + - Fix Azure Active Directory Interactive authentication to re-prompt after the user + cancels the first dialog and a cached token already exists (Windows) + - More compatible federation metadata parsing + - Fix automatic idle reconnection when using Azure Active Directory authentication modes + - Remove database version check when using XA DTC to support SQL Managed Instance + +Added: + - Compatibility with OpenSSL 3.0 + - Ability to send long types as max types + - Support for TDS8 + - Compatibility extensions for SQLGetData + - Support Debian 11 + - Support Ubuntu 21.10 + - Support macOS 12 + + +17.8.1.1 - 2021/07/30 + +Fixed: + - Fix for restrictions on connection string regarding usage of UID and PWD keywords + - Fix issue with having multiple connections with different AKV credentials + +Added: + - Replication option added to the connection string + - KeepAlive and KeepAliveInterval options added to the connection string + - Support Ubuntu 21.04 + - Support Alpine 3.13 + +17.7.2.1 - 2021-03-10 + +Fixed: + - Fix issue with 404 Not Found errors when using Managed Service Identity authentication + - Fix for intermittent Encryption Not Supported errors under high multithreaded loads + - Fix for intermittent crash under high multithreaded loads + +17.7.1.1 - 2021/01/31 + +Fixed: + - Fix character encoding of VARIANT columns in BCP NATIVE mode + - Fix setting of SQL_ATTR_PARAMS_PROCESSED_PTR under specific conditions + - Fix SQLDescribeParam in FMTONLY mode for statements containing comments + - Fix an issue with federated authentication when using Okta + - Fix excessive memory usage on multi-processor systems + - Fix Azure AD authentication for some variants of Azure SQL DB + +Added: + - Ability to insert into encrypted money and smallmoney columns + - Azure AD Interactive Authentication to Azure Key Vault + - Azure AD Service Principal Authentication to Azure SQL + - Trusted endpoints for Managed HSM Azure Key Vault + - Performance improvements when inserting data + - Support for installation with MacPorts package manager + - Support Oracle Linux 7 + - Support Ubuntu 20.10 + - Support macOS 11.0 + +17.6.1.1 - 2020/07/31 + +Known Issues: + - Integrated authentication with Azure AD is subject to system library limitations; see the documentation for details + +Fixed: + - Fix dependency version of libc6 on Ubuntu/Debian to increase portability + - Added additional definitions for BCP to msodbcsql.h + +Added: + - Caching of encryption metadata for prepared statements + - Connection attribute SQL_COPT_SS_AUTOBEGINTXN to control automatically beginning a transaction after ending a previous one + - Support for federated account authentication with Azure AD + - Support for Big5 and GB locales + - Support authentication with Managed Identity for Azure App Service + - Support for TLS SNI + - Support Ubuntu 20.04 + +17.5.2.2 - 2020/04/20 (Alpine Linux only) + +Known Issues: + +Fixed: + - Fix a crash when using Always Encrypted with Secure Enclaves on Alpine Linux + +Added: + +17.5.2.1 - 2020/03/03 + +Known Issues: + +Fixed: + - Added msodbcsql.h to Alpine Linux package + +Added: + - Support authentication with Managed Identity for Azure Key Vault + +17.5.1.1 - 2020/01/31 + +Known Issues: + - Due to system library limitations, Alpine Linux supports fewer character encodings and locales + +Fixed: + - Fix AKV CMK metadata hash computation on Linux/Mac + - Fix error when loading OpenSSL 1.0.0 + - Fix conversion issues when using ISO-8859-1 and ISO-8859-2 codepages + - Fix internal library name on Mac to include version number + - Fix setting of null indicator when separate length and indicator bindings are used + +Added: + - SQL_COPT_SS_SPID connection attribute to retrieve SPID without round-trip to server + - Support for indicating EULA acceptance via debconf on Debian/Ubuntu + - Support Alpine Linux (3.10, 3.11) + - Support Oracle Linux 8 + - Support Ubuntu 19.10 + - Support macOS 10.15 + +17.4.2.1 - 2019/09/19 + +Known Issues: + +Fixed: + - Fix for an issue where process ID and application name would not be sent correctly to SQL Server (for sys.dm_exec_sessions analysis) + - Removed redundant dependency on libuuid + - Fix for a bug with sending UTF8 data to SQL Server 2019 + - Fix for a bug where locales that end in "@euro" were not being correctly detected + - Fix for XML data being returned incorrectly when fetched as an output parameter while using Always Encrypted + +Added: + - Support for additional Azure Key Vault endpoints: vault.azure.cn, vault.usgovcloudapi.net, vault.microsoftazure.de + - Support for setting data classification version + +17.4.1.1 - 2019/07/17 + +Known Issues: + +Fixed: + - Fix for intermittent hang when Multiple Active Results Sets (MARS) is enabled + - Fix connection resiliency hang when async notification is enabled + - Fix crash when retrieving diagnostic records for multithreaded connection attempts + - Fix 'Encryption not supported' upon reconnect after calling SQLGetInfo() with SQL_USER_NAME and SQL_DATA_SOURCE_READ_ONLY + - Fix COM initialization error during Azure Active Directory Interactive Authentication + - Fix SQLGetData() for multi-byte UTF8 data + - Fix retrieving length of sql_variant columns using SQLGetData() + - Fix importing of sql_variant columns containing more than 7992 bytes using bcp + - Fix sending of correct encoding to server for narrow character data + +Added: + - Support Always Encrypted with Secure Enclaves + - Support dynamic loading of OpenSSL + - Support insertion of UTF8 data for SQL Server 2019 + - Support configurable TCP Keep Alive settings + - Support Debian 10 + - Support RedHat 8 + - Support Ubuntu 19.04 + - Support connecting to named instances on Linux and Mac + +17.3.1.1 - 2019/02/15 + +Known Issues: + +Fixed: + - Fix for detection of the current environment locale + - Fix AE streaming encryption for short data values + - Fix use-after-free for encrypted DAE parameters + - Fix race conditions with multiple threads and sending data. + - Fix SQLNumResultCols when SQLExecute returns SQL_NO_DATA_FOUND + - Fix infinite loop in comment parsing + +Added: + - Support Azure Active Directory Managed Service Identity (system and user-assigned) authentication mode + - Support SuSE 15 + - Support Ubuntu 18.10 + - Support macOS 10.14 + - Minor optimizations + +17.3.0.1 - 2018/09/07 + +Known Issues: + +Fixed: + - Fix for tcp send notification event handle memory leak + - Fix redefinition issue of enum _SQL_FILESTREAM_DESIRED_ACCESS in msodbcsql.h header file + - Fix missing ACCESS_TOKEN and AUTHENTICATION related definition in msodbcsql.h header file for Linux and MAC + +Added: + - Support AE input parameter streaming + - Support XA DTC + +17.2.0.1 - 2018/06/20 + +Known Issues: + +Fixed: + - Fix Error Message about Azure Active Directory Authentication + - Fix encoding detection when locale environment variables are set differently + - Fix crash upon disconnect with connection recovery in progress + - Fix detection of connection liveness + - Fix incorrect detection of closed sockets + - Fix the infinite wait when attempting to release a statement handle during failed recovery. + +Added: + - Support Ubuntu 18.04 + - Change the dependency to dynamic libcurl loading + The libcurl for OpenSSL or NSS is required when using the Azure Key Vault or Azure Active Directory authentication. + Manually install libcurl if it is not with the system by default. + - Support Idle Connection Resiliency with ConnectRetryCount and ConnectRetryInterval keywords in connection string: + Use the SQL_COPT_SS_CONNECT_RETRY_COUNT (read only) connection attribute to retrieve the number of connection retry attempts. + Use the SQL_COPT_SS_CONNECT_RETRY_INTERVAL (read only) connection attribute to retrieve the length of the connection retry interval. + Connection will be retried at least once by default. + - Support UTF8 server encoding + - Support Data Classification feature on Azure SQL Database and SQL Server + - Support SQLBrowseConnect + +17.1.0.1 - 2018/04/06 + +Known Issues: + None + +Fixed: + - Fixed 1-second delay when calling SQLFreeHandle with MARS enabled and connection attribute "Encrypt=yes" + - Fixed truncated ADAL error messages + - Fixed an issue where inserting double into decimal field with Always Encrypted on would return data truncation error + - Fixed a warning on MacOS installer + +Added: + - Support for SQL_COPT_SS_CEKCACHETTL and SQL_COPT_SS_TRUSTEDCMKPATHS connection attributes + SQL_COPT_SS_CEKCACHETTL Allows controlling the time that the local cache of Column Encryption Keys exists, as well as flushing it + SQL_COPT_SS_TRUSTEDCMKPATHS Allows the application to restrict AE operations to only use the specified list of Column Master Keys + + - Support for loading the .rll from default location + +17.0.1.0 - 2017/01/16 +Known Issues: + None + +Fixed: + Fixed SQLGetData for encrypted varbinary(max) returned data only on first call + Conversions to persian collation in column scenarios appears to result in data corruption. + Data corruption when streaming UTF-16 or UTF-8 using SQLPutData with split octets or surrogate pairs + With async notifications enabled, driver unable to recover from failure (Windows) + High cpu consumption when ODBC async execution mode is enabled (Windows) + Occasional crash during ODBC shutdown when async execution mode is enabled (Windows) + +Added: + Performance improvement for when ODBC async execution mode is enabled + +17.0.0.5 - 2017/12/20 + +Known Issues: + - macOS: Homebrew now filters out user set environment variables. You can now install the ODBC driver on macOS using the + following command line: + HOMEBREW_NO_ENV_FILTERING=1 ACCEPT_EULA=Y brew install --no-sandbox msodbcsql + +Fixed: + - Parameters bound with any convertable C type with the same precision & scale as a numeric/decimal column are now + correctly converted to the appropriate numeric type with the specified precision and scale, and execute successfully + instead of erroring our with Operand Type Clash. + - Screen reader usability improvements in DSN Wizard and Login Dialog + - Encrypted numeric/decimal values now correctly normalize negative zeros + - Hebrew data (varchar) is no longer chopped when returned as wide chars on Linux platforms + - Fixed Invalid Descriptor Index error when using unencrypted XML column with AE in some scenarios + - Fixed function sequence error when using DAE, SqlPutData, and AE + - ODBC Driver on Windows now links directly to secur32.dll, instead of indirectly through security.dll + +Added: + - Support for macOS High Sierra + - Support for Ubuntu 17.10 + - Always Encrypted support for BCP API + - Greater than 10x performance improvement when driver converts to/from UTF-8/16. + - New connection string attribute UseFMTOnly causes driver to use legacy metadata in special cases requiring temp tables. + +-------------------------------------------------------------------------------- + +17.0.0.1 - 2017/10/06 + +Known Issues: + None + +Fixed: + msodbcsql.h - Missing types and constants were added to Linux/Mac header + CP1252 encoded files over 32MB were failing to import correctly with bcp on Linux. This has been fixed. + Resolved an issue in Linux where system time changes could result in incorrect timeouts in the driver + macOS - SQLGetInfo with SQL_DRIVER_NAME retruns .so value instead of .dylib + +Added: + Support for Debian 9 + Improved performance of driver character conversion from utf16 + Changed narrow functions of ODBC API to be sensitive to platform encoding, and not assume UTF-8. Wide encoding is expected to be UTF-16LE + Removed Microsoft online service sign-in assistant check in ODBC driver for Windows + +-------------------------------------------------------------------------------- + +13.1.9.0 - 2017/06/14 + +Known Issues: + None + +Fixed: +#10274176: DSN Wizard Help does not load CHM +#10034310: Fix buffer overrun upon UTF-8 character conversion - Now fully supports UTF-8 + +Added: +Support for Ubuntu 14.04. +Configurable driver location on Linux. Simply copy the whole driver install directory to the location of your choice after normal installation. + You must manually update the ODBCINST.INI file with the new location. + + +-------------------------------------------------------------------------------- + +13.1.8.0 - 2017/05/18 + +Known Issues: +- Due to the buffer overrun fix (#10034310, see below), UTF-8 non-ASCII + characters may cause column truncation after conversion to UTF-16. In + particular, use of SQLBulkOperations with column bindings may cause + this to occur. A future release will fully support UTF-8. See + https://docs.microsoft.com/en-us/sql/connect/odbc/linux/known-issues-in-this-version-of-the-driver + for more information. + +Fixed: +#10059224: Floating-point numbers formatted incorrectly in French locale +#10144395: SQLBindParameter input/output parameters may truncate prematurely +#10060645: Implicit cursor conversion due to comments +#10034310: Fix buffer overrun upon UTF-8 character conversion +#1080065: Fixed symbolic link creation for the RPM package + +Added: +Support for SuSE 11 SP4 and Ubuntu 17.04. + +-------------------------------------------------------------------------------- + +13.1.7.0 - 2017/04/11 +Preview Release with support for OS X 10.11 (El Capitan), macOS 10.12 (Sierra), RedHat 6, RedHat 7, Suse 12, Debian 8 +and Ubuntu 15.10, 16.04, and 16.10 + +Known Issues: +No new known issues. https://docs.microsoft.com/en-us/sql/connect/odbc/mac/known-issues-in-this-version-of-the-driver + +Fixed: + + +Added: +#1081223: Support for Azure Active Directory authentication +#9861137: Add ODBC Docs section for TVP on Linux and Mac. https://docs.microsoft.com/en-us/sql/relational-databases/ +native-client-odbc-table-valued-parameters/binding-and-data-transfer-of-table-valued-parameters-and-column-values +_____________________________________________________________________________________________________________ diff --git a/mssql_python/libs/macos/share/msodbcsql18/resources/en_US/msodbcsqlr18.rll b/mssql_python/libs/macos/share/msodbcsql18/resources/en_US/msodbcsqlr18.rll new file mode 100644 index 0000000000000000000000000000000000000000..0f69236ee4e74d72d36e6229b6011ba368c00b1c GIT binary patch literal 200704 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 literal 0 HcmV?d00001 diff --git a/mssql_python/pybind/CMakeLists.txt b/mssql_python/pybind/CMakeLists.txt index dceb2efc..dece3667 100644 --- a/mssql_python/pybind/CMakeLists.txt +++ b/mssql_python/pybind/CMakeLists.txt @@ -5,13 +5,42 @@ project(ddbc_bindings) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) +# Detect platform +if(WIN32) + set(PLATFORM_NAME "windows") +elseif(APPLE) + set(PLATFORM_NAME "macos") +elseif(UNIX) + set(PLATFORM_NAME "linux") +else() + message(FATAL_ERROR "Unsupported platform") +endif() + # Set default architecture if not provided if(NOT DEFINED ARCHITECTURE) - set(ARCHITECTURE "win64") + if(WIN32) + set(ARCHITECTURE "win64") + elseif(APPLE) + # Check if we're on Apple Silicon or Intel + execute_process( + COMMAND sysctl -n machdep.cpu.brand_string + OUTPUT_VARIABLE CPU_BRAND + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(CPU_BRAND MATCHES "Apple") + set(ARCHITECTURE "arm64") + else() + set(ARCHITECTURE "x64") + endif() + else() + # Default to x64 for other platforms + set(ARCHITECTURE "x64") + endif() endif() -# Add architecture to compiler definitions +# Add platform and architecture to compiler definitions add_definitions(-DARCHITECTURE="${ARCHITECTURE}") +add_definitions(-DPLATFORM_NAME="${PLATFORM_NAME}") # Get Python version and platform info execute_process( @@ -21,116 +50,204 @@ execute_process( ) # Map the architecture to a format similar to what wheels use -if(CMAKE_GENERATOR_PLATFORM STREQUAL "ARM64" OR DEFINED ENV{BUILD_ARM64}) - set(WHEEL_ARCH "arm64") -elseif(ARCHITECTURE STREQUAL "win64" OR ARCHITECTURE STREQUAL "amd64" OR ARCHITECTURE STREQUAL "x64") - set(WHEEL_ARCH "amd64") -elseif(ARCHITECTURE STREQUAL "win32" OR ARCHITECTURE STREQUAL "x86") - set(WHEEL_ARCH "win32") +if(WIN32) + # Windows architecture mapping + if(CMAKE_GENERATOR_PLATFORM STREQUAL "ARM64" OR DEFINED ENV{BUILD_ARM64}) + set(WHEEL_ARCH "arm64") + elseif(ARCHITECTURE STREQUAL "win64" OR ARCHITECTURE STREQUAL "amd64" OR ARCHITECTURE STREQUAL "x64") + set(WHEEL_ARCH "amd64") + elseif(ARCHITECTURE STREQUAL "win32" OR ARCHITECTURE STREQUAL "x86") + set(WHEEL_ARCH "win32") + else() + message(FATAL_ERROR "Unsupported Windows architecture: ${ARCHITECTURE}. Supported architectures are win32, win64, x86, amd64, arm64.") + endif() +elseif(APPLE) + # macOS architecture mapping + if(ARCHITECTURE STREQUAL "arm64") + set(WHEEL_ARCH "arm64") + else() + set(WHEEL_ARCH "x86_64") + endif() else() - message(FATAL_ERROR "Unsupported architecture: ${ARCHITECTURE}. Supported architectures are win32, win64, x86, amd64, arm64.") + # Linux architecture mapping + if(ARCHITECTURE STREQUAL "arm64") + set(WHEEL_ARCH "aarch64") + else() + set(WHEEL_ARCH "x86_64") + endif() endif() -# Get Python and pybind11 include paths (needed for all architectures) -execute_process( - COMMAND python -c "import sysconfig; print(sysconfig.get_path('include'))" - OUTPUT_VARIABLE PYTHON_INCLUDE_DIR - OUTPUT_STRIP_TRAILING_WHITESPACE -) +# Get Python and pybind11 include paths +if(DEFINED PYTHON_INCLUDE_DIR AND NOT "${PYTHON_INCLUDE_DIR}" STREQUAL "") + message(STATUS "Using provided Python include directory: ${PYTHON_INCLUDE_DIR}") +else() + # Try to detect Python include directory + execute_process( + COMMAND python3 -c "import sysconfig; print(sysconfig.get_path('include'))" + OUTPUT_VARIABLE PYTHON_INCLUDE_DIR + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + message(STATUS "Auto-detected Python include directory: ${PYTHON_INCLUDE_DIR}") +endif() -# Add debug messages for Python paths -message(STATUS "Python version: ${PYTHON_VERSION}") -message(STATUS "Python include directory: ${PYTHON_INCLUDE_DIR}") +if(DEFINED PYBIND11_INCLUDE_DIR AND NOT "${PYBIND11_INCLUDE_DIR}" STREQUAL "") + message(STATUS "Using provided pybind11 include directory: ${PYBIND11_INCLUDE_DIR}") +else() + # Try to detect pybind11 include directory + execute_process( + COMMAND python3 -c "import pybind11; print(pybind11.get_include())" + OUTPUT_VARIABLE PYBIND11_INCLUDE_DIR + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + message(STATUS "Auto-detected pybind11 include directory: ${PYBIND11_INCLUDE_DIR}") +endif() -# Get Python library directory with fallbacks if one method returns None +# Find Python Library for linking execute_process( - COMMAND python -c "import sysconfig; print(sysconfig.get_config_var('LIBDIR'))" - OUTPUT_VARIABLE PYTHON_LIB_DIR + COMMAND python3 -c "import sysconfig; print(sysconfig.get_config_var('LIBDIR'))" + OUTPUT_VARIABLE PYTHON_LIBDIR OUTPUT_STRIP_TRAILING_WHITESPACE ) -message(STATUS "Python LIBDIR from sysconfig: ${PYTHON_LIB_DIR}") +message(STATUS "Python LIBDIR from sysconfig: ${PYTHON_LIBDIR}") -# If LIBDIR is None or empty, try alternative methods -if("${PYTHON_LIB_DIR}" STREQUAL "None" OR "${PYTHON_LIB_DIR}" STREQUAL "") +# On macOS, we may need additional work to find the Python library +if(APPLE AND (NOT PYTHON_LIBDIR OR "${PYTHON_LIBDIR}" STREQUAL "")) message(STATUS "LIBDIR is None or empty, trying alternative methods") - - # Get the directory of the Python executable + + # Get Python executable path execute_process( - COMMAND python -c "import sys, os; print(os.path.dirname(sys.executable))" - OUTPUT_VARIABLE PYTHON_EXEC_DIR + COMMAND python3 -c "import sys; print(sys.executable)" + OUTPUT_VARIABLE PYTHON_EXECUTABLE OUTPUT_STRIP_TRAILING_WHITESPACE ) - message(STATUS "Python executable directory: ${PYTHON_EXEC_DIR}") - - # Check if the libs directory exists, and set PYTHON_LIB_DIR accordingly + + # Get the directory containing the Python executable + get_filename_component(PYTHON_BIN_DIR "${PYTHON_EXECUTABLE}" DIRECTORY) + message(STATUS "Python executable directory: ${PYTHON_BIN_DIR}") + + # Try to find the library in or near the executable directory + set(POTENTIAL_PYTHON_LIB_DIRS + "${PYTHON_BIN_DIR}/../lib" + "${PYTHON_BIN_DIR}/../../lib" + "/Library/Frameworks/Python.framework/Versions/Current/lib" + ) + + # Get Python version for library name execute_process( - COMMAND python -c "import sys, os; libs_dir = os.path.join(os.path.dirname(sys.executable), 'libs'); print('EXISTS' if os.path.exists(libs_dir) else 'NOT_EXISTS')" - OUTPUT_VARIABLE PYTHON_LIBS_EXISTS + COMMAND python3 -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')" + OUTPUT_VARIABLE PYTHON_VERSION_FULL OUTPUT_STRIP_TRAILING_WHITESPACE ) - if("${PYTHON_LIBS_EXISTS}" STREQUAL "EXISTS") - set(PYTHON_LIB_DIR "${PYTHON_EXEC_DIR}/libs") - message(STATUS "Setting Python libs directory from sys.executable: ${PYTHON_LIB_DIR}") + + set(PYTHON_LIBRARY "") + foreach(LIB_DIR ${POTENTIAL_PYTHON_LIB_DIRS}) + message(STATUS "Checking for Python library in ${LIB_DIR}") + if(EXISTS "${LIB_DIR}/libpython${PYTHON_VERSION_FULL}.dylib") + set(PYTHON_LIBRARY "${LIB_DIR}/libpython${PYTHON_VERSION_FULL}.dylib") + break() + endif() + endforeach() + + if(PYTHON_LIBRARY) + message(STATUS "Found Python library: ${PYTHON_LIBRARY}") + else() + message(STATUS "Python library not found in standard locations, will try using framework") + # When using a framework, we don't specify the library directly endif() endif() -# If CUSTOM_PYTHON_LIB_DIR is set and exists, use it -if(DEFINED ENV{CUSTOM_PYTHON_LIB_DIR} AND NOT "$ENV{CUSTOM_PYTHON_LIB_DIR}" STREQUAL "" AND NOT "$ENV{CUSTOM_PYTHON_LIB_DIR}" STREQUAL "None") - message(STATUS "CUSTOM_PYTHON_LIB_DIR is set, using it") - set(PYTHON_LIB_DIR $ENV{CUSTOM_PYTHON_LIB_DIR}) - message(STATUS "Using custom Python library directory: ${PYTHON_LIB_DIR}") +# Determine which source file to use based on platform +if(APPLE) + set(DDBC_SOURCE "ddbc_bindings_mac.cpp") + message(STATUS "Using macOS-specific source file: ${DDBC_SOURCE}") else() - message(STATUS "Custom Path is not set or empty, finally using: ${PYTHON_LIB_DIR}") + set(DDBC_SOURCE "ddbc_bindings.cpp") + message(STATUS "Using standard source file: ${DDBC_SOURCE}") endif() -execute_process( - COMMAND python -c "import pybind11; print(pybind11.get_include())" - OUTPUT_VARIABLE PYBIND11_INCLUDE_DIR - OUTPUT_STRIP_TRAILING_WHITESPACE -) - # Add module library -add_library(ddbc_bindings MODULE ddbc_bindings.cpp connection/connection.cpp) - -# Add include directories for your project -target_include_directories(ddbc_bindings PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR} # Root directory (for ddbc_bindings.h) - ${CMAKE_CURRENT_SOURCE_DIR}/connection # connection directory (for connection.h) -) +add_library(ddbc_bindings MODULE ${DDBC_SOURCE}) # Set the output name to include Python version and architecture +# Use appropriate file extension based on platform +if(WIN32) + set(MODULE_EXTENSION ".pyd") +else() + # macOS and Linux both use .so for Python extensions + set(MODULE_EXTENSION ".so") +endif() + set_target_properties(ddbc_bindings PROPERTIES PREFIX "" OUTPUT_NAME "ddbc_bindings.cp${PYTHON_VERSION}-${WHEEL_ARCH}" - SUFFIX ".pyd" + SUFFIX "${MODULE_EXTENSION}" ) # Include directories for all architectures +if(NOT DEFINED ODBC_INCLUDE_DIR) + if(APPLE) + # On macOS, try to find ODBC headers in Homebrew's location + message(STATUS "ODBC_INCLUDE_DIR not specified, trying Homebrew location") + set(ODBC_INCLUDE_DIR "/opt/homebrew/include") + endif() +endif() + +message(STATUS "Using ODBC include directory: ${ODBC_INCLUDE_DIR}") + +# Configure target include directories and link libraries target_include_directories(ddbc_bindings PRIVATE ${PYTHON_INCLUDE_DIR} ${PYBIND11_INCLUDE_DIR} ) -# Special handling for ARM64 builds -if(CMAKE_GENERATOR_PLATFORM STREQUAL "ARM64" OR DEFINED ENV{BUILD_ARM64}) - message(STATUS "Building for ARM64 architecture") - set(CMAKE_SYSTEM_PROCESSOR "ARM64") - set(CMAKE_VS_PLATFORM_NAME "ARM64") - add_definitions(-DTARGET_ARM64=1) +if(APPLE) + # Add ODBC include directories on macOS + target_include_directories(ddbc_bindings PRIVATE ${CMAKE_SOURCE_DIR}/../libs/odbc_include ${ODBC_INCLUDE_DIR}) -elseif(ARCHITECTURE STREQUAL "win32" OR ARCHITECTURE STREQUAL "x86") - message(STATUS "Building for x86 architecture") - set(CMAKE_SYSTEM_PROCESSOR "x86") - set(CMAKE_VS_PLATFORM_NAME "Win32") - add_definitions(-DTARGET_X86=1) -endif() - -set(PYTHON_LIBRARIES "${PYTHON_LIB_DIR}/python${PYTHON_VERSION}.lib") + # For macOS, we need to link against the Python framework + if(PYTHON_LIBRARY) + # If we found a specific library file, use it + target_link_libraries(ddbc_bindings PRIVATE ${PYTHON_LIBRARY} dl) + else() + # Otherwise, try to link to the framework + execute_process( + COMMAND python3 -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')" + OUTPUT_VARIABLE PYTHON_VERSION_FULL + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + # Try to find the Python framework + find_library(PYTHON_FRAMEWORK Python HINTS /Library/Frameworks/Python.framework/Versions/${PYTHON_VERSION_FULL}/lib) + + if(PYTHON_FRAMEWORK) + message(STATUS "Found Python framework: ${PYTHON_FRAMEWORK}") + target_link_libraries(ddbc_bindings PRIVATE ${PYTHON_FRAMEWORK} dl) + else() + # As a last resort, try with -undefined dynamic_lookup flag + message(STATUS "Python framework not found, using dynamic lookup") + set_target_properties(ddbc_bindings PROPERTIES LINK_FLAGS "-undefined dynamic_lookup") + target_link_libraries(ddbc_bindings PRIVATE dl) + endif() + endif() + + # Set macOS-specific compile options + target_compile_options(ddbc_bindings PRIVATE + -Wno-unused-value + -Wno-deprecated-declarations + ) +else() + # For other platforms, use standard include and link setup + target_include_directories(ddbc_bindings PRIVATE ${ODBC_INCLUDE_DIR}) -# Link Python library -message(STATUS "Using Python library: ${PYTHON_LIBRARIES}") -message(STATUS "Output PYD name: ddbc_bindings.cp${PYTHON_VERSION}-${WHEEL_ARCH}.pyd") -target_link_libraries(ddbc_bindings PRIVATE ${PYTHON_LIBRARIES}) + if(WIN32 AND DEFINED PYTHON_LIB_DIR) + # On Windows, link with the Python lib + if(EXISTS "${PYTHON_LIB_DIR}/python${PYTHON_VERSION}.lib") + target_link_libraries(ddbc_bindings PRIVATE "${PYTHON_LIB_DIR}/python${PYTHON_VERSION}.lib") + elseif(EXISTS "${PYTHON_LIB_DIR}/python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}.lib") + target_link_libraries(ddbc_bindings PRIVATE "${PYTHON_LIB_DIR}/python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}.lib") + endif() + endif() +endif() # Compiler definitions target_compile_definitions(ddbc_bindings PRIVATE @@ -139,3 +256,10 @@ target_compile_definitions(ddbc_bindings PRIVATE PYBIND11_COMPILER_TYPE="_MSC_VER" NOMINMAX ) + +# Add macOS-specific string conversion fix +if(APPLE) + message(STATUS "Enabling macOS string conversion fix") + target_compile_definitions(ddbc_bindings PRIVATE MACOS_STRING_FIX) + target_compile_options(ddbc_bindings PRIVATE -DAPPLE_SILICON) +endif() diff --git a/mssql_python/pybind/build.sh b/mssql_python/pybind/build.sh new file mode 100755 index 00000000..6154a970 --- /dev/null +++ b/mssql_python/pybind/build.sh @@ -0,0 +1,128 @@ +#!/bin/bash +# Build script for macOS to compile the ddbc_bindings C++ code + +# Usage: build.sh [ARCH], If ARCH is not specified, it defaults to the current architecture +ARCH=${1:-$(uname -m)} +echo "[DIAGNOSTIC] Target Architecture set to: $ARCH" + +# Clean up main build directory if it exists +echo "Checking for main build directory..." +if [ -d "build" ]; then + echo "Removing existing build directory..." + rm -rf build + echo "Build directory removed." +fi + +# Get Python version from active interpreter +PYTAG=$(python -c "import sys; print(f'{sys.version_info.major}{sys.version_info.minor}')") + +echo "===================================" +echo "Building for: $ARCH / Python $PYTAG" +echo "===================================" + +# Save absolute source directory +SOURCE_DIR=$(pwd) + +# Go to build output directory +BUILD_DIR="${SOURCE_DIR}/build/${ARCH}/py${PYTAG}" +mkdir -p "${BUILD_DIR}" +cd "${BUILD_DIR}" +echo "[DIAGNOSTIC] Changed to build directory: ${BUILD_DIR}" + +# Set platform-specific flags for different architectures +if [ "$ARCH" = "x86_64" ] || [ "$ARCH" = "x64" ]; then + CMAKE_ARCH="x86_64" + ARCH="x64" + echo "[DIAGNOSTIC] Using x86_64 architecture for CMake" +elif [ "$ARCH" = "arm64" ]; then + CMAKE_ARCH="arm64" + echo "[DIAGNOSTIC] Using arm64 architecture for CMake" +else + echo "[ERROR] Unsupported architecture: $ARCH" + exit 1 +fi + +echo "[DIAGNOSTIC] Source directory: ${SOURCE_DIR}" + +# Special handling for macOS ODBC headers and string conversion issues +if [ "$(uname)" = "Darwin" ]; then + # Use project's odbc_include directory instead of Homebrew headers + ODBC_INCLUDE_DIR="${SOURCE_DIR}/../libs/macos/odbc_include" + + if [ ! -f "${ODBC_INCLUDE_DIR}/sql.h" ]; then + echo "[ERROR] Could not find ODBC headers in project directory at ${ODBC_INCLUDE_DIR}" + exit 1 + fi + + echo "[DIAGNOSTIC] Using ODBC headers from project directory: ${ODBC_INCLUDE_DIR}" + + # Check if macOS-specific source file exists + if [ -f "${SOURCE_DIR}/ddbc_bindings_mac.cpp" ]; then + echo "[DIAGNOSTIC] Using macOS-specific source file: ddbc_bindings_mac.cpp" + else + echo "[WARNING] macOS-specific source file ddbc_bindings_mac.cpp not found" + echo "[WARNING] Falling back to standard source file ddbc_bindings.cpp" + fi + + # Set compiler flags directly to ensure headers are found + export CXXFLAGS="-I${ODBC_INCLUDE_DIR}" + export CFLAGS="-I${ODBC_INCLUDE_DIR}" + + # Configure CMake with macOS-specific flags + echo "[DIAGNOSTIC] Running CMake configure with macOS-specific settings" + cmake -DCMAKE_OSX_ARCHITECTURES=${CMAKE_ARCH} \ + -DARCHITECTURE=${ARCH} \ + -DMACOS_STRING_FIX=ON \ + -DODBC_INCLUDE_DIR=${ODBC_INCLUDE_DIR} \ + -DCMAKE_CXX_FLAGS="-I${ODBC_INCLUDE_DIR}" \ + "${SOURCE_DIR}" +else + # Configure CMake for other platforms + echo "[DIAGNOSTIC] Running CMake configure for non-macOS platform" + cmake -DARCHITECTURE=${ARCH} "${SOURCE_DIR}" +fi + +# Check if CMake configuration succeeded +if [ $? -ne 0 ]; then + echo "[ERROR] CMake configuration failed" + exit 1 +fi + +# Build the project +echo "[DIAGNOSTIC] Running CMake build with: cmake --build . --config Release" +cmake --build . --config Release + +# Check if build succeeded +if [ $? -ne 0 ]; then + echo "[ERROR] CMake build failed" + exit 1 +else + echo "[SUCCESS] Build completed successfully" + # List the built files + echo "Built files:" + ls -la *.so + + # Copy the built .so file to the mssql_python directory + PARENT_DIR=$(dirname "$SOURCE_DIR") + echo "[ACTION] Copying the .so file to $PARENT_DIR" + cp -f *.so "$PARENT_DIR" + if [ $? -eq 0 ]; then + echo "[SUCCESS] .so file copied successfully" + + # Only on macOS, run the dylib configuration script to fix library paths and codesign + if [ "$(uname)" = "Darwin" ]; then + echo "[ACTION] Configuring and codesigning dylibs for macOS" + chmod +x "${SOURCE_DIR}/configure_dylibs.sh" + "${SOURCE_DIR}/configure_dylibs.sh" + if [ $? -eq 0 ]; then + echo "[SUCCESS] macOS dylibs configured and codesigned successfully" + else + echo "[WARNING] macOS dylib configuration encountered issues" + # Don't exit with error, as the build itself was successful + fi + fi + else + echo "[ERROR] Failed to copy .so file" + exit 1 + fi +fi diff --git a/mssql_python/pybind/configure_dylibs.sh b/mssql_python/pybind/configure_dylibs.sh new file mode 100755 index 00000000..35ea68d9 --- /dev/null +++ b/mssql_python/pybind/configure_dylibs.sh @@ -0,0 +1,96 @@ +#!/bin/bash +# Script to configure dylib paths for macOS +# This script fixes the library paths in the ODBC driver dylibs and codesigns them + +# Function to get the current architecture +get_mac_platform_architecture() { + arch=$(uname -m) + echo "$arch" +} + +# Directory structure setup +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_DIR="$(dirname "$SCRIPT_DIR")" + +# Get platform and configure paths +ARCH=$(get_mac_platform_architecture) +LIB_DIR="$PROJECT_DIR/libs/macos/lib" +LIBMSODBCSQL_PATH="$LIB_DIR/libmsodbcsql.18.dylib" +LIBODBCINST_PATH="$LIB_DIR/libodbcinst.2.dylib" +LIBLTDL_PATH="$LIB_DIR/libltdl.7.dylib" + +echo "Configuring dylibs in: $LIB_DIR" + +# Check if the directories and files exist +if [ ! -d "$LIB_DIR" ]; then + echo "Error: Library directory doesn't exist: $LIB_DIR" + exit 1 +fi + +if [ ! -f "$LIBMSODBCSQL_PATH" ]; then + echo "Error: libmsodbcsql.18.dylib not found at: $LIBMSODBCSQL_PATH" + exit 1 +fi + +if [ ! -f "$LIBODBCINST_PATH" ]; then + echo "Error: libodbcinst.2.dylib not found at: $LIBODBCINST_PATH" + exit 1 +fi + +# Get the existing library paths which are linked to the dylibs +echo "Reading dependencies from libmsodbcsql.18.dylib..." +OTOOL_LIST=$(otool -L "$LIBMSODBCSQL_PATH") +OLD_LIBODBCINST_PATH="" + +# In the otool list of libmsodbcsql_path, get the library path for libodbcinst +while IFS= read -r line; do + if [[ "$line" == *"libodbcinst"* ]]; then + OLD_LIBODBCINST_PATH=$(echo "$line" | awk '{print $1}') + break + fi +done <<< "$OTOOL_LIST" + +echo "Reading dependencies from libodbcinst.2.dylib..." +OTOOL_LIST=$(otool -L "$LIBODBCINST_PATH") +OLD_LIBLTDL_PATH="" + +# In the otool list of libodbcinst_path, get the library path for libltdl +while IFS= read -r line; do + if [[ "$line" == *"libltdl"* ]]; then + OLD_LIBLTDL_PATH=$(echo "$line" | awk '{print $1}') + break + fi +done <<< "$OTOOL_LIST" + +# Configure the library paths if dependencies were found +if [ -n "$OLD_LIBODBCINST_PATH" ]; then + echo "Fixing libmsodbcsql.18.dylib dependency on libodbcinst.2.dylib..." + echo " Changing: $OLD_LIBODBCINST_PATH" + echo " To: $LIBODBCINST_PATH" + install_name_tool -change "$OLD_LIBODBCINST_PATH" "$LIBODBCINST_PATH" "$LIBMSODBCSQL_PATH" +else + echo "Warning: libodbcinst dependency not found in libmsodbcsql.18.dylib" +fi + +if [ -n "$OLD_LIBLTDL_PATH" ] && [ -f "$LIBLTDL_PATH" ]; then + echo "Fixing libodbcinst.2.dylib dependency on libltdl.7.dylib..." + echo " Changing: $OLD_LIBLTDL_PATH" + echo " To: $LIBLTDL_PATH" + install_name_tool -change "$OLD_LIBLTDL_PATH" "$LIBLTDL_PATH" "$LIBODBCINST_PATH" +else + echo "Note: libltdl dependency not found or not needed" +fi + +# Force codesign the dylibs +echo "Codesigning libmsodbcsql.18.dylib..." +codesign -s - -f "$LIBMSODBCSQL_PATH" 2>/dev/null + +echo "Codesigning libodbcinst.2.dylib..." +codesign -s - -f "$LIBODBCINST_PATH" 2>/dev/null + +if [ -f "$LIBLTDL_PATH" ]; then + echo "Codesigning libltdl.7.dylib..." + codesign -s - -f "$LIBLTDL_PATH" 2>/dev/null +fi + +echo "Library configuration complete!" diff --git a/mssql_python/pybind/ddbc_bindings_mac.cpp b/mssql_python/pybind/ddbc_bindings_mac.cpp new file mode 100644 index 00000000..1bf29a40 --- /dev/null +++ b/mssql_python/pybind/ddbc_bindings_mac.cpp @@ -0,0 +1,2416 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +// INFO|TODO - Note that is file is Windows specific right now. Making it arch agnostic will be +// taken up in beta release + +#include // pybind11.h must be the first include - https://pybind11.readthedocs.io/en/latest/basics.html#header-and-namespace-conventions + +#include +#include // std::setw, std::setfill +#include +#include +#include // std::forward + +// Platform-specific headers +#include +#include + +#ifdef _WIN32 + // Windows-specific headers + #include // windows.h needs to be included before sql.h + #include + #pragma comment(lib, "shlwapi.lib") + #define IS_WINDOWS 1 +#elif defined(__APPLE__) + // macOS-specific headers + #include + #include + #define IS_WINDOWS 0 + + // String conversion helpers for macOS - wchar_t is 4 bytes on macOS, but SQLWCHAR is 2 bytes + inline std::wstring SQLWCHARToWString(const SQLWCHAR* sqlwStr, size_t length = SQL_NTS) { + if (!sqlwStr) return std::wstring(); + + if (length == SQL_NTS) { + // Determine length if not provided + size_t i = 0; + while (sqlwStr[i] != 0) ++i; + length = i; + } + + std::wstring result; + result.reserve(length); + for (size_t i = 0; i < length; ++i) { + result.push_back(static_cast(sqlwStr[i])); + } + return result; + } + + inline std::vector WStringToSQLWCHAR(const std::wstring& str) { + std::vector result(str.size() + 1, 0); // +1 for null terminator + for (size_t i = 0; i < str.size(); ++i) { + result[i] = static_cast(str[i]); + } + return result; + } +#else + // Other platforms + #include + #include + #define IS_WINDOWS 0 +#endif + +#include +#include +#include +#include // Add this line for datetime support +#include +#include +#include + +#if defined(__APPLE__) +#include "mac_fix.h" // For macOS-specific Unicode encoding fixes +#include "mac_buffers.h" // For macOS-specific buffer handling +#endif + + +namespace py = pybind11; +using namespace pybind11::literals; + +//------------------------------------------------------------------------------------------------- +// Macro definitions +//------------------------------------------------------------------------------------------------- + +// This constant is not exposed via sql.h, hence define it here +#define SQL_SS_TIME2 (-154) + +#define MAX_DIGITS_IN_NUMERIC 64 + +#define STRINGIFY_FOR_CASE(x) \ + case x: \ + return #x + +// Architecture-specific defines +#ifndef ARCHITECTURE +#define ARCHITECTURE "win64" // Default to win64 if not defined during compilation +#endif + +//------------------------------------------------------------------------------------------------- +// Class definitions +//------------------------------------------------------------------------------------------------- + +// Struct to hold parameter information for binding. Used by SQLBindParameter. +// This struct is shared between C++ & Python code. +struct ParamInfo { + SQLSMALLINT inputOutputType; + SQLSMALLINT paramCType; + SQLSMALLINT paramSQLType; + SQLULEN columnSize; + SQLSMALLINT decimalDigits; + // TODO: Reuse python buffer for large data using Python buffer protocol + // Stores pointer to the python object that holds parameter value + // py::object* dataPtr; +}; + +// Mirrors the SQL_NUMERIC_STRUCT. But redefined to replace val char array +// with std::string, because pybind doesn't allow binding char array. +// This struct is shared between C++ & Python code. +struct NumericData { + SQLCHAR precision; + SQLSCHAR scale; + SQLCHAR sign; // 1=pos, 0=neg + std::uint64_t val; // 123.45 -> 12345 + + NumericData() : precision(0), scale(0), sign(0), val(0) {} + + NumericData(SQLCHAR precision, SQLSCHAR scale, SQLCHAR sign, std::uint64_t value) + : precision(precision), scale(scale), sign(sign), val(value) {} +}; + +// Struct to hold data buffers and indicators for each column +struct ColumnBuffers { + std::vector> charBuffers; + std::vector> wcharBuffers; + std::vector> intBuffers; + std::vector> smallIntBuffers; + std::vector> realBuffers; + std::vector> doubleBuffers; + std::vector> timestampBuffers; + std::vector> bigIntBuffers; + std::vector> dateBuffers; + std::vector> timeBuffers; + std::vector> guidBuffers; + std::vector> indicators; + + ColumnBuffers(SQLSMALLINT numCols, int fetchSize) + : charBuffers(numCols), + wcharBuffers(numCols), + intBuffers(numCols), + smallIntBuffers(numCols), + realBuffers(numCols), + doubleBuffers(numCols), + timestampBuffers(numCols), + bigIntBuffers(numCols), + dateBuffers(numCols), + timeBuffers(numCols), + guidBuffers(numCols), + indicators(numCols, std::vector(fetchSize)) {} +}; + +// This struct is used to relay error info obtained from SQLDiagRec API to the Python module +struct ErrorInfo { + std::wstring sqlState; + std::wstring ddbcErrorMsg; +}; + + +//------------------------------------------------------------------------------------------------- +// Function pointer typedefs +//------------------------------------------------------------------------------------------------- + +// Handle APIs +typedef SQLRETURN (*SQLAllocHandleFunc)(SQLSMALLINT, SQLHANDLE, SQLHANDLE*); +typedef SQLRETURN (*SQLSetEnvAttrFunc)(SQLHANDLE, SQLINTEGER, SQLPOINTER, SQLINTEGER); +typedef SQLRETURN (*SQLSetConnectAttrFunc)(SQLHDBC, SQLINTEGER, SQLPOINTER, SQLINTEGER); +typedef SQLRETURN (*SQLSetStmtAttrFunc)(SQLHSTMT, SQLINTEGER, SQLPOINTER, SQLINTEGER); +typedef SQLRETURN (*SQLGetConnectAttrFunc)(SQLHDBC, SQLINTEGER, SQLPOINTER, SQLINTEGER, + SQLINTEGER*); + +// Connection and Execution APIs +typedef SQLRETURN (*SQLDriverConnectFunc)(SQLHANDLE, SQLHWND, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, + SQLSMALLINT, SQLSMALLINT*, SQLUSMALLINT); +typedef SQLRETURN (*SQLExecDirectFunc)(SQLHANDLE, SQLWCHAR*, SQLINTEGER); +typedef SQLRETURN (*SQLPrepareFunc)(SQLHANDLE, SQLWCHAR*, SQLINTEGER); +typedef SQLRETURN (*SQLBindParameterFunc)(SQLHANDLE, SQLUSMALLINT, SQLSMALLINT, SQLSMALLINT, + SQLSMALLINT, SQLULEN, SQLSMALLINT, SQLPOINTER, SQLLEN, + SQLLEN*); +typedef SQLRETURN (*SQLExecuteFunc)(SQLHANDLE); +typedef SQLRETURN (*SQLRowCountFunc)(SQLHSTMT, SQLLEN*); +typedef SQLRETURN (*SQLSetDescFieldFunc)(SQLHDESC, SQLSMALLINT, SQLSMALLINT, SQLPOINTER, SQLINTEGER); +typedef SQLRETURN (*SQLGetStmtAttrFunc)(SQLHSTMT, SQLINTEGER, SQLPOINTER, SQLINTEGER, SQLINTEGER*); + +// Data retrieval APIs +typedef SQLRETURN (*SQLFetchFunc)(SQLHANDLE); +typedef SQLRETURN (*SQLFetchScrollFunc)(SQLHANDLE, SQLSMALLINT, SQLLEN); +typedef SQLRETURN (*SQLGetDataFunc)(SQLHANDLE, SQLUSMALLINT, SQLSMALLINT, SQLPOINTER, SQLLEN, + SQLLEN*); +typedef SQLRETURN (*SQLNumResultColsFunc)(SQLHSTMT, SQLSMALLINT*); +typedef SQLRETURN (*SQLBindColFunc)(SQLHSTMT, SQLUSMALLINT, SQLSMALLINT, SQLPOINTER, SQLLEN, + SQLLEN*); +typedef SQLRETURN (*SQLDescribeColFunc)(SQLHSTMT, SQLUSMALLINT, SQLWCHAR*, SQLSMALLINT, + SQLSMALLINT*, SQLSMALLINT*, SQLULEN*, SQLSMALLINT*, + SQLSMALLINT*); +typedef SQLRETURN (*SQLMoreResultsFunc)(SQLHSTMT); +typedef SQLRETURN (*SQLColAttributeFunc)(SQLHSTMT, SQLUSMALLINT, SQLUSMALLINT, SQLPOINTER, + SQLSMALLINT, SQLSMALLINT*, SQLPOINTER); + +// Transaction APIs +typedef SQLRETURN (*SQLEndTranFunc)(SQLSMALLINT, SQLHANDLE, SQLSMALLINT); + +// Disconnect/free APIs +typedef SQLRETURN (*SQLFreeHandleFunc)(SQLSMALLINT, SQLHANDLE); +typedef SQLRETURN (*SQLDisconnectFunc)(SQLHDBC); +typedef SQLRETURN (*SQLFreeStmtFunc)(SQLHSTMT, SQLUSMALLINT); +typedef SQLRETURN (*SQLCloseCursorFunc)(SQLHSTMT); +typedef SQLRETURN (*SQLCancelFunc)(SQLHSTMT); + +// Catalog functions +typedef SQLRETURN (*SQLTablesFunc)(SQLHSTMT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT); +typedef SQLRETURN (*SQLColumnsFunc)(SQLHSTMT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT); +typedef SQLRETURN (*SQLPrimaryKeysFunc)(SQLHSTMT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT); +typedef SQLRETURN (*SQLForeignKeysFunc)(SQLHSTMT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT); +typedef SQLRETURN (*SQLTablePrivilegesFunc)(SQLHSTMT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT); +typedef SQLRETURN (*SQLColumnPrivilegesFunc)(SQLHSTMT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT, SQLWCHAR*, SQLSMALLINT); + +// Diagnostic APIs +typedef SQLRETURN (*SQLGetDiagRecFunc)(SQLSMALLINT, SQLHANDLE, SQLSMALLINT, SQLWCHAR*, SQLINTEGER*, + SQLWCHAR*, SQLSMALLINT, SQLSMALLINT*); + +//------------------------------------------------------------------------------------------------- +// Function pointer initialization +//------------------------------------------------------------------------------------------------- + +// Handle APIs +SQLAllocHandleFunc SQLAllocHandle_ptr = nullptr; +SQLSetEnvAttrFunc SQLSetEnvAttr_ptr = nullptr; +SQLSetConnectAttrFunc SQLSetConnectAttr_ptr = nullptr; +SQLSetStmtAttrFunc SQLSetStmtAttr_ptr = nullptr; +SQLGetConnectAttrFunc SQLGetConnectAttr_ptr = nullptr; + +// Connection and Execution APIs +SQLDriverConnectFunc SQLDriverConnect_ptr = nullptr; +SQLExecDirectFunc SQLExecDirect_ptr = nullptr; +SQLPrepareFunc SQLPrepare_ptr = nullptr; +SQLBindParameterFunc SQLBindParameter_ptr = nullptr; +SQLExecuteFunc SQLExecute_ptr = nullptr; +SQLRowCountFunc SQLRowCount_ptr = nullptr; +SQLGetStmtAttrFunc SQLGetStmtAttr_ptr = nullptr; +SQLSetDescFieldFunc SQLSetDescField_ptr = nullptr; + +// Data retrieval APIs +SQLFetchFunc SQLFetch_ptr = nullptr; +SQLFetchScrollFunc SQLFetchScroll_ptr = nullptr; +SQLGetDataFunc SQLGetData_ptr = nullptr; +SQLNumResultColsFunc SQLNumResultCols_ptr = nullptr; +SQLBindColFunc SQLBindCol_ptr = nullptr; +SQLDescribeColFunc SQLDescribeCol_ptr = nullptr; +SQLMoreResultsFunc SQLMoreResults_ptr = nullptr; +SQLColAttributeFunc SQLColAttribute_ptr = nullptr; + +// Transaction APIs +SQLEndTranFunc SQLEndTran_ptr = nullptr; + +// Disconnect/free APIs +SQLFreeHandleFunc SQLFreeHandle_ptr = nullptr; +SQLDisconnectFunc SQLDisconnect_ptr = nullptr; +SQLFreeStmtFunc SQLFreeStmt_ptr = nullptr; +SQLCloseCursorFunc SQLCloseCursor_ptr = nullptr; +SQLCancelFunc SQLCancel_ptr = nullptr; + +// Catalog functions +SQLTablesFunc SQLTables_ptr = nullptr; +SQLColumnsFunc SQLColumns_ptr = nullptr; +SQLPrimaryKeysFunc SQLPrimaryKeys_ptr = nullptr; +SQLForeignKeysFunc SQLForeignKeys_ptr = nullptr; +SQLTablePrivilegesFunc SQLTablePrivileges_ptr = nullptr; +SQLColumnPrivilegesFunc SQLColumnPrivileges_ptr = nullptr; + +// Diagnostic APIs +SQLGetDiagRecFunc SQLGetDiagRec_ptr = nullptr; + +// Move GetModuleDirectory outside namespace to resolve ambiguity +std::string GetModuleDirectory() { + py::object module = py::module::import("mssql_python"); + py::object module_path = module.attr("__file__"); + std::string module_file = module_path.cast(); + + std::cerr << "DEBUG: Module file path: " << module_file << std::endl; + +#ifdef _WIN32 + // Windows-specific path handling + char path[MAX_PATH]; + strncpy_s(path, MAX_PATH, module_file.c_str(), module_file.length()); + PathRemoveFileSpecA(path); + return std::string(path); +#else + // macOS/Unix path handling without using std::filesystem + std::string::size_type pos = module_file.find_last_of('/'); + if (pos != std::string::npos) { + std::string dir = module_file.substr(0, pos); + std::cerr << "DEBUG: Module directory: " << dir << std::endl; + return dir; + } + std::cerr << "DEBUG: Could not extract directory from path: " << module_file << std::endl; + return module_file; +#endif +} + +namespace { + +// TODO: Revisit GIL considerations if we're using python's logger +template +void LOG(const std::string& formatString, Args&&... args) { + // Get the logger each time instead of caching it to ensure we get the latest state + py::object logging_module = py::module_::import("mssql_python.logging_config"); + py::object logger = logging_module.attr("get_logger")(); + + // If logger is None, don't try to log + if (py::isinstance(logger)) { + return; + } + + // Format the message and log it + std::string ddbcFormatString = "[DDBC Bindings log] " + formatString; + py::str message = py::str(ddbcFormatString).format(std::forward(args)...); + logger.attr("debug")(message); +} + +// Define a platform-agnostic type for the driver handle +#ifdef _WIN32 +typedef HMODULE DriverHandle; +#else +typedef void* DriverHandle; +#endif + +// Platform-agnostic function to load the driver dynamic library +DriverHandle LoadDriverLibrary(const std::string& driverPath) { + LOG("Loading driver from path: {}", driverPath); + +#ifdef _WIN32 + // Windows: Convert string to wide string for LoadLibraryW + std::wstring widePath(driverPath.begin(), driverPath.end()); + return LoadLibraryW(widePath.c_str()); +#else + // macOS/Unix: Use dlopen + return dlopen(driverPath.c_str(), RTLD_LAZY); +#endif +} + +// Platform-agnostic function to get last error message +std::string GetLastErrorMessage() { +#ifdef _WIN32 + // Windows: Use FormatMessageA + DWORD error = GetLastError(); + char* messageBuffer = nullptr; + size_t size = FormatMessageA( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + error, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPSTR)&messageBuffer, + 0, + NULL + ); + std::string errorMessage = messageBuffer ? std::string(messageBuffer, size) : "Unknown error"; + LocalFree(messageBuffer); + return "Error code: " + std::to_string(error) + " - " + errorMessage; +#else + // macOS/Unix: Use dlerror + const char* error = dlerror(); + return error ? std::string(error) : "Unknown error"; +#endif +} + +// Platform-agnostic function to get a function pointer from the loaded library +template +T GetFunctionPointer(DriverHandle handle, const char* functionName) { +#ifdef _WIN32 + // Windows: Use GetProcAddress + return reinterpret_cast(GetProcAddress(handle, functionName)); +#else + // macOS/Unix: Use dlsym + return reinterpret_cast(dlsym(handle, functionName)); +#endif +} + +// TODO: Add more nuanced exception classes +void ThrowStdException(const std::string& message) { throw std::runtime_error(message); } + +// Cross-platform helper to load the ODBC driver and get function pointers +DriverHandle LoadDriverOrThrowException() { + // Get the module directory path + std::string moduleDir = GetModuleDirectory(); + LOG("Module directory: {}", moduleDir); + + // Build path to the architecture-specific driver library + std::string archStr(ARCHITECTURE); + std::string archDir; + + // Map architecture identifiers to correct subdirectory names + if (archStr == "win64" || archStr == "amd64" || archStr == "x64") { + archDir = "x64"; + } else if (archStr == "arm64") { + archDir = "arm64"; + } else { + archDir = "x86"; + } + + std::string driverPath; +#ifdef _WIN32 + // Windows: Build path to msodbcsql18.dll + driverPath = moduleDir + "\\libs\\" + archDir + "\\msodbcsql18.dll"; +#elif defined(__APPLE__) // macOS: Build path to libmsodbcsql.18.dylib - first check in lib subdirectory + // We will only support arm64 (Apple Silicon Chip) architecture for macOS + std::string macosDriverPath = moduleDir + "/libs/macos/lib/libmsodbcsql.18.dylib"; + // Check if file exists using traditional C file functions instead of std::filesystem + FILE* file = fopen(macosDriverPath.c_str(), "r"); + if (file) { + fclose(file); + driverPath = macosDriverPath; + LOG("Found macOS driver in lib subdirectory: {}", driverPath); + } else { + // Fallback to the older path structure + driverPath = moduleDir + "/libs/" + archDir + "/macos/libmsodbcsql.18.dylib"; + LOG("Using fallback path for macOS driver: {}", driverPath); + } +#else + // Linux: Build path to libmsodbcsql.so.18.0 + driverPath = moduleDir + "/libs/" + archDir + "/libmsodbcsql.so.18.0"; +#endif + + LOG("Attempting to load driver from - {}", driverPath); + + // Load the driver library + DriverHandle driverHandle = LoadDriverLibrary(driverPath); + if (!driverHandle) { + std::string errorMessage = GetLastErrorMessage(); + LOG("Failed to load the driver: {}", errorMessage); + ThrowStdException("Failed to load the ODBC driver. Please check that it is installed correctly."); + } + + LOG("Successfully loaded the ODBC driver"); + + // Load all the required function pointers + // Environment and handle function loading + SQLAllocHandle_ptr = GetFunctionPointer(driverHandle, "SQLAllocHandle"); + SQLSetEnvAttr_ptr = GetFunctionPointer(driverHandle, "SQLSetEnvAttr"); + SQLSetConnectAttr_ptr = GetFunctionPointer(driverHandle, "SQLSetConnectAttrW"); + SQLSetStmtAttr_ptr = GetFunctionPointer(driverHandle, "SQLSetStmtAttrW"); + SQLGetConnectAttr_ptr = GetFunctionPointer(driverHandle, "SQLGetConnectAttrW"); + + // Connection and statement function loading + SQLDriverConnect_ptr = GetFunctionPointer(driverHandle, "SQLDriverConnectW"); + SQLExecDirect_ptr = GetFunctionPointer(driverHandle, "SQLExecDirectW"); + SQLPrepare_ptr = GetFunctionPointer(driverHandle, "SQLPrepareW"); + SQLBindParameter_ptr = GetFunctionPointer(driverHandle, "SQLBindParameter"); + SQLExecute_ptr = GetFunctionPointer(driverHandle, "SQLExecute"); + SQLRowCount_ptr = GetFunctionPointer(driverHandle, "SQLRowCount"); + SQLGetStmtAttr_ptr = GetFunctionPointer(driverHandle, "SQLGetStmtAttrW"); + SQLSetDescField_ptr = GetFunctionPointer(driverHandle, "SQLSetDescFieldW"); // Fetch and data retrieval function loading + SQLFetch_ptr = GetFunctionPointer(driverHandle, "SQLFetch"); + SQLFetchScroll_ptr = GetFunctionPointer(driverHandle, "SQLFetchScroll"); + SQLGetData_ptr = GetFunctionPointer(driverHandle, "SQLGetData"); + SQLNumResultCols_ptr = GetFunctionPointer(driverHandle, "SQLNumResultCols"); + SQLBindCol_ptr = GetFunctionPointer(driverHandle, "SQLBindCol"); + SQLDescribeCol_ptr = GetFunctionPointer(driverHandle, "SQLDescribeColW"); + SQLMoreResults_ptr = GetFunctionPointer(driverHandle, "SQLMoreResults"); + SQLColAttribute_ptr = GetFunctionPointer(driverHandle, "SQLColAttributeW"); + + // Transaction functions loading + SQLEndTran_ptr = GetFunctionPointer(driverHandle, "SQLEndTran"); + + // Disconnect and free functions loading + SQLDisconnect_ptr = GetFunctionPointer(driverHandle, "SQLDisconnect"); + SQLFreeHandle_ptr = GetFunctionPointer(driverHandle, "SQLFreeHandle"); + SQLFreeStmt_ptr = GetFunctionPointer(driverHandle, "SQLFreeStmt"); + SQLCloseCursor_ptr = GetFunctionPointer(driverHandle, "SQLCloseCursor"); + SQLCancel_ptr = GetFunctionPointer(driverHandle, "SQLCancel"); + + // Catalog functions loading + SQLTables_ptr = GetFunctionPointer(driverHandle, "SQLTablesW"); + SQLColumns_ptr = GetFunctionPointer(driverHandle, "SQLColumnsW"); + SQLPrimaryKeys_ptr = GetFunctionPointer(driverHandle, "SQLPrimaryKeysW"); + SQLForeignKeys_ptr = GetFunctionPointer(driverHandle, "SQLForeignKeysW"); + SQLTablePrivileges_ptr = GetFunctionPointer(driverHandle, "SQLTablePrivilegesW"); + SQLColumnPrivileges_ptr = GetFunctionPointer(driverHandle, "SQLColumnPrivilegesW"); + + // Diagnostic record function Loading + SQLGetDiagRec_ptr = GetFunctionPointer(driverHandle, "SQLGetDiagRecW"); + + bool success = SQLAllocHandle_ptr && SQLSetEnvAttr_ptr && SQLSetConnectAttr_ptr && + SQLSetStmtAttr_ptr && SQLGetConnectAttr_ptr && SQLDriverConnect_ptr && + SQLExecDirect_ptr && SQLPrepare_ptr && SQLBindParameter_ptr && SQLExecute_ptr && + SQLRowCount_ptr && SQLGetStmtAttr_ptr && SQLSetDescField_ptr && SQLFetch_ptr && + SQLFetchScroll_ptr && SQLGetData_ptr && SQLNumResultCols_ptr && + SQLBindCol_ptr && SQLDescribeCol_ptr && SQLMoreResults_ptr && + SQLColAttribute_ptr && SQLEndTran_ptr && SQLFreeHandle_ptr && + SQLDisconnect_ptr && SQLFreeStmt_ptr && SQLGetDiagRec_ptr; + + if (!success) { + LOG("Failed to load required function pointers from driver"); + ThrowStdException("Failed to load required function pointers from driver"); + } + LOG("Successfully loaded function pointers from driver"); + + return driverHandle; +} + +// This section was removed because these functions are now properly declared +// in the main function pointer typedefs section above. + +const char* GetSqlCTypeAsString(const SQLSMALLINT cType) { + switch (cType) { + STRINGIFY_FOR_CASE(SQL_C_CHAR); + STRINGIFY_FOR_CASE(SQL_C_WCHAR); + STRINGIFY_FOR_CASE(SQL_C_SSHORT); + STRINGIFY_FOR_CASE(SQL_C_USHORT); + STRINGIFY_FOR_CASE(SQL_C_SHORT); + STRINGIFY_FOR_CASE(SQL_C_SLONG); + STRINGIFY_FOR_CASE(SQL_C_ULONG); + STRINGIFY_FOR_CASE(SQL_C_LONG); + STRINGIFY_FOR_CASE(SQL_C_STINYINT); + STRINGIFY_FOR_CASE(SQL_C_UTINYINT); + STRINGIFY_FOR_CASE(SQL_C_TINYINT); + STRINGIFY_FOR_CASE(SQL_C_SBIGINT); + STRINGIFY_FOR_CASE(SQL_C_UBIGINT); + STRINGIFY_FOR_CASE(SQL_C_FLOAT); + STRINGIFY_FOR_CASE(SQL_C_DOUBLE); + STRINGIFY_FOR_CASE(SQL_C_BIT); + STRINGIFY_FOR_CASE(SQL_C_BINARY); + STRINGIFY_FOR_CASE(SQL_C_TYPE_DATE); + STRINGIFY_FOR_CASE(SQL_C_TYPE_TIME); + STRINGIFY_FOR_CASE(SQL_C_TYPE_TIMESTAMP); + STRINGIFY_FOR_CASE(SQL_C_NUMERIC); + STRINGIFY_FOR_CASE(SQL_C_GUID); + STRINGIFY_FOR_CASE(SQL_C_DEFAULT); + default: + return "Unknown"; + } +} + +std::string MakeParamMismatchErrorStr(const SQLSMALLINT cType, const int paramIndex) { + std::string errorString = + "Parameter's object type does not match parameter's C type. paramIndex - " + + std::to_string(paramIndex) + ", C type - " + GetSqlCTypeAsString(cType); + return errorString; +} + +// This function allocates a buffer of ParamType, stores it as a void* in paramBuffers for +// book-keeping and then returns a ParamType* to the allocated memory. +// ctorArgs are the arguments to ParamType's constructor used while creating/allocating ParamType +template +ParamType* AllocateParamBuffer(std::vector>& paramBuffers, + CtorArgs&&... ctorArgs) { + paramBuffers.emplace_back(new ParamType(std::forward(ctorArgs)...), + std::default_delete()); + return static_cast(paramBuffers.back().get()); +} + +// Given a list of parameters and their ParamInfo, calls SQLBindParameter on each of them with +// appropriate arguments +SQLRETURN BindParameters(SQLHANDLE hStmt, const py::list& params, + const std::vector& paramInfos, + std::vector>& paramBuffers) { + LOG("Starting parameter binding. Number of parameters: {}", params.size()); + for (int paramIndex = 0; paramIndex < params.size(); paramIndex++) { + const auto& param = params[paramIndex]; + const ParamInfo& paramInfo = paramInfos[paramIndex]; + LOG("Binding parameter {} - C Type: {}, SQL Type: {}", paramIndex, paramInfo.paramCType, paramInfo.paramSQLType); + void* dataPtr = nullptr; + SQLLEN bufferLength = 0; + SQLLEN* strLenOrIndPtr = nullptr; + // TODO: Add more data types like money, guid, interval, TVPs etc. + switch (paramInfo.paramCType) { + case SQL_C_CHAR: + case SQL_C_BINARY: { + if (!py::isinstance(param) && !py::isinstance(param) && + !py::isinstance(param)) { + ThrowStdException(MakeParamMismatchErrorStr(paramInfo.paramCType, paramIndex)); + } + std::string* strParam = + AllocateParamBuffer(paramBuffers, param.cast()); + if (strParam->size() > 8192 /* TODO: Fix max length */) { + ThrowStdException( + "Streaming parameters is not yet supported. Parameter size" + " must be less than 8192 bytes"); + } + dataPtr = const_cast(static_cast(strParam->c_str())); + bufferLength = strParam->size() + 1 /* null terminator */; + strLenOrIndPtr = AllocateParamBuffer(paramBuffers); + *strLenOrIndPtr = SQL_NTS; + break; + } + case SQL_C_WCHAR: { + if (!py::isinstance(param) && !py::isinstance(param) && + !py::isinstance(param)) { + ThrowStdException(MakeParamMismatchErrorStr(paramInfo.paramCType, paramIndex)); + } + std::wstring* strParam = + AllocateParamBuffer(paramBuffers, param.cast()); + if (strParam->size() > 4096 /* TODO: Fix max length */) { + ThrowStdException( + "Streaming parameters is not yet supported. Parameter size" + " must be less than 8192 bytes"); + } + + // Log detailed parameter information + LOG("SQL_C_WCHAR Parameter[{}]: Length={}, Content='{}'", + paramIndex, strParam->size(), + strParam->size() <= 100 ? std::string(strParam->begin(), strParam->end()) : + std::string(strParam->begin(), strParam->begin() + 100) + "..."); + + // Log each character's code point for debugging + if (strParam->size() <= 20) { + for (size_t i = 0; i < strParam->size(); i++) { + LOG(" char[{}] = {} ({})", i, static_cast((*strParam)[i]), + ((*strParam)[i] >= 32 && (*strParam)[i] <= 126) ? + static_cast((*strParam)[i]) : '?'); + } + } + +#if defined(__APPLE__) + // On macOS, we need special handling for wide characters + // Create a properly encoded SQLWCHAR buffer for the parameter + std::vector* sqlwcharBuffer = + AllocateParamBuffer>(paramBuffers); + + // Reserve space and convert from wstring to SQLWCHAR array + sqlwcharBuffer->resize(strParam->size() + 1, 0); // +1 for null terminator + + // Convert each wchar_t (4 bytes on macOS) to SQLWCHAR (2 bytes) + for (size_t i = 0; i < strParam->size(); i++) { + (*sqlwcharBuffer)[i] = static_cast((*strParam)[i]); + } + + // Use the SQLWCHAR buffer instead of the wstring directly + dataPtr = sqlwcharBuffer->data(); + bufferLength = (strParam->size() + 1) * sizeof(SQLWCHAR); + LOG("macOS: Created SQLWCHAR buffer for parameter with size: {} bytes", bufferLength); +#else + // On Windows, wchar_t and SQLWCHAR are the same size, so direct cast works + dataPtr = const_cast(static_cast(strParam->c_str())); + bufferLength = (strParam->size() + 1 /* null terminator */) * sizeof(wchar_t); +#endif + + strLenOrIndPtr = AllocateParamBuffer(paramBuffers); + *strLenOrIndPtr = SQL_NTS; + break; + } + case SQL_C_BIT: { + if (!py::isinstance(param)) { + ThrowStdException(MakeParamMismatchErrorStr(paramInfo.paramCType, paramIndex)); + } + dataPtr = + static_cast(AllocateParamBuffer(paramBuffers, param.cast())); + break; + } + case SQL_C_DEFAULT: { + if (!py::isinstance(param)) { + ThrowStdException(MakeParamMismatchErrorStr(paramInfo.paramCType, paramIndex)); + } + // TODO: This wont work for None values added to BINARY/VARBINARY columns. None values + // of binary columns need to have C type = SQL_C_BINARY & SQL type = SQL_BINARY + dataPtr = nullptr; + strLenOrIndPtr = AllocateParamBuffer(paramBuffers); + *strLenOrIndPtr = SQL_NULL_DATA; + break; + } case SQL_C_STINYINT: + case SQL_C_TINYINT: + case SQL_C_SSHORT: + case SQL_C_SHORT: { + LOG("BINDING INTEGER PARAMETER"); + if (!py::isinstance(param)) { + ThrowStdException(MakeParamMismatchErrorStr(paramInfo.paramCType, paramIndex)); + } + dataPtr = + static_cast(AllocateParamBuffer(paramBuffers, param.cast())); + LOG("INITIALIZED INTEGER PARAMETER"); + // Set the strLenOrIndPtr for integer parameters + strLenOrIndPtr = AllocateParamBuffer(paramBuffers); + *strLenOrIndPtr = sizeof(int); + LOG("INITIALIZED INTEGER PARAMETER LENGTH"); + break; + } + case SQL_C_UTINYINT: + case SQL_C_USHORT: { + if (!py::isinstance(param)) { + ThrowStdException(MakeParamMismatchErrorStr(paramInfo.paramCType, paramIndex)); + } + dataPtr = static_cast( + AllocateParamBuffer(paramBuffers, param.cast())); + // Set the strLenOrIndPtr for unsigned integer parameters + strLenOrIndPtr = AllocateParamBuffer(paramBuffers); + *strLenOrIndPtr = sizeof(unsigned int); + break; + } case SQL_C_SBIGINT: + case SQL_C_SLONG: + case SQL_C_LONG: { + if (!py::isinstance(param)) { + ThrowStdException(MakeParamMismatchErrorStr(paramInfo.paramCType, paramIndex)); + } + dataPtr = static_cast( + AllocateParamBuffer(paramBuffers, param.cast())); + // Set the strLenOrIndPtr for long integer parameters + strLenOrIndPtr = AllocateParamBuffer(paramBuffers); + *strLenOrIndPtr = sizeof(int64_t); + break; + } + case SQL_C_UBIGINT: + case SQL_C_ULONG: { + if (!py::isinstance(param)) { + ThrowStdException(MakeParamMismatchErrorStr(paramInfo.paramCType, paramIndex)); + } + dataPtr = static_cast( + AllocateParamBuffer(paramBuffers, param.cast())); + break; + } + case SQL_C_FLOAT: { + if (!py::isinstance(param)) { + ThrowStdException(MakeParamMismatchErrorStr(paramInfo.paramCType, paramIndex)); + } + dataPtr = static_cast( + AllocateParamBuffer(paramBuffers, param.cast())); + break; + } + case SQL_C_DOUBLE: { + if (!py::isinstance(param)) { + ThrowStdException(MakeParamMismatchErrorStr(paramInfo.paramCType, paramIndex)); + } + dataPtr = static_cast( + AllocateParamBuffer(paramBuffers, param.cast())); + break; + } + case SQL_C_TYPE_DATE: { + py::object dateType = py::module_::import("datetime").attr("date"); + if (!py::isinstance(param, dateType)) { + ThrowStdException(MakeParamMismatchErrorStr(paramInfo.paramCType, paramIndex)); + } + // TODO: can be moved to python by registering SQL_DATE_STRUCT in pybind + SQL_DATE_STRUCT* sqlDatePtr = AllocateParamBuffer(paramBuffers); + sqlDatePtr->year = param.attr("year").cast(); + sqlDatePtr->month = param.attr("month").cast(); + sqlDatePtr->day = param.attr("day").cast(); + dataPtr = static_cast(sqlDatePtr); + break; + } + case SQL_C_TYPE_TIME: { + py::object timeType = py::module_::import("datetime").attr("time"); + if (!py::isinstance(param, timeType)) { + ThrowStdException(MakeParamMismatchErrorStr(paramInfo.paramCType, paramIndex)); + } + // TODO: can be moved to python by registering SQL_TIME_STRUCT in pybind + SQL_TIME_STRUCT* sqlTimePtr = AllocateParamBuffer(paramBuffers); + sqlTimePtr->hour = param.attr("hour").cast(); + sqlTimePtr->minute = param.attr("minute").cast(); + sqlTimePtr->second = param.attr("second").cast(); + dataPtr = static_cast(sqlTimePtr); + break; + } + case SQL_C_TYPE_TIMESTAMP: { + py::object datetimeType = py::module_::import("datetime").attr("datetime"); + if (!py::isinstance(param, datetimeType)) { + ThrowStdException(MakeParamMismatchErrorStr(paramInfo.paramCType, paramIndex)); + } + SQL_TIMESTAMP_STRUCT* sqlTimestampPtr = + AllocateParamBuffer(paramBuffers); + sqlTimestampPtr->year = param.attr("year").cast(); + sqlTimestampPtr->month = param.attr("month").cast(); + sqlTimestampPtr->day = param.attr("day").cast(); + sqlTimestampPtr->hour = param.attr("hour").cast(); + sqlTimestampPtr->minute = param.attr("minute").cast(); + sqlTimestampPtr->second = param.attr("second").cast(); + // SQL server supports in ns, but python datetime supports in µs + sqlTimestampPtr->fraction = static_cast( + param.attr("microsecond").cast() * 1000); // Convert µs to ns + dataPtr = static_cast(sqlTimestampPtr); + break; + } + case SQL_C_NUMERIC: { + if (!py::isinstance(param)) { + ThrowStdException(MakeParamMismatchErrorStr(paramInfo.paramCType, paramIndex)); + } + NumericData decimalParam = param.cast(); + LOG("Received numeric parameter: precision - {}, scale- {}, sign - {}, value - {}", + decimalParam.precision, decimalParam.scale, decimalParam.sign, + decimalParam.val); + SQL_NUMERIC_STRUCT* decimalPtr = + AllocateParamBuffer(paramBuffers); + decimalPtr->precision = decimalParam.precision; + decimalPtr->scale = decimalParam.scale; + decimalPtr->sign = decimalParam.sign; + // Convert the integer decimalParam.val to char array + std:memset(static_cast(decimalPtr->val), 0, sizeof(decimalPtr->val)); + std::memcpy(static_cast(decimalPtr->val), + reinterpret_cast(&decimalParam.val), + sizeof(decimalParam.val)); + dataPtr = static_cast(decimalPtr); + // TODO: Remove these lines + //strLenOrIndPtr = AllocateParamBuffer(paramBuffers); + //*strLenOrIndPtr = sizeof(SQL_NUMERIC_STRUCT); + break; + } + case SQL_C_GUID: { + // TODO + } + default: { + std::ostringstream errorString; + errorString << "Unsupported parameter type - " << paramInfo.paramCType + << " for parameter - " << paramIndex; + ThrowStdException(errorString.str()); + } + } + assert(SQLBindParameter_ptr && SQLGetStmtAttr_ptr && SQLSetDescField_ptr); + + LOG("BINDING PARAM!!"); + RETCODE rc = SQLBindParameter_ptr( + hStmt, paramIndex + 1 /* 1-based indexing */, paramInfo.inputOutputType, + paramInfo.paramCType, paramInfo.paramSQLType, paramInfo.columnSize, + paramInfo.decimalDigits, dataPtr, bufferLength, strLenOrIndPtr); + LOG("RETCODE - {}", rc); + if (!SQL_SUCCEEDED(rc)) { + LOG("Error when binding parameter - {}", paramIndex); + return rc; + } + // Special handling for Numeric type - + // https://learn.microsoft.com/en-us/sql/odbc/reference/appendixes/retrieve-numeric-data-sql-numeric-struct-kb222831?view=sql-server-ver16#sql_c_numeric-overview + if (paramInfo.paramCType == SQL_C_NUMERIC) { + SQLHDESC hDesc = nullptr; + RETCODE rc = SQLGetStmtAttr_ptr(hStmt, SQL_ATTR_APP_PARAM_DESC, &hDesc, 0, NULL); + if(!SQL_SUCCEEDED(rc)) { + LOG("Error when getting statement attribute - {}", paramIndex); + return rc; + } + rc = SQLSetDescField_ptr(hDesc, 1, SQL_DESC_TYPE, (SQLPOINTER) SQL_C_NUMERIC, 0); + if(!SQL_SUCCEEDED(rc)) { + LOG("Error when setting descriptor field SQL_DESC_TYPE - {}", paramIndex); + return rc; + } + SQL_NUMERIC_STRUCT* numericPtr = reinterpret_cast(dataPtr); + rc = SQLSetDescField_ptr(hDesc, 1, SQL_DESC_PRECISION, + (SQLPOINTER) numericPtr->precision, 0); + if(!SQL_SUCCEEDED(rc)) { + LOG("Error when setting descriptor field SQL_DESC_PRECISION - {}", paramIndex); + return rc; + } + + rc = SQLSetDescField_ptr(hDesc, 1, SQL_DESC_SCALE, + (SQLPOINTER) numericPtr->scale, 0); + if(!SQL_SUCCEEDED(rc)) { + LOG("Error when setting descriptor field SQL_DESC_SCALE - {}", paramIndex); + return rc; + } + + rc = SQLSetDescField_ptr(hDesc, 1, SQL_DESC_DATA_PTR, (SQLPOINTER) numericPtr, 0); + if(!SQL_SUCCEEDED(rc)) { + LOG("Error when setting descriptor field SQL_DESC_DATA_PTR - {}", paramIndex); + return rc; + } + } + } + LOG("Finished parameter binding. Number of parameters: {}", params.size()); + return SQL_SUCCESS; +} + + +// This is temporary hack to avoid crash when SQLDescribeCol returns 0 as columnSize +// for NVARCHAR(MAX) & similar types. Variable length data needs more nuanced handling. +// TODO: Fix this in beta +// This function sets the buffer allocated to fetch NVARCHAR(MAX) & similar types to +// 4096 chars. So we'll retrieve data upto 4096. Anything greater then that will throw +// error +void HandleZeroColumnSizeAtFetch(SQLULEN& columnSize) { + if (columnSize == 0) { + columnSize = 4096; + } +} + +} // namespace + +// Wrap SQLAllocHandle +SQLRETURN SQLAllocHandle_wrap(SQLSMALLINT HandleType, intptr_t InputHandle, intptr_t OutputHandle) { + LOG("Allocate SQL Handle"); + if (!SQLAllocHandle_ptr) { + LoadDriverOrThrowException(); + } + + SQLHANDLE* pOutputHandle = reinterpret_cast(OutputHandle); + return SQLAllocHandle_ptr(HandleType, reinterpret_cast(InputHandle), pOutputHandle); +} + +// Wrap SQLSetEnvAttr +SQLRETURN SQLSetEnvAttr_wrap(intptr_t EnvHandle, SQLINTEGER Attribute, intptr_t ValuePtr, + SQLINTEGER StringLength) { + LOG("Set SQL environment Attribute"); + if (!SQLSetEnvAttr_ptr) { + LoadDriverOrThrowException(); + } + + // TODO: Does ValuePtr need to be converted from Python to C++ object? + return SQLSetEnvAttr_ptr(reinterpret_cast(EnvHandle), Attribute, + reinterpret_cast(ValuePtr), StringLength); +} + +// Wrap SQLSetConnectAttr +SQLRETURN SQLSetConnectAttr_wrap(intptr_t ConnectionHandle, SQLINTEGER Attribute, intptr_t ValuePtr, + SQLINTEGER StringLength) { + LOG("Set SQL Connection Attribute"); + if (!SQLSetConnectAttr_ptr) { + LoadDriverOrThrowException(); + } + + // TODO: Does ValuePtr need to be converted from Python to C++ object? + return SQLSetConnectAttr_ptr(reinterpret_cast(ConnectionHandle), Attribute, + reinterpret_cast(ValuePtr), StringLength); +} + +// Wrap SQLSetStmtAttr +SQLRETURN SQLSetStmtAttr_wrap(intptr_t ConnectionHandle, SQLINTEGER Attribute, intptr_t ValuePtr, + SQLINTEGER StringLength) { + LOG("Set SQL Statement Attribute"); + if (!SQLSetConnectAttr_ptr) { + LoadDriverOrThrowException(); + } + + // TODO: Does ValuePtr need to be converted from Python to C++ object? + return SQLSetStmtAttr_ptr(reinterpret_cast(ConnectionHandle), Attribute, + reinterpret_cast(ValuePtr), StringLength); +} + +// Wrap SQLGetConnectionAttrA +// Currently only supports retrieval of int-valued attributes +// TODO: add support to retrieve all types of attributes +SQLINTEGER SQLGetConnectionAttr_wrap(intptr_t ConnectionHandle, SQLINTEGER attribute) { + LOG("Get SQL COnnection Attribute"); + if (!SQLGetConnectAttr_ptr) { + LoadDriverOrThrowException(); + } + + SQLINTEGER stringLength; + SQLINTEGER intValue; + + // Try to get the attribute as an integer + SQLGetConnectAttr_ptr(reinterpret_cast(ConnectionHandle), attribute, &intValue, + sizeof(SQLINTEGER), &stringLength); + return intValue; +} + +// Helper function to check for driver errors +ErrorInfo SQLCheckError_Wrap(SQLSMALLINT handleType, intptr_t handle, SQLRETURN retcode) { + LOG("Checking errors for retcode - {}" , retcode); + ErrorInfo errorInfo; + + // Initialize default error message in case we can't get specific diagnostics + errorInfo.sqlState = L"HY000"; // General error + + // Handle null handle case + if (handle == 0) { + LOG("Null handle received"); + errorInfo.ddbcErrorMsg = L"Null handle!"; + return errorInfo; + } + // Only try to get diagnostic info if we got an error and have a valid handle + if (!SQL_SUCCEEDED(retcode)) { + LOG("Error occurred!!!!!, retcode - {}", retcode); + if (!SQLGetDiagRec_ptr) { + try { + LoadDriverOrThrowException(); + } catch (const std::exception& e) { + LOG("Failed to load driver for error check: {}", e.what()); + errorInfo.ddbcErrorMsg = L"Driver error: Could not load ODBC driver"; + return errorInfo; + } + } + + try { + LOG("Getting diagnostic information for handle type - {}", handleType); +#if defined(__APPLE__) + // macOS: Use enhanced error collection with mac_buffers + if (!SQLGetDiagRec_ptr) { + try { + LoadDriverOrThrowException(); + } catch (const std::exception& e) { + LOG("Failed to load driver for error check: {}", e.what()); + errorInfo.ddbcErrorMsg = L"Driver error: Could not load ODBC driver"; + return errorInfo; + } + } + + // Use our enhanced DiagnosticRecords to collect all errors + mac_buffers::DiagnosticRecords diagnostics; + int recordNum = 1; + + while (true) { + // Create buffers for error information + mac_buffers::SQLWCHARBuffer sqlState(6); + mac_buffers::SQLWCHARBuffer message(SQL_MAX_MESSAGE_LENGTH); + SQLINTEGER nativeError = 0; + SQLSMALLINT messageLen = 0; + + // Get the diagnostic record (similar to Python PoC _check_ret) + SQLRETURN diagReturn = SQLGetDiagRec_ptr( + handleType, + reinterpret_cast(handle), + recordNum, + sqlState.data(), + &nativeError, + message.data(), + message.size(), + &messageLen + ); + + LOG("Diagnostic record {} retrieval result: {}", recordNum, diagReturn); + + if (diagReturn == SQL_NO_DATA) { + // No more diagnostic records - similar to Python PoC + if (!diagnostics.empty()) { + // We have collected errors, return them + errorInfo.sqlState = diagnostics.getSQLState(); + errorInfo.ddbcErrorMsg = diagnostics.getFullErrorMessage(); + return errorInfo; + } + break; + } else if (diagReturn == SQL_INVALID_HANDLE) { + errorInfo.ddbcErrorMsg = L"SQL_INVALID_HANDLE"; + return errorInfo; + } else if (diagReturn == SQL_ERROR) { + errorInfo.ddbcErrorMsg = L"SQL_ERROR"; + return errorInfo; + } else if (SQL_SUCCEEDED(diagReturn)) { + // Successfully retrieved a diagnostic record + std::wstring stateStr = sqlState.toString(); + std::wstring msgStr = message.toString(messageLen); + + // Add to our collection of errors (similar to err_list.append in Python PoC) + diagnostics.addRecord(stateStr, msgStr, nativeError); + + // Continue to the next record + recordNum++; + } else { + break; + } + } + + // Process collected errors + if (!diagnostics.empty()) { + // Use the DiagnosticRecords utility to format error messages + errorInfo.sqlState = diagnostics.getSQLState(); + errorInfo.ddbcErrorMsg = diagnostics.getFullErrorMessage(); + } else { + // No diagnostic records found + errorInfo.ddbcErrorMsg = L"No diagnostic information available"; + } +#else + // Windows/other platforms: Use the first diagnostic record only + SQLRETURN diagReturn = + SQLGetDiagRec_ptr(handleType, reinterpret_cast(handle), 1, sqlState, + &nativeError, message, SQL_MAX_MESSAGE_LENGTH, &messageLen); + LOG("Diagnostic information retrieved, diagReturn - {}", diagReturn); + if (SQL_SUCCEEDED(diagReturn)) { + // Process diagnostic information + errorInfo.sqlState = std::wstring(sqlState); + errorInfo.ddbcErrorMsg = std::wstring(message); + } else { + // Failed to get diagnostic info, provide a generic error + LOG("Failed to get diagnostic information, diagReturn = {}", diagReturn); + errorInfo.ddbcErrorMsg = L"Failed to retrieve error information"; + } +#endif + } catch (const std::exception& e) { + // Handle exceptions during diagnostic retrieval + LOG("Exception during error diagnostics: {}", e.what()); + errorInfo.ddbcErrorMsg = L"Exception during error diagnostics"; + } + } + + // If we have no error message but there was an error, provide a generic one + if (errorInfo.ddbcErrorMsg.empty() && !SQL_SUCCEEDED(retcode)) { + errorInfo.ddbcErrorMsg = L"Unknown error occurred"; + } + + return errorInfo; +} + +// Wrap SQLDriverConnect +SQLRETURN SQLDriverConnect_wrap(intptr_t ConnectionHandle, intptr_t WindowHandle, + const std::wstring& ConnectionString) { + LOG("Driver Connect to MSSQL"); + if (!SQLDriverConnect_ptr) { + LoadDriverOrThrowException(); + } + // LOG("DECLARE SQLDriverConnect_ptr - {}"); + SQLWCHAR* connStrPtr; +#if defined(__APPLE__) // macOS specific code + LOG("Creating connection string buffer for macOS"); + std::vector connStrBuffer = WStringToSQLWCHAR(ConnectionString); + // Ensure the buffer is null-terminated + LOG("Connection string buffer size - {}", connStrBuffer.size()); + connStrPtr = connStrBuffer.data(); + LOG("Connection string buffer created"); +#else + connStrPtr = const_cast(ConnectionString.c_str()); +#endif + + // Log the actual connection string, not the pointer value + LOG("Connection string - {}", ConnectionString); + + return SQLDriverConnect_ptr(reinterpret_cast(ConnectionHandle), + reinterpret_cast(WindowHandle), + connStrPtr, SQL_NTS, nullptr, + 0, nullptr, SQL_DRIVER_NOPROMPT); +} + +// Wrap SQLExecDirect +SQLRETURN SQLExecDirect_wrap(intptr_t StatementHandle, const std::wstring& Query) { LOG("Execute SQL query directly - {}", Query.c_str()); + if (!SQLExecDirect_ptr) { + LoadDriverOrThrowException(); + } + + SQLWCHAR* queryPtr; +#if defined(__APPLE__) + std::vector queryBuffer = WStringToSQLWCHAR(Query); + queryPtr = queryBuffer.data(); +#else + queryPtr = const_cast(Query.c_str()); +#endif + + return SQLExecDirect_ptr(reinterpret_cast(StatementHandle), queryPtr, SQL_NTS); +} + +// Executes the provided query. If the query is parametrized, it prepares the statement and +// binds the parameters. Otherwise, it executes the query directly. +// 'usePrepare' parameter can be used to disable the prepare step for queries that might already +// be prepared in a previous call. +SQLRETURN SQLExecute_wrap(const intptr_t statementHandle, + const std::wstring& query /* TODO: Use SQLTCHAR? */, + const py::list& params, const std::vector& paramInfos, + py::list& isStmtPrepared, const bool usePrepare = true) { + LOG("Execute SQL Query - {}", query.c_str()); + if (!SQLPrepare_ptr) { + LoadDriverOrThrowException(); + } + assert(SQLPrepare_ptr && SQLBindParameter_ptr && SQLExecute_ptr && SQLExecDirect_ptr); + + if (params.size() != paramInfos.size()) { + // TODO: This should be a special internal exception, that python wont relay to users as is + ThrowStdException("Number of parameters and paramInfos do not match"); + } RETCODE rc; + SQLHANDLE hStmt = reinterpret_cast(statementHandle); + SQLWCHAR* queryPtr; +#if defined(__APPLE__) + std::vector queryBuffer = WStringToSQLWCHAR(query); + queryPtr = queryBuffer.data(); +#else + queryPtr = const_cast(query.c_str()); +#endif + + if (params.size() == 0) { + // Execute statement directly if the statement is not parametrized. This is the + // fastest way to submit a SQL statement for one-time execution according to + // DDBC documentation - + // https://learn.microsoft.com/en-us/sql/odbc/reference/syntax/sqlexecdirect-function?view=sql-server-ver16 + rc = SQLExecDirect_ptr(hStmt, queryPtr, SQL_NTS); + if (!SQL_SUCCEEDED(rc) && rc != SQL_NO_DATA) { + LOG("Error during direct execution of the statement"); + } + return rc; + } else { + // isStmtPrepared is a list instead of a bool coz bools in Python are immutable. + // Hence, we can't pass around bools by reference & modify them. Therefore, isStmtPrepared + // must be a list with exactly one bool element + assert(isStmtPrepared.size() == 1); + if (usePrepare) { + rc = SQLPrepare_ptr(hStmt, queryPtr, SQL_NTS); + if (!SQL_SUCCEEDED(rc)) { + LOG("Error while preparing the statement"); + return rc; + } + isStmtPrepared[0] = py::cast(true); + } else { + // Make sure the statement has been prepared earlier if we're not preparing now + bool isStmtPreparedAsBool = isStmtPrepared[0].cast(); + if (!isStmtPreparedAsBool) { + // TODO: Print the query + ThrowStdException("Cannot execute unprepared statement"); + } + } + + // This vector manages the heap memory allocated for parameter buffers. + // It must be in scope until SQLExecute is done. + std::vector> paramBuffers; + rc = BindParameters(hStmt, params, paramInfos, paramBuffers); + if (!SQL_SUCCEEDED(rc)) { + return rc; + } + + LOG("Executing the statement with bound parameters"); + rc = SQLExecute_ptr(hStmt); + LOG("SQLExecute return code - {}", rc); + if (!SQL_SUCCEEDED(rc) && rc != SQL_NO_DATA) { + LOG("DDBCSQLExecute: Error during execution of the statement"); + return rc; + } + // TODO: Handle huge input parameters by checking rc == SQL_NEED_DATA + + // Unbind the bound buffers for all parameters coz the buffers' memory will + // be freed when this function exits (parambuffers goes out of scope) + LOG("Unbinding the parameters after execution"); + rc = SQLFreeStmt_ptr(hStmt, SQL_RESET_PARAMS); + LOG("SQLFreeStmt return code - {}", rc); + + return rc; + } +} + +// Wrap SQLNumResultCols +SQLSMALLINT SQLNumResultCols_wrap(intptr_t statementHandle) { + LOG("Get number of columns in result set"); + if (!SQLNumResultCols_ptr) { + LoadDriverOrThrowException(); + } + + SQLSMALLINT columnCount; + // TODO: Handle the return code + SQLNumResultCols_ptr(reinterpret_cast(statementHandle), &columnCount); + return columnCount; +} + +// Wrap SQLDescribeCol +SQLRETURN SQLDescribeCol_wrap(intptr_t StatementHandle, py::list& ColumnMetadata) { + LOG("Get column description"); + if (!SQLDescribeCol_ptr) { + LoadDriverOrThrowException(); + } + + SQLSMALLINT ColumnCount; + SQLRETURN retcode = + SQLNumResultCols_ptr(reinterpret_cast(StatementHandle), &ColumnCount); + if (!SQL_SUCCEEDED(retcode)) { + LOG("Failed to get number of columns"); + return retcode; + } + + for (SQLUSMALLINT i = 1; i <= ColumnCount; ++i) { + SQLWCHAR ColumnName[256]; + SQLSMALLINT NameLength; + SQLSMALLINT DataType; + SQLULEN ColumnSize; + SQLSMALLINT DecimalDigits; + SQLSMALLINT Nullable; + + retcode = SQLDescribeCol_ptr(reinterpret_cast(StatementHandle), i, ColumnName, + sizeof(ColumnName) / sizeof(SQLWCHAR), &NameLength, &DataType, + &ColumnSize, &DecimalDigits, &Nullable); + + if (SQL_SUCCEEDED(retcode)) { + // Append a named py::dict to ColumnMetadata + // TODO: Should we define a struct for this task instead of dict? +#if defined(__APPLE__) + ColumnMetadata.append(py::dict("ColumnName"_a = SQLWCHARToWString(ColumnName), +#else + ColumnMetadata.append(py::dict("ColumnName"_a = std::wstring(ColumnName), +#endif + "DataType"_a = DataType, "ColumnSize"_a = ColumnSize, + "DecimalDigits"_a = DecimalDigits, + "Nullable"_a = Nullable)); + } else { + return retcode; + } + } + return SQL_SUCCESS; +} + +// Wrap SQLFetch to retrieve rows +SQLRETURN SQLFetch_wrap(intptr_t StatementHandle) { + LOG("Fetch next row"); + if (!SQLFetch_ptr) { + LoadDriverOrThrowException(); + } + + return SQLFetch_ptr(reinterpret_cast(StatementHandle)); +} + +// Helper function to retrieve column data +// TODO: Handle variable length data correctly +SQLRETURN SQLGetData_wrap(intptr_t StatementHandle, SQLUSMALLINT colCount, py::list& row) { + LOG("Get data from columns"); + if (!SQLGetData_ptr) { + LoadDriverOrThrowException(); + } + + SQLRETURN ret; + SQLHSTMT hStmt = reinterpret_cast(StatementHandle); + for (SQLSMALLINT i = 1; i <= colCount; ++i) { + SQLWCHAR columnName[256]; + SQLSMALLINT columnNameLen; + SQLSMALLINT dataType; + SQLULEN columnSize; + SQLSMALLINT decimalDigits; + SQLSMALLINT nullable; + + ret = SQLDescribeCol_ptr(hStmt, i, columnName, sizeof(columnName) / sizeof(SQLWCHAR), + &columnNameLen, &dataType, &columnSize, &decimalDigits, &nullable); + if (!SQL_SUCCEEDED(ret)) { + LOG("Error retrieving data for column - {}, SQLDescribeCol return code - {}", i, ret); + row.append(py::none()); + // TODO: Do we want to continue in this case or return? + continue; + } + + switch (dataType) { + case SQL_CHAR: + case SQL_VARCHAR: + case SQL_LONGVARCHAR: { + // TODO: revisit + HandleZeroColumnSizeAtFetch(columnSize); + uint64_t fetchBufferSize = columnSize + 1 /* null-termination */; + std::vector dataBuffer(fetchBufferSize); + SQLLEN dataLen; + // TODO: Handle the return code better + ret = SQLGetData_ptr(hStmt, i, SQL_C_CHAR, dataBuffer.data(), dataBuffer.size(), + &dataLen); + + if (SQL_SUCCEEDED(ret)) { + // TODO: Refactor these if's across other switches to avoid code duplication + // columnSize is in chars, dataLen is in bytes + if (dataLen > 0) { + uint64_t numCharsInData = dataLen / sizeof(SQLCHAR); + // NOTE: dataBuffer.size() includes null-terminator, dataLen doesn't. Hence use '<'. + if (numCharsInData < dataBuffer.size()) { + // SQLGetData will null-terminate the data +#if defined(__APPLE__) + std::string fullStr(reinterpret_cast(dataBuffer.data())); + row.append(fullStr); + LOG("macOS: Appended CHAR string of length {} to result row", fullStr.length()); +#else + row.append(std::string(reinterpret_cast(dataBuffer.data()))); +#endif + } else { + // In this case, buffer size is smaller, and data to be retrieved is longer + // TODO: Revisit + std::ostringstream oss; + oss << "Buffer length for fetch (" << dataBuffer.size()-1 << ") is smaller, & data " + << "to be retrieved is longer (" << numCharsInData << "). ColumnID - " + << i << ", datatype - " << dataType; + ThrowStdException(oss.str()); + } + } else if (dataLen == SQL_NULL_DATA) { + row.append(py::none()); + } else { + assert(dataLen == SQL_NO_TOTAL); + LOG("SQLGetData couldn't determine the length of the data. " + "Returning NULL value instead. Column ID - {}", i); + row.append(py::none()); + } + } else { + LOG("Error retrieving data for column - {}, data type - {}, SQLGetData return " + "code - {}. Returning NULL value instead", + i, dataType, ret); + row.append(py::none()); + } + break; + } + case SQL_WCHAR: + case SQL_WVARCHAR: + case SQL_WLONGVARCHAR: { + // TODO: revisit + HandleZeroColumnSizeAtFetch(columnSize); + uint64_t fetchBufferSize = columnSize + 1 /* null-termination */; + std::vector dataBuffer(fetchBufferSize); + SQLLEN dataLen; + ret = SQLGetData_ptr(hStmt, i, SQL_C_WCHAR, dataBuffer.data(), + dataBuffer.size() * sizeof(SQLWCHAR), &dataLen); + + if (SQL_SUCCEEDED(ret)) { + // TODO: Refactor these if's across other switches to avoid code duplication + if (dataLen > 0) { + uint64_t numCharsInData = dataLen / sizeof(SQLWCHAR); if (numCharsInData < dataBuffer.size()) { + // SQLGetData will null-terminate the data +#if defined(__APPLE__) + row.append(SQLWCHARToWString(dataBuffer.data())); +#else + row.append(std::wstring(dataBuffer.data())); +#endif + } else { + // In this case, buffer size is smaller, and data to be retrieved is longer + // TODO: Revisit + std::ostringstream oss; + oss << "Buffer length for fetch (" << dataBuffer.size()-1 << ") is smaller, & data " + << "to be retrieved is longer (" << numCharsInData << "). ColumnID - " + << i << ", datatype - " << dataType; + ThrowStdException(oss.str()); + } + } else if (dataLen == SQL_NULL_DATA) { + row.append(py::none()); + } else { + assert(dataLen == SQL_NO_TOTAL); + LOG("SQLGetData couldn't determine the length of the data. " + "Returning NULL value instead. Column ID - {}", i); + row.append(py::none()); + } + } else { + LOG("Error retrieving data for column - {}, data type - {}, SQLGetData return " + "code - {}. Returning NULL value instead", + i, dataType, ret); + row.append(py::none()); + } + break; + } + case SQL_INTEGER: { + SQLINTEGER intValue; + ret = SQLGetData_ptr(hStmt, i, SQL_C_LONG, &intValue, 0, NULL); + if (SQL_SUCCEEDED(ret)) { + row.append(static_cast(intValue)); + } else { + row.append(py::none()); + } + break; + } + case SQL_SMALLINT: { + SQLSMALLINT smallIntValue; + ret = SQLGetData_ptr(hStmt, i, SQL_C_SHORT, &smallIntValue, 0, NULL); + if (SQL_SUCCEEDED(ret)) { + row.append(static_cast(smallIntValue)); + } else { + LOG("Error retrieving data for column - {}, data type - {}, SQLGetData return " + "code - {}. Returning NULL value instead", + i, dataType, ret); + row.append(py::none()); + } + break; + } + case SQL_REAL: { + SQLREAL realValue; + ret = SQLGetData_ptr(hStmt, i, SQL_C_FLOAT, &realValue, 0, NULL); + if (SQL_SUCCEEDED(ret)) { + row.append(realValue); + } else { + LOG("Error retrieving data for column - {}, data type - {}, SQLGetData return " + "code - {}. Returning NULL value instead", + i, dataType, ret); + row.append(py::none()); + } + break; + } + case SQL_DECIMAL: + case SQL_NUMERIC: { + SQLCHAR numericStr[MAX_DIGITS_IN_NUMERIC] = {0}; + SQLLEN indicator; + ret = SQLGetData_ptr(hStmt, i, SQL_C_CHAR, numericStr, sizeof(numericStr), &indicator); + + if (SQL_SUCCEEDED(ret)) { + try{ + // Convert numericStr to py::decimal.Decimal and append to row + row.append(py::module_::import("decimal").attr("Decimal")( + std::string(reinterpret_cast(numericStr), indicator))); + } catch (const py::error_already_set& e) { + // If the conversion fails, append None + LOG("Error converting to decimal: {}", e.what()); + row.append(py::none()); + } + } + else { + LOG("Error retrieving data for column - {}, data type - {}, SQLGetData return " + "code - {}. Returning NULL value instead", + i, dataType, ret); + row.append(py::none()); + } + break; + } + case SQL_DOUBLE: + case SQL_FLOAT: { + SQLDOUBLE doubleValue; + ret = SQLGetData_ptr(hStmt, i, SQL_C_DOUBLE, &doubleValue, 0, NULL); + if (SQL_SUCCEEDED(ret)) { + row.append(doubleValue); + } else { + LOG("Error retrieving data for column - {}, data type - {}, SQLGetData return " + "code - {}. Returning NULL value instead", + i, dataType, ret); + row.append(py::none()); + } + break; + } + case SQL_BIGINT: { + SQLBIGINT bigintValue; + ret = SQLGetData_ptr(hStmt, i, SQL_C_SBIGINT, &bigintValue, 0, NULL); + if (SQL_SUCCEEDED(ret)) { + row.append(static_cast(bigintValue)); + } else { + LOG("Error retrieving data for column - {}, data type - {}, SQLGetData return " + "code - {}. Returning NULL value instead", + i, dataType, ret); + row.append(py::none()); + } + break; + } + case SQL_TYPE_DATE: { + SQL_DATE_STRUCT dateValue; + ret = + SQLGetData_ptr(hStmt, i, SQL_C_TYPE_DATE, &dateValue, sizeof(dateValue), NULL); + if (SQL_SUCCEEDED(ret)) { + row.append( + py::module_::import("datetime").attr("date")( + dateValue.year, + dateValue.month, + dateValue.day + ) + ); + } else { + LOG("Error retrieving data for column - {}, data type - {}, SQLGetData return " + "code - {}. Returning NULL value instead", + i, dataType, ret); + row.append(py::none()); + } + break; + } + case SQL_TIME: + case SQL_TYPE_TIME: + case SQL_SS_TIME2: { + SQL_TIME_STRUCT timeValue; + ret = + SQLGetData_ptr(hStmt, i, SQL_C_TYPE_TIME, &timeValue, sizeof(timeValue), NULL); + if (SQL_SUCCEEDED(ret)) { + row.append( + py::module_::import("datetime").attr("time")( + timeValue.hour, + timeValue.minute, + timeValue.second + ) + ); + } else { + LOG("Error retrieving data for column - {}, data type - {}, SQLGetData return " + "code - {}. Returning NULL value instead", + i, dataType, ret); + row.append(py::none()); + } + break; + } + case SQL_TIMESTAMP: + case SQL_TYPE_TIMESTAMP: + case SQL_DATETIME: { + SQL_TIMESTAMP_STRUCT timestampValue; + ret = SQLGetData_ptr(hStmt, i, SQL_C_TYPE_TIMESTAMP, ×tampValue, + sizeof(timestampValue), NULL); + if (SQL_SUCCEEDED(ret)) { + row.append( + py::module_::import("datetime").attr("datetime")( + timestampValue.year, + timestampValue.month, + timestampValue.day, + timestampValue.hour, + timestampValue.minute, + timestampValue.second, + timestampValue.fraction / 1000 // Convert back ns to µs + ) + ); + } else { + LOG("Error retrieving data for column - {}, data type - {}, SQLGetData return " + "code - {}. Returning NULL value instead", + i, dataType, ret); + row.append(py::none()); + } + break; + } + case SQL_BINARY: + case SQL_VARBINARY: + case SQL_LONGVARBINARY: { + // TODO: revisit + HandleZeroColumnSizeAtFetch(columnSize); + std::unique_ptr dataBuffer(new SQLCHAR[columnSize]); + SQLLEN dataLen; + ret = SQLGetData_ptr(hStmt, i, SQL_C_BINARY, dataBuffer.get(), columnSize, &dataLen); + + if (SQL_SUCCEEDED(ret)) { + // TODO: Refactor these if's across other switches to avoid code duplication + if (dataLen > 0) { + if (dataLen <= columnSize) { + row.append(py::bytes(reinterpret_cast( + dataBuffer.get()), dataLen)); + } else { + // In this case, buffer size is smaller, and data to be retrieved is longer + // TODO: Revisit + std::ostringstream oss; + oss << "Buffer length for fetch (" << columnSize << ") is smaller, & data " + << "to be retrieved is longer (" << dataLen << "). ColumnID - " + << i << ", datatype - " << dataType; + ThrowStdException(oss.str()); + } + } else if (dataLen == SQL_NULL_DATA) { + row.append(py::none()); + } else { + assert(dataLen == SQL_NO_TOTAL); + LOG("SQLGetData couldn't determine the length of the data. " + "Returning NULL value instead. Column ID - {}", i); + row.append(py::none()); + } + } else { + LOG("Error retrieving data for column - {}, data type - {}, SQLGetData return " + "code - {}. Returning NULL value instead", + i, dataType, ret); + row.append(py::none()); + } + break; + } + case SQL_TINYINT: { + SQLCHAR tinyIntValue; + ret = SQLGetData_ptr(hStmt, i, SQL_C_TINYINT, &tinyIntValue, 0, NULL); + if (SQL_SUCCEEDED(ret)) { + row.append(static_cast(tinyIntValue)); + } else { + LOG("Error retrieving data for column - {}, data type - {}, SQLGetData return " + "code - {}. Returning NULL value instead", + i, dataType, ret); + row.append(py::none()); + } + break; + } + case SQL_BIT: { + SQLCHAR bitValue; + ret = SQLGetData_ptr(hStmt, i, SQL_C_BIT, &bitValue, 0, NULL); + if (SQL_SUCCEEDED(ret)) { + row.append(static_cast(bitValue)); + } else { + LOG("Error retrieving data for column - {}, data type - {}, SQLGetData return " + "code - {}. Returning NULL value instead", + i, dataType, ret); + row.append(py::none()); + } + break; + } +#if (ODBCVER >= 0x0350) + case SQL_GUID: { + SQLGUID guidValue; + ret = SQLGetData_ptr(hStmt, i, SQL_C_GUID, &guidValue, sizeof(guidValue), NULL); + if (SQL_SUCCEEDED(ret)) { + std::ostringstream oss; + oss << std::hex << std::setfill('0') << std::setw(8) << guidValue.Data1 << '-' + << std::setw(4) << guidValue.Data2 << '-' << std::setw(4) << guidValue.Data3 + << '-' << std::setw(2) << static_cast(guidValue.Data4[0]) + << std::setw(2) << static_cast(guidValue.Data4[1]) << '-' << std::hex + << std::setw(2) << static_cast(guidValue.Data4[2]) << std::setw(2) + << static_cast(guidValue.Data4[3]) << std::setw(2) + << static_cast(guidValue.Data4[4]) << std::setw(2) + << static_cast(guidValue.Data4[5]) << std::setw(2) + << static_cast(guidValue.Data4[6]) << std::setw(2) + << static_cast(guidValue.Data4[7]); + row.append(oss.str()); // Append GUID as a string + } else { + LOG("Error retrieving data for column - {}, data type - {}, SQLGetData return " + "code - {}. Returning NULL value instead", + i, dataType, ret); + row.append(py::none()); + } + break; + } +#endif + default: + std::ostringstream errorString; + errorString << "Unsupported data type for column - " << columnName << ", Type - " + << dataType << ", column ID - " << i; + LOG(errorString.str()); + ThrowStdException(errorString.str()); + break; + } + } + return ret; +} + +// For column in the result set, binds a buffer to retrieve column data +// TODO: Move to anonymous namespace, since it is not used outside this file +SQLRETURN SQLBindColums(SQLHSTMT hStmt, ColumnBuffers& buffers, py::list& columnNames, + SQLUSMALLINT numCols, int fetchSize) { + SQLRETURN ret = SQL_SUCCESS; + // Bind columns based on their data types + for (SQLUSMALLINT col = 1; col <= numCols; col++) { + auto columnMeta = columnNames[col - 1].cast(); + SQLSMALLINT dataType = columnMeta["DataType"].cast(); + SQLULEN columnSize = columnMeta["ColumnSize"].cast(); + + switch (dataType) { + case SQL_CHAR: + case SQL_VARCHAR: + case SQL_LONGVARCHAR: { + // TODO: handle variable length data correctly. This logic wont suffice + HandleZeroColumnSizeAtFetch(columnSize); + uint64_t fetchBufferSize = columnSize + 1 /*null-terminator*/; + // TODO: For LONGVARCHAR/BINARY types, columnSize is returned as 2GB-1 by + // SQLDescribeCol. So fetchBufferSize = 2GB. fetchSize=1 if columnSize>1GB. + // So we'll allocate a vector of size 2GB. If a query fetches multiple (say N) + // LONG... columns, we will have allocated multiple (N) 2GB sized vectors. This + // will make driver very slow. And if the N is high enough, we could hit the OS + // limit for heap memory that we can allocate, & hence get a std::bad_alloc. The + // process could also be killed by OS for consuming too much memory. + // Hence this will be revisited in beta to not allocate 2GB+ memory, + // & use streaming instead + buffers.charBuffers[col - 1].resize(fetchSize * fetchBufferSize); + ret = SQLBindCol_ptr(hStmt, col, SQL_C_CHAR, buffers.charBuffers[col - 1].data(), + fetchBufferSize * sizeof(SQLCHAR), + buffers.indicators[col - 1].data()); + break; + } + case SQL_WCHAR: + case SQL_WVARCHAR: + case SQL_WLONGVARCHAR: { + // TODO: handle variable length data correctly. This logic wont suffice + HandleZeroColumnSizeAtFetch(columnSize); + uint64_t fetchBufferSize = columnSize + 1 /*null-terminator*/; + buffers.wcharBuffers[col - 1].resize(fetchSize * fetchBufferSize); + ret = SQLBindCol_ptr(hStmt, col, SQL_C_WCHAR, buffers.wcharBuffers[col - 1].data(), + fetchBufferSize * sizeof(SQLWCHAR), + buffers.indicators[col - 1].data()); + break; + } + case SQL_INTEGER: + buffers.intBuffers[col - 1].resize(fetchSize); + ret = SQLBindCol_ptr(hStmt, col, SQL_C_SLONG, buffers.intBuffers[col - 1].data(), + sizeof(SQLINTEGER), buffers.indicators[col - 1].data()); + break; + case SQL_SMALLINT: + buffers.smallIntBuffers[col - 1].resize(fetchSize); + ret = SQLBindCol_ptr(hStmt, col, SQL_C_SSHORT, + buffers.smallIntBuffers[col - 1].data(), sizeof(SQLSMALLINT), + buffers.indicators[col - 1].data()); + break; + case SQL_TINYINT: + buffers.charBuffers[col - 1].resize(fetchSize); + ret = SQLBindCol_ptr(hStmt, col, SQL_C_TINYINT, buffers.charBuffers[col - 1].data(), + sizeof(SQLCHAR), buffers.indicators[col - 1].data()); + break; + case SQL_BIT: + buffers.charBuffers[col - 1].resize(fetchSize); + ret = SQLBindCol_ptr(hStmt, col, SQL_C_BIT, buffers.charBuffers[col - 1].data(), + sizeof(SQLCHAR), buffers.indicators[col - 1].data()); + break; + case SQL_REAL: + buffers.realBuffers[col - 1].resize(fetchSize); + ret = SQLBindCol_ptr(hStmt, col, SQL_C_FLOAT, buffers.realBuffers[col - 1].data(), + sizeof(SQLREAL), buffers.indicators[col - 1].data()); + break; + case SQL_DECIMAL: + case SQL_NUMERIC: + buffers.charBuffers[col - 1].resize(fetchSize * MAX_DIGITS_IN_NUMERIC); + ret = SQLBindCol_ptr(hStmt, col, SQL_C_CHAR, buffers.charBuffers[col - 1].data(), + MAX_DIGITS_IN_NUMERIC * sizeof(SQLCHAR), + buffers.indicators[col - 1].data()); + break; + case SQL_DOUBLE: + case SQL_FLOAT: + buffers.doubleBuffers[col - 1].resize(fetchSize); + ret = + SQLBindCol_ptr(hStmt, col, SQL_C_DOUBLE, buffers.doubleBuffers[col - 1].data(), + sizeof(SQLDOUBLE), buffers.indicators[col - 1].data()); + break; + case SQL_TIMESTAMP: + case SQL_TYPE_TIMESTAMP: + case SQL_DATETIME: + buffers.timestampBuffers[col - 1].resize(fetchSize); + ret = SQLBindCol_ptr( + hStmt, col, SQL_C_TYPE_TIMESTAMP, buffers.timestampBuffers[col - 1].data(), + sizeof(SQL_TIMESTAMP_STRUCT), buffers.indicators[col - 1].data()); + break; + case SQL_BIGINT: + buffers.bigIntBuffers[col - 1].resize(fetchSize); + ret = + SQLBindCol_ptr(hStmt, col, SQL_C_SBIGINT, buffers.bigIntBuffers[col - 1].data(), + sizeof(SQLBIGINT), buffers.indicators[col - 1].data()); + break; + case SQL_TYPE_DATE: + buffers.dateBuffers[col - 1].resize(fetchSize); + ret = + SQLBindCol_ptr(hStmt, col, SQL_C_TYPE_DATE, buffers.dateBuffers[col - 1].data(), + sizeof(SQL_DATE_STRUCT), buffers.indicators[col - 1].data()); + break; + case SQL_TIME: + case SQL_TYPE_TIME: + case SQL_SS_TIME2: + buffers.timeBuffers[col - 1].resize(fetchSize); + ret = + SQLBindCol_ptr(hStmt, col, SQL_C_TYPE_TIME, buffers.timeBuffers[col - 1].data(), + sizeof(SQL_TIME_STRUCT), buffers.indicators[col - 1].data()); + break; + case SQL_GUID: + buffers.guidBuffers[col - 1].resize(fetchSize); + ret = SQLBindCol_ptr(hStmt, col, SQL_C_GUID, buffers.guidBuffers[col - 1].data(), + sizeof(SQLGUID), buffers.indicators[col - 1].data()); + break; + case SQL_BINARY: + case SQL_VARBINARY: + case SQL_LONGVARBINARY: + // TODO: handle variable length data correctly. This logic wont suffice + HandleZeroColumnSizeAtFetch(columnSize); + buffers.charBuffers[col - 1].resize(fetchSize * columnSize); + ret = SQLBindCol_ptr(hStmt, col, SQL_C_BINARY, buffers.charBuffers[col - 1].data(), + columnSize, buffers.indicators[col - 1].data()); + break; + default: + std::wstring columnName = columnMeta["ColumnName"].cast(); + std::ostringstream errorString; + errorString << "Unsupported data type for column - " << columnName.c_str() + << ", Type - " << dataType << ", column ID - " << col; + LOG(errorString.str()); + ThrowStdException(errorString.str()); + break; + } + if (!SQL_SUCCEEDED(ret)) { + std::wstring columnName = columnMeta["ColumnName"].cast(); + std::ostringstream errorString; + errorString << "Failed to bind column - " << columnName.c_str() << ", Type - " + << dataType << ", column ID - " << col; + LOG(errorString.str()); + ThrowStdException(errorString.str()); + return ret; + } + } + return ret; +} + +// Fetch rows in batches +// TODO: Move to anonymous namespace, since it is not used outside this file +SQLRETURN FetchBatchData(SQLHSTMT hStmt, ColumnBuffers& buffers, py::list& columnNames, + py::list& rows, SQLUSMALLINT numCols, SQLULEN& numRowsFetched) { + LOG("Fetching data in batches"); + SQLRETURN ret = SQLFetchScroll_ptr(hStmt, SQL_FETCH_NEXT, 0); + if (ret == SQL_NO_DATA) { + LOG("No data to fetch"); + return ret; + } + if (!SQL_SUCCEEDED(ret)) { + LOG("Error while fetching rows in batches"); + return ret; + } + // numRowsFetched is the SQL_ATTR_ROWS_FETCHED_PTR attribute. It'll be populated by + // SQLFetchScroll + for (SQLULEN i = 0; i < numRowsFetched; i++) { + py::list row; + for (SQLUSMALLINT col = 1; col <= numCols; col++) { + auto columnMeta = columnNames[col - 1].cast(); + SQLSMALLINT dataType = columnMeta["DataType"].cast(); + SQLLEN dataLen = buffers.indicators[col - 1][i]; + + if (dataLen == SQL_NULL_DATA) { + row.append(py::none()); + continue; + } + // TODO: variable length data needs special handling, this logic wont suffice + // This value indicates that the driver cannot determine the length of the data + if (dataLen == SQL_NO_TOTAL) { + LOG("Cannot determine the length of the data. Returning NULL value instead." + "Column ID - {}", col); + row.append(py::none()); + continue; + } + assert(dataLen > 0 && "Must be > 0 since SQL_NULL_DATA & SQL_NO_DATA is already handled"); + + switch (dataType) { + case SQL_CHAR: + case SQL_VARCHAR: + case SQL_LONGVARCHAR: { + // TODO: variable length data needs special handling, this logic wont suffice + SQLULEN columnSize = columnMeta["ColumnSize"].cast(); + HandleZeroColumnSizeAtFetch(columnSize); + uint64_t fetchBufferSize = columnSize + 1 /*null-terminator*/; + uint64_t numCharsInData = dataLen / sizeof(SQLCHAR); + // fetchBufferSize includes null-terminator, numCharsInData doesn't. Hence '<' + if (numCharsInData < fetchBufferSize) { + // SQLFetch will nullterminate the data + row.append(std::string( + reinterpret_cast(&buffers.charBuffers[col - 1][i * fetchBufferSize]), + numCharsInData)); + } else { + // In this case, buffer size is smaller, and data to be retrieved is longer + // TODO: Revisit + std::ostringstream oss; + oss << "Buffer length for fetch (" << columnSize << ") is smaller, & data " + << "to be retrieved is longer (" << numCharsInData << "). ColumnID - " + << col << ", datatype - " << dataType; + ThrowStdException(oss.str()); + } + break; + } case SQL_WCHAR: + case SQL_WVARCHAR: + case SQL_WLONGVARCHAR: { + // TODO: variable length data needs special handling, this logic wont suffice + SQLULEN columnSize = columnMeta["ColumnSize"].cast(); + HandleZeroColumnSizeAtFetch(columnSize); + uint64_t fetchBufferSize = columnSize + 1 /*null-terminator*/; + uint64_t numCharsInData = dataLen / sizeof(SQLWCHAR); + // fetchBufferSize includes null-terminator, numCharsInData doesn't. Hence '<' + if (numCharsInData < fetchBufferSize) { + // SQLFetch will nullterminate the data +#if defined(__APPLE__) + // Use macOS-specific conversion to handle the wchar_t/SQLWCHAR size difference + SQLWCHAR* wcharData = &buffers.wcharBuffers[col - 1][i * fetchBufferSize]; + std::wstring wstr = SQLWCHARToWString(wcharData, numCharsInData); + row.append(wstr); +#else + // On Windows, wchar_t and SQLWCHAR are both 2 bytes, so direct cast works + row.append(std::wstring( + reinterpret_cast(&buffers.wcharBuffers[col - 1][i * fetchBufferSize]), + numCharsInData)); +#endif + } else { + // In this case, buffer size is smaller, and data to be retrieved is longer + // TODO: Revisit + std::ostringstream oss; + oss << "Buffer length for fetch (" << columnSize << ") is smaller, & data " + << "to be retrieved is longer (" << numCharsInData << "). ColumnID - " + << col << ", datatype - " << dataType; + ThrowStdException(oss.str()); + } + break; + } + case SQL_INTEGER: { + row.append(buffers.intBuffers[col - 1][i]); + break; + } + case SQL_SMALLINT: { + row.append(buffers.smallIntBuffers[col - 1][i]); + break; + } + case SQL_TINYINT: { + row.append(buffers.charBuffers[col - 1][i]); + break; + } + case SQL_BIT: { + row.append(static_cast(buffers.charBuffers[col - 1][i])); + break; + } + case SQL_REAL: { + row.append(buffers.realBuffers[col - 1][i]); + break; + } + case SQL_DECIMAL: + case SQL_NUMERIC: { + try { + // Convert numericStr to py::decimal.Decimal and append to row + row.append(py::module_::import("decimal").attr("Decimal")(std::string( + reinterpret_cast( + &buffers.charBuffers[col - 1][i * MAX_DIGITS_IN_NUMERIC]), + buffers.indicators[col - 1][i]))); + } catch (const py::error_already_set& e) { + // Handle the exception, e.g., log the error and append py::none() + LOG("Error converting to decimal: {}", e.what()); + row.append(py::none()); + } + break; + } + case SQL_DOUBLE: + case SQL_FLOAT: { + row.append(buffers.doubleBuffers[col - 1][i]); + break; + } + case SQL_TIMESTAMP: + case SQL_TYPE_TIMESTAMP: + case SQL_DATETIME: { + row.append(py::module_::import("datetime") + .attr("datetime")(buffers.timestampBuffers[col - 1][i].year, + buffers.timestampBuffers[col - 1][i].month, + buffers.timestampBuffers[col - 1][i].day, + buffers.timestampBuffers[col - 1][i].hour, + buffers.timestampBuffers[col - 1][i].minute, + buffers.timestampBuffers[col - 1][i].second, + buffers.timestampBuffers[col - 1][i].fraction / 1000 /* Convert back ns to µs */)); + break; + } + case SQL_BIGINT: { + row.append(buffers.bigIntBuffers[col - 1][i]); + break; + } + case SQL_TYPE_DATE: { + row.append(py::module_::import("datetime") + .attr("date")(buffers.dateBuffers[col - 1][i].year, + buffers.dateBuffers[col - 1][i].month, + buffers.dateBuffers[col - 1][i].day)); + break; + } + case SQL_TIME: + case SQL_TYPE_TIME: + case SQL_SS_TIME2: { + row.append(py::module_::import("datetime") + .attr("time")(buffers.timeBuffers[col - 1][i].hour, + buffers.timeBuffers[col - 1][i].minute, + buffers.timeBuffers[col - 1][i].second)); + break; + } + case SQL_GUID: { + row.append( + py::bytes(reinterpret_cast(&buffers.guidBuffers[col - 1][i]), + sizeof(SQLGUID))); + break; + } + case SQL_BINARY: + case SQL_VARBINARY: + case SQL_LONGVARBINARY: { + // TODO: variable length data needs special handling, this logic wont suffice + SQLULEN columnSize = columnMeta["ColumnSize"].cast(); + HandleZeroColumnSizeAtFetch(columnSize); + if (dataLen <= columnSize) { + row.append(py::bytes(reinterpret_cast( + &buffers.charBuffers[col - 1][i * columnSize]), + dataLen)); + } else { + // In this case, buffer size is smaller, and data to be retrieved is longer + // TODO: Revisit + std::ostringstream oss; + oss << "Buffer length for fetch (" << columnSize << ") is smaller, & data " + << "to be retrieved is longer (" << dataLen << "). ColumnID - " + << col << ", datatype - " << dataType; + ThrowStdException(oss.str()); + } + break; + } + default: { + std::wstring columnName = columnMeta["ColumnName"].cast(); + std::ostringstream errorString; + errorString << "Unsupported data type for column - " << columnName.c_str() + << ", Type - " << dataType << ", column ID - " << col; + LOG(errorString.str()); + ThrowStdException(errorString.str()); + break; + } + } + } + rows.append(row); + } + return ret; +} + +// Given a list of columns that are a part of single row in the result set, calculates +// the max size of the row +// TODO: Move to anonymous namespace, since it is not used outside this file +size_t calculateRowSize(py::list& columnNames, SQLUSMALLINT numCols) { + size_t rowSize = 0; + for (SQLUSMALLINT col = 1; col <= numCols; col++) { + auto columnMeta = columnNames[col - 1].cast(); + SQLSMALLINT dataType = columnMeta["DataType"].cast(); + SQLULEN columnSize = columnMeta["ColumnSize"].cast(); + + switch (dataType) { + case SQL_CHAR: + case SQL_VARCHAR: + case SQL_LONGVARCHAR: + rowSize += columnSize; + break; + case SQL_WCHAR: + case SQL_WVARCHAR: + case SQL_WLONGVARCHAR: + rowSize += columnSize * sizeof(SQLWCHAR); + break; + case SQL_INTEGER: + rowSize += sizeof(SQLINTEGER); + break; + case SQL_SMALLINT: + rowSize += sizeof(SQLSMALLINT); + break; + case SQL_REAL: + rowSize += sizeof(SQLREAL); + break; + case SQL_FLOAT: + rowSize += sizeof(SQLFLOAT); + break; + case SQL_DOUBLE: + rowSize += sizeof(SQLDOUBLE); + break; + case SQL_DECIMAL: + case SQL_NUMERIC: + rowSize += MAX_DIGITS_IN_NUMERIC; + break; + case SQL_TIMESTAMP: + case SQL_TYPE_TIMESTAMP: + case SQL_DATETIME: + rowSize += sizeof(SQL_TIMESTAMP_STRUCT); + break; + case SQL_BIGINT: + rowSize += sizeof(SQLBIGINT); + break; + case SQL_TYPE_DATE: + rowSize += sizeof(SQL_DATE_STRUCT); + break; + case SQL_TIME: + case SQL_TYPE_TIME: + case SQL_SS_TIME2: + rowSize += sizeof(SQL_TIME_STRUCT); + break; + case SQL_GUID: + rowSize += sizeof(SQLGUID); + break; + case SQL_TINYINT: + case SQL_BIT: + rowSize += sizeof(SQLCHAR); + break; + case SQL_BINARY: + case SQL_VARBINARY: + case SQL_LONGVARBINARY: + rowSize += columnSize; + break; + default: + std::wstring columnName = columnMeta["ColumnName"].cast(); + std::ostringstream errorString; + errorString << "Unsupported data type for column - " << columnName.c_str() + << ", Type - " << dataType << ", column ID - " << col; + LOG(errorString.str()); + ThrowStdException(errorString.str()); + break; + } + } + return rowSize; +} + +// FetchMany_wrap - Fetches multiple rows of data from the result set. +// +// @param StatementHandle: Handle to the statement from which data is to be fetched. +// @param rows: A Python list that will be populated with the fetched rows of data. +// @param fetchSize: The number of rows to fetch. Default value is 1. +// +// @return SQLRETURN: SQL_SUCCESS if data is fetched successfully, +// SQL_NO_DATA if there are no more rows to fetch, +// throws a runtime error if there is an error fetching data. +// +// This function assumes that the statement handle (hStmt) is already allocated and a query has been +// executed. It fetches the specified number of rows from the result set and populates the provided +// Python list with the row data. If there are no more rows to fetch, it returns SQL_NO_DATA. If an +// error occurs during fetching, it throws a runtime error. +SQLRETURN FetchMany_wrap(intptr_t StatementHandle, py::list& rows, int fetchSize = 1) { + SQLRETURN ret; + SQLHSTMT hStmt = reinterpret_cast(StatementHandle); + // Retrieve column count + SQLSMALLINT numCols = SQLNumResultCols_wrap(StatementHandle); + + // Retrieve column metadata + py::list columnNames; + ret = SQLDescribeCol_wrap(StatementHandle, columnNames); + if (!SQL_SUCCEEDED(ret)) { + LOG("Failed to get column descriptions"); + return ret; + } + + // Initialize column buffers + ColumnBuffers buffers(numCols, fetchSize); + + // Bind columns + ret = SQLBindColums(hStmt, buffers, columnNames, numCols, fetchSize); + if (!SQL_SUCCEEDED(ret)) { + LOG("Error when binding columns"); + return ret; + } + + SQLULEN numRowsFetched; + SQLSetStmtAttr_ptr(hStmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)fetchSize, 0); + SQLSetStmtAttr_ptr(hStmt, SQL_ATTR_ROWS_FETCHED_PTR, &numRowsFetched, 0); + + ret = FetchBatchData(hStmt, buffers, columnNames, rows, numCols, numRowsFetched); + if (!SQL_SUCCEEDED(ret) && ret != SQL_NO_DATA) { + LOG("Error when fetching data"); + return ret; + } + + return ret; +} + +// FetchAll_wrap - Fetches all rows of data from the result set. +// +// @param StatementHandle: Handle to the statement from which data is to be fetched. +// @param rows: A Python list that will be populated with the fetched rows of data. +// +// @return SQLRETURN: SQL_SUCCESS if data is fetched successfully, +// SQL_NO_DATA if there are no more rows to fetch, +// throws a runtime error if there is an error fetching data. +// +// This function assumes that the statement handle (hStmt) is already allocated and a query has been +// executed. It fetches all rows from the result set and populates the provided Python list with the +// row data. If there are no more rows to fetch, it returns SQL_NO_DATA. If an error occurs during +// fetching, it throws a runtime error. +SQLRETURN FetchAll_wrap(intptr_t StatementHandle, py::list& rows) { + SQLRETURN ret; + SQLHSTMT hStmt = reinterpret_cast(StatementHandle); + // Retrieve column count + SQLSMALLINT numCols = SQLNumResultCols_wrap(StatementHandle); + + // Retrieve column metadata + py::list columnNames; + ret = SQLDescribeCol_wrap(StatementHandle, columnNames); + if (!SQL_SUCCEEDED(ret)) { + LOG("Failed to get column descriptions"); + return ret; + } + + // Define a memory limit (1 GB) + const size_t memoryLimit = 1ULL * 1024 * 1024 * 1024; // 1 GB + size_t totalRowSize = calculateRowSize(columnNames, numCols); + + // Calculate fetch size based on the total row size and memory limit + size_t numRowsInMemLimit; + if (totalRowSize > 0) { + numRowsInMemLimit = static_cast(memoryLimit / totalRowSize); + } else { + // Handle case where totalRowSize is 0 to avoid division by zero. + // This can happen for NVARCHAR(MAX) cols. SQLDescribeCol returns 0 + // for column size of such columns. + // TODO: Find why NVARCHAR(MAX) returns columnsize 0 + // TODO: What if a row has 2 cols, an int & NVARCHAR(MAX)? + // totalRowSize will be 4+0 = 4. It wont take NVARCHAR(MAX) + // into account. So, we will end up fetching 1000 rows at a time. + numRowsInMemLimit = 1; // fetchsize will be 10 + } + // TODO: Revisit this logic. Eventhough we're fetching fetchSize rows at a time, + // fetchall will keep all rows in memory anyway. So what are we gaining by fetching + // fetchSize rows at a time? + // Also, say the table has only 10 rows, each row size if 100 bytes. Here, we'll have + // fetchSize = 1000, so we'll allocate memory for 1000 rows inside SQLBindCol_wrap, while + // actually only need to retrieve 10 rows + int fetchSize; + if (numRowsInMemLimit == 0) { + // If the row size is larger than the memory limit, fetch one row at a time + fetchSize = 1; + } else if (numRowsInMemLimit > 0 && numRowsInMemLimit <= 100) { + // If between 1-100 rows fit in memoryLimit, fetch 10 rows at a time + fetchSize = 10; + } else if (numRowsInMemLimit > 100 && numRowsInMemLimit <= 1000) { + // If between 100-1000 rows fit in memoryLimit, fetch 100 rows at a time + fetchSize = 100; + } else { + fetchSize = 1000; + } + LOG("Fetching data in batch sizes of {}", fetchSize); + + ColumnBuffers buffers(numCols, fetchSize); + + // Bind columns + ret = SQLBindColums(hStmt, buffers, columnNames, numCols, fetchSize); + if (!SQL_SUCCEEDED(ret)) { + LOG("Error when binding columns"); + return ret; + } + + SQLULEN numRowsFetched; + SQLSetStmtAttr_ptr(hStmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)fetchSize, 0); + SQLSetStmtAttr_ptr(hStmt, SQL_ATTR_ROWS_FETCHED_PTR, &numRowsFetched, 0); + + while (ret != SQL_NO_DATA) { + ret = FetchBatchData(hStmt, buffers, columnNames, rows, numCols, numRowsFetched); + if (!SQL_SUCCEEDED(ret) && ret != SQL_NO_DATA) { + LOG("Error when fetching data"); + return ret; + } + } + + return ret; +} + +// FetchOne_wrap - Fetches a single row of data from the result set. +// +// @param StatementHandle: Handle to the statement from which data is to be fetched. +// @param row: A Python list that will be populated with the fetched row data. +// +// @return SQLRETURN: SQL_SUCCESS or SQL_SUCCESS_WITH_INFO if data is fetched successfully, +// SQL_NO_DATA if there are no more rows to fetch, +// throws a runtime error if there is an error fetching data. +// +// This function assumes that the statement handle (hStmt) is already allocated and a query has been +// executed. It fetches the next row of data from the result set and populates the provided Python +// list with the row data. If there are no more rows to fetch, it returns SQL_NO_DATA. If an error +// occurs during fetching, it throws a runtime error. +SQLRETURN FetchOne_wrap(intptr_t StatementHandle, py::list& row) { + SQLRETURN ret; + SQLHSTMT hStmt = reinterpret_cast(StatementHandle); + + // Assume hStmt is already allocated and a query has been executed + ret = SQLFetch_ptr(hStmt); + if (SQL_SUCCEEDED(ret)) { + // Retrieve column count + SQLSMALLINT colCount = SQLNumResultCols_wrap(StatementHandle); + ret = SQLGetData_wrap(StatementHandle, colCount, row); + } else if (ret != SQL_NO_DATA) { + LOG("Error when fetching data"); + } + return ret; +} + +// Wrap SQLMoreResults +SQLRETURN SQLMoreResults_wrap(intptr_t StatementHandle) { + LOG("Check for more results"); + if (!SQLMoreResults_ptr) { + LoadDriverOrThrowException(); + } + + return SQLMoreResults_ptr(reinterpret_cast(StatementHandle)); +} + +// Wrap SQLEndTran +SQLRETURN SQLEndTran_wrap(SQLSMALLINT HandleType, intptr_t Handle, SQLSMALLINT CompletionType) { + LOG("End SQL Transaction"); + if (!SQLEndTran_ptr) { + LoadDriverOrThrowException(); + } + + return SQLEndTran_ptr(HandleType, reinterpret_cast(Handle), CompletionType); +} + +// Wrap SQLFreeHandle +SQLRETURN SQLFreeHandle_wrap(SQLSMALLINT HandleType, intptr_t Handle) { + LOG("Free SQL handle"); + if (!SQLAllocHandle_ptr) { + LoadDriverOrThrowException(); + } + + return SQLFreeHandle_ptr(HandleType, reinterpret_cast(Handle)); +} + +// Wrap SQLDisconnect +SQLRETURN SQLDisconnect_wrap(intptr_t ConnectionHandle) { + LOG("Disconnect from MSSQL"); + if (!SQLDisconnect_ptr) { + LoadDriverOrThrowException(); + } + + return SQLDisconnect_ptr(reinterpret_cast(ConnectionHandle)); +} + +// Wrap SQLRowCount +SQLLEN SQLRowCount_wrap(intptr_t StatementHandle) { + LOG("Get number of row affected by last execute"); + if (!SQLRowCount_ptr) { + LoadDriverOrThrowException(); + } + + SQLLEN rowCount; + SQLRETURN ret = SQLRowCount_ptr(reinterpret_cast(StatementHandle), &rowCount); + if (!SQL_SUCCEEDED(ret)) { + LOG("SQLRowCount failed with error code - {}", ret); + return ret; + } + LOG("SQLRowCount returned {}", rowCount); + return rowCount; +} + +// Functions/data to be exposed to Python as a part of ddbc_bindings module +PYBIND11_MODULE(ddbc_bindings, m) { + m.doc() = "msodbcsql driver api bindings for Python"; + + // Add architecture information as module attribute + m.attr("__architecture__") = ARCHITECTURE; + + // Expose architecture-specific constants + m.attr("ARCHITECTURE") = ARCHITECTURE; + + // Expose the C++ functions to Python + m.def("ThrowStdException", &ThrowStdException); + + // Define parameter info class + py::class_(m, "ParamInfo") + .def(py::init<>()) + .def_readwrite("inputOutputType", &ParamInfo::inputOutputType) + .def_readwrite("paramCType", &ParamInfo::paramCType) + .def_readwrite("paramSQLType", &ParamInfo::paramSQLType) + .def_readwrite("columnSize", &ParamInfo::columnSize) + .def_readwrite("decimalDigits", &ParamInfo::decimalDigits); + + // Define numeric data class + py::class_(m, "NumericData") + .def(py::init<>()) + .def(py::init()) + .def_readwrite("precision", &NumericData::precision) + .def_readwrite("scale", &NumericData::scale) + .def_readwrite("sign", &NumericData::sign) + .def_readwrite("val", &NumericData::val); + + // Define error info class + py::class_(m, "ErrorInfo") + .def_readwrite("sqlState", &ErrorInfo::sqlState) + .def_readwrite("ddbcErrorMsg", &ErrorInfo::ddbcErrorMsg); + + // Expose all the SQL functions with proper error handling + m.def("DDBCSQLAllocHandle", &SQLAllocHandle_wrap, + "Allocate an environment, connection, statement, or descriptor handle"); + m.def("DDBCSQLSetEnvAttr", &SQLSetEnvAttr_wrap, + "Set an attribute that governs aspects of environments"); + m.def("DDBCSQLSetConnectAttr", &SQLSetConnectAttr_wrap, + "Set an attribute that governs aspects of connections"); + m.def("DDBCSQLSetStmtAttr", &SQLSetStmtAttr_wrap, + "Set an attribute that governs aspects of statements"); + m.def("DDBCSQLGetConnectionAttr", &SQLGetConnectionAttr_wrap, + "Get an attribute that governs aspects of connections"); + m.def("DDBCSQLDriverConnect", &SQLDriverConnect_wrap, + "Connect to a data source with a connection string"); + m.def("DDBCSQLExecDirect", &SQLExecDirect_wrap, "Execute a SQL query directly"); + m.def("DDBCSQLExecute", &SQLExecute_wrap, "Prepare and execute T-SQL statements"); + m.def("DDBCSQLRowCount", &SQLRowCount_wrap, + "Get the number of rows affected by the last statement"); + m.def("DDBCSQLFetch", &SQLFetch_wrap, "Fetch the next row from the result set"); + m.def("DDBCSQLNumResultCols", &SQLNumResultCols_wrap, + "Get the number of columns in the result set"); + m.def("DDBCSQLDescribeCol", &SQLDescribeCol_wrap, + "Get information about a column in the result set"); + m.def("DDBCSQLGetData", &SQLGetData_wrap, "Retrieve data from the result set"); + m.def("DDBCSQLMoreResults", &SQLMoreResults_wrap, "Check for more results in the result set"); + m.def("DDBCSQLFetchOne", &FetchOne_wrap, "Fetch one row from the result set"); + m.def("DDBCSQLFetchMany", &FetchMany_wrap, py::arg("StatementHandle"), py::arg("rows"), + py::arg("fetchSize") = 1, "Fetch many rows from the result set"); + m.def("DDBCSQLFetchAll", &FetchAll_wrap, "Fetch all rows from the result set"); + m.def("DDBCSQLEndTran", &SQLEndTran_wrap, "End a transaction"); + m.def("DDBCSQLFreeHandle", &SQLFreeHandle_wrap, "Free a handle"); + m.def("DDBCSQLDisconnect", &SQLDisconnect_wrap, "Disconnect from a data source"); + m.def("DDBCSQLCheckError", &SQLCheckError_Wrap, "Check for driver errors"); + + // Add a version attribute + m.attr("__version__") = "1.0.0"; + + try { + // Try loading the ODBC driver when the module is imported + LoadDriverOrThrowException(); + } catch (const std::exception& e) { + // Log the error but don't throw - let the error happen when functions are called + LOG("Failed to load ODBC driver during module initialization: {}", e.what()); + } +} diff --git a/mssql_python/pybind/mac_buffers.h b/mssql_python/pybind/mac_buffers.h new file mode 100644 index 00000000..abd67c27 --- /dev/null +++ b/mssql_python/pybind/mac_buffers.h @@ -0,0 +1,169 @@ +/** + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT license. + * + * This file provides utilities for handling character encoding and buffer management + * specifically for macOS ODBC operations. It implements functionality similar to + * the UCS_dec function in the Python PoC. + */ + +#pragma once + +#include +#include +#include +#include +#include + +namespace mac_buffers { + +// Constants for Unicode character encoding +constexpr const char* ODBC_DECODING = "utf-16"; +constexpr size_t UCS_LENGTH = 2; + +/** + * SQLWCHARBuffer class manages buffers for SQLWCHAR data, + * handling memory allocation and conversion to std::wstring. + */ +class SQLWCHARBuffer { +private: + std::unique_ptr buffer; + size_t buffer_size; + +public: + /** + * Constructor allocates a buffer of the specified size + */ + SQLWCHARBuffer(size_t size) : buffer_size(size) { + buffer = std::make_unique(size); + // Initialize to zero + for (size_t i = 0; i < size; i++) { + buffer[i] = 0; + } + } + + /** + * Returns the data pointer for use with ODBC functions + */ + SQLWCHAR* data() { + return buffer.get(); + } + + /** + * Returns the size of the buffer + */ + size_t size() const { + return buffer_size; + } + + /** + * Converts the SQLWCHAR buffer to std::wstring + * Similar to the UCS_dec function in the Python PoC + */ + std::wstring toString(SQLSMALLINT length = -1) const { + std::wstring result; + + // If length is provided, use it + if (length > 0) { + for (SQLSMALLINT i = 0; i < length; i++) { + result.push_back(static_cast(buffer[i])); + } + return result; + } + + // Otherwise, read until null terminator + for (size_t i = 0; i < buffer_size; i++) { + if (buffer[i] == 0) { + break; + } + result.push_back(static_cast(buffer[i])); + } + + return result; + } +}; + +/** + * Class to handle diagnostic records collection + * Similar to the error list handling in the Python PoC _check_ret function + */ +class DiagnosticRecords { +private: + struct Record { + std::wstring sqlState; + std::wstring message; + SQLINTEGER nativeError; + }; + + std::vector records; + +public: + void addRecord(const std::wstring& sqlState, const std::wstring& message, SQLINTEGER nativeError) { + records.push_back({sqlState, message, nativeError}); + } + + bool empty() const { + return records.empty(); + } + + std::wstring getSQLState() const { + if (!records.empty()) { + return records[0].sqlState; + } + return L"HY000"; // General error + } + + std::wstring getFirstErrorMessage() const { + if (!records.empty()) { + return records[0].message; + } + return L"Unknown error"; + } + + std::wstring getFullErrorMessage() const { + if (records.empty()) { + return L"No error information available"; + } + + std::wstring fullMessage = records[0].message; + + // Add additional error messages if there are any + for (size_t i = 1; i < records.size(); i++) { + fullMessage += L"; [" + records[i].sqlState + L"] " + records[i].message; + } + + return fullMessage; + } + + size_t size() const { + return records.size(); + } +}; + +/** + * Function that decodes a SQLWCHAR buffer into a std::wstring + * Direct implementation of the UCS_dec logic from the Python PoC + */ +inline std::wstring UCS_dec(const SQLWCHAR* buffer, size_t maxLength = 0) { + std::wstring result; + size_t i = 0; + + while (true) { + // Break if we've reached the maximum length + if (maxLength > 0 && i >= maxLength) { + break; + } + + // Break if we've reached a null terminator + if (buffer[i] == 0) { + break; + } + + result.push_back(static_cast(buffer[i])); + i++; + } + + return result; +} + +} // namespace mac_buffers diff --git a/mssql_python/pybind/mac_fix.cpp b/mssql_python/pybind/mac_fix.cpp new file mode 100644 index 00000000..9ef65f4f --- /dev/null +++ b/mssql_python/pybind/mac_fix.cpp @@ -0,0 +1,111 @@ +// Mac OS specific fixes for the C++ code +// This file contains patches to fix issues specific to macOS + +#if defined(__APPLE__) +// Constants for character encoding +const char* kOdbcEncoding = "utf-16-le"; // ODBC uses UTF-16LE for SQLWCHAR +const size_t kUcsLength = 2; // SQLWCHAR is 2 bytes on all platforms + +// Function to convert SQLWCHAR strings to std::wstring on macOS +std::wstring SQLWCHARToWString(const SQLWCHAR* sqlwStr, size_t length = SQL_NTS) { + if (!sqlwStr) return std::wstring(); + + if (length == SQL_NTS) { + // Determine length if not provided + size_t i = 0; + while (sqlwStr[i] != 0) ++i; + length = i; + } + + // Create a UTF-16LE byte array from the SQLWCHAR array + std::vector utf16Bytes(length * kUcsLength); + for (size_t i = 0; i < length; ++i) { + // Copy each SQLWCHAR (2 bytes) to the byte array + memcpy(&utf16Bytes[i * kUcsLength], &sqlwStr[i], kUcsLength); + } + + // Convert UTF-16LE to std::wstring (UTF-32 on macOS) + try { + // Use C++11 codecvt to convert between UTF-16LE and wstring + std::wstring_convert> converter; + return converter.from_bytes(reinterpret_cast(utf16Bytes.data()), + reinterpret_cast(utf16Bytes.data() + utf16Bytes.size())); + } catch (const std::exception& e) { + // Fallback to character-by-character conversion if codecvt fails + std::wstring result; + result.reserve(length); + for (size_t i = 0; i < length; ++i) { + result.push_back(static_cast(sqlwStr[i])); + } + return result; + } +} + +// Function to convert std::wstring to SQLWCHAR array on macOS +std::vector WStringToSQLWCHAR(const std::wstring& str) { + try { + // Convert wstring (UTF-32 on macOS) to UTF-16LE bytes + std::wstring_convert> converter; + std::string utf16Bytes = converter.to_bytes(str); + + // Convert the bytes to SQLWCHAR array + std::vector result(utf16Bytes.size() / kUcsLength + 1, 0); // +1 for null terminator + for (size_t i = 0; i < utf16Bytes.size() / kUcsLength; ++i) { + memcpy(&result[i], &utf16Bytes[i * kUcsLength], kUcsLength); + } + return result; + } catch (const std::exception& e) { + // Fallback to simple casting if codecvt fails + std::vector result(str.size() + 1, 0); // +1 for null terminator + for (size_t i = 0; i < str.size(); ++i) { + result[i] = static_cast(str[i]); + } + return result; + } +} + +// This function can be used as a safe decoder for SQLWCHAR buffers +// based on your ctypes UCS_dec implementation +std::string SQLWCHARToUTF8String(const SQLWCHAR* buffer) { + if (!buffer) return ""; + + std::vector utf16Bytes; + size_t i = 0; + while (buffer[i] != 0) { + char bytes[kUcsLength]; + memcpy(bytes, &buffer[i], kUcsLength); + utf16Bytes.push_back(bytes[0]); + utf16Bytes.push_back(bytes[1]); + i++; + } + + try { + std::wstring_convert> converter; + return converter.to_bytes(reinterpret_cast(utf16Bytes.data()), + reinterpret_cast(utf16Bytes.data() + utf16Bytes.size())); + } catch (const std::exception& e) { + // Simple fallback conversion + std::string result; + for (size_t j = 0; j < i; ++j) { + if (buffer[j] < 128) { + result.push_back(static_cast(buffer[j])); + } else { + result.push_back('?'); // Placeholder for non-ASCII chars + } + } + return result; + } +} + +// Helper function to fix FetchBatchData for macOS +// This will process WCHAR data safely in SQLWCHARToUTF8String +void SafeProcessWCharData(SQLWCHAR* buffer, SQLLEN indicator, py::list& row) { + if (indicator == SQL_NULL_DATA) { + row.append(py::none()); + } else { + // Use our safe conversion function + std::string str = SQLWCHARToUTF8String(buffer); + row.append(py::str(str)); + } +} +#endif diff --git a/mssql_python/pybind/mac_fix.h b/mssql_python/pybind/mac_fix.h new file mode 100644 index 00000000..04592b04 --- /dev/null +++ b/mssql_python/pybind/mac_fix.h @@ -0,0 +1,31 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +namespace py = pybind11; + +#if defined(__APPLE__) +// Constants for character encoding +extern const char* kOdbcEncoding; // ODBC uses UTF-16LE for SQLWCHAR +extern const size_t kUcsLength; // SQLWCHAR is 2 bytes on all platforms + +// Function to convert SQLWCHAR strings to std::wstring on macOS +// Removed default argument to avoid redefinition conflict +std::wstring SQLWCHARToWString(const SQLWCHAR* sqlwStr, size_t length); + +// Function to convert std::wstring to SQLWCHAR array on macOS +std::vector WStringToSQLWCHAR(const std::wstring& str); + +// This function can be used as a safe decoder for SQLWCHAR buffers +std::string SQLWCHARToUTF8String(const SQLWCHAR* buffer); + +// Helper function to fix FetchBatchData for macOS +// This will process WCHAR data safely in SQLWCHARToUTF8String +void SafeProcessWCharData(SQLWCHAR* buffer, SQLLEN indicator, py::list& row); +#endif diff --git a/mssql_python/testing_ddbc_bindings.py b/mssql_python/testing_ddbc_bindings.py index a5aa2ae7..a8fdadf3 100644 --- a/mssql_python/testing_ddbc_bindings.py +++ b/mssql_python/testing_ddbc_bindings.py @@ -3,6 +3,7 @@ Licensed under the MIT license. This module provides functions to test DDBC bindings. """ + import ctypes import datetime import os @@ -26,13 +27,15 @@ def alloc_handle(handle_type, input_handle): """ Allocate a handle for the given handle type and input handle. """ - result_alloc, handle = ddbc_bindings.DDBCSQLAllocHandle( + handle = ctypes.c_void_p() + result_alloc = ddbc_bindings.DDBCSQLAllocHandle( handle_type, - input_handle + input_handle, + ctypes.cast(ctypes.pointer(handle), ctypes.c_void_p).value, ) if result_alloc < 0: print( - "Error:", ddbc_bindings.DDBCSQLCheckError(handle_type, handle, result_alloc) + "Error:", ddbc_bindings.DDBCSQLCheckError(handle_type, handle.value, result_alloc) ) raise RuntimeError(f"Failed to allocate handle. Error code: {result_alloc}") return handle @@ -42,10 +45,10 @@ def free_handle(handle_type, handle): """ Free the handle for the given handle type and handle. """ - result_free = ddbc_bindings.DDBCSQLFreeHandle(handle_type, handle) + result_free = ddbc_bindings.DDBCSQLFreeHandle(handle_type, handle.value) if result_free < 0: print( - "Error:", ddbc_bindings.DDBCSQLCheckError(handle_type, handle, result_free) + "Error:", ddbc_bindings.DDBCSQLCheckError(handle_type, handle.value, result_free) ) raise RuntimeError(f"Failed to free handle. Error code: {result_free}") @@ -57,12 +60,12 @@ def ddbc_sql_execute( Execute an SQL statement using DDBC bindings. """ result_execute = ddbc_bindings.DDBCSQLExecute( - stmt_handle, query, params, param_info_list, is_stmt_prepared, use_prepare + stmt_handle.value, query, params, param_info_list, is_stmt_prepared, use_prepare ) if result_execute < 0: print( "Error: ", - ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_STMT, stmt_handle, result_execute), + ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_STMT, stmt_handle.value, result_execute), ) raise RuntimeError(f"Failed to execute query. Error code: {result_execute}") return result_execute @@ -76,12 +79,12 @@ def fetch_data_onebyone(stmt_handle): ret_fetch = 1 while ret_fetch != SQL_NO_DATA: row = [] - ret_fetch = ddbc_bindings.DDBCSQLFetchOne(stmt_handle, row) + ret_fetch = ddbc_bindings.DDBCSQLFetchOne(stmt_handle.value, row) if ret_fetch < 0: print( "Error: ", ddbc_bindings.DDBCSQLCheckError( - SQL_HANDLE_STMT, stmt_handle, ret_fetch + SQL_HANDLE_STMT, stmt_handle.value, ret_fetch ), ) raise RuntimeError(f"Failed to fetch data. Error code: {ret_fetch}") @@ -97,12 +100,12 @@ def fetch_data_many(stmt_handle): rows = [] ret_fetch = 1 while ret_fetch != SQL_NO_DATA: - ret_fetch = ddbc_bindings.DDBCSQLFetchMany(stmt_handle, rows, 10) + ret_fetch = ddbc_bindings.DDBCSQLFetchMany(stmt_handle.value, rows, 10) if ret_fetch < 0: print( "Error: ", ddbc_bindings.DDBCSQLCheckError( - SQL_HANDLE_STMT, stmt_handle, ret_fetch + SQL_HANDLE_STMT, stmt_handle.value, ret_fetch ), ) raise RuntimeError(f"Failed to fetch data. Error code: {ret_fetch}") @@ -114,11 +117,11 @@ def fetch_data_all(stmt_handle): Fetch all data using DDBC bindings. """ rows = [] - ret_fetch = ddbc_bindings.DDBCSQLFetchAll(stmt_handle, rows) + ret_fetch = ddbc_bindings.DDBCSQLFetchAll(stmt_handle.value, rows) if ret_fetch != SQL_NO_DATA: print( "Error: ", - ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_STMT, stmt_handle, ret_fetch), + ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_STMT, stmt_handle.value, ret_fetch), ) raise RuntimeError(f"Failed to fetch data. Error code: {ret_fetch}") return rows @@ -129,28 +132,28 @@ def fetch_data(stmt_handle): Fetch data using DDBC bindings. """ rows = [] - column_count = ddbc_bindings.DDBCSQLNumResultCols(stmt_handle) + column_count = ddbc_bindings.DDBCSQLNumResultCols(stmt_handle.value) print("Number of columns = " + str(column_count)) while True: - result_fetch = ddbc_bindings.DDBCSQLFetch(stmt_handle) + result_fetch = ddbc_bindings.DDBCSQLFetch(stmt_handle.value) if result_fetch == SQL_NO_DATA: break if result_fetch < 0: print( "Error: ", ddbc_bindings.DDBCSQLCheckError( - SQL_HANDLE_STMT, stmt_handle, result_fetch + SQL_HANDLE_STMT, stmt_handle.value, result_fetch ), ) raise RuntimeError(f"Failed to fetch data. Error code: {result_fetch}") if column_count > 0: row = [] - result_get_data = ddbc_bindings.DDBCSQLGetData(stmt_handle, column_count, row) + result_get_data = ddbc_bindings.DDBCSQLGetData(stmt_handle.value, column_count, row) if result_get_data < 0: print( "Error: ", ddbc_bindings.DDBCSQLCheckError( - SQL_HANDLE_STMT, stmt_handle, result_get_data + SQL_HANDLE_STMT, stmt_handle.value, result_get_data ), ) raise RuntimeError(f"Failed to get data. Error code: {result_get_data}") @@ -163,11 +166,11 @@ def describe_columns(stmt_handle): Describe columns using DDBC bindings. """ column_names = [] - result_describe = ddbc_bindings.DDBCSQLDescribeCol(stmt_handle, column_names) + result_describe = ddbc_bindings.DDBCSQLDescribeCol(stmt_handle.value, column_names) if result_describe < 0: print( "Error: ", - ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_STMT, stmt_handle, result_describe), + ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_STMT, stmt_handle.value, result_describe), ) raise RuntimeError(f"Failed to describe columns. Error code: {result_describe}") return column_names @@ -177,11 +180,11 @@ def connect_to_db(dbc_handle, connection_string): """ Connect to the database using DDBC bindings. """ - result_connect = ddbc_bindings.DDBCSQLDriverConnect(dbc_handle, 0, connection_string) + result_connect = ddbc_bindings.DDBCSQLDriverConnect(dbc_handle.value, 0, connection_string) if result_connect < 0: print( "Error: ", - ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_DBC, dbc_handle, result_connect), + ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_DBC, dbc_handle.value, result_connect), ) raise RuntimeError(f"SQLDriverConnect failed. Error code: {result_connect}") @@ -345,27 +348,26 @@ def add_numeric_param(params, param_infos, param): if __name__ == "__main__": # Allocate environment handle - env_handle = alloc_handle(SQL_HANDLE_ENV, None) - + env_handle = alloc_handle(SQL_HANDLE_ENV, 0) + # Set the DDBC version environment attribute result_set_env = ddbc_bindings.DDBCSQLSetEnvAttr( - env_handle, SQL_ATTR_DDBC_VERSION, SQL_OV_DDBC3_80, 0 + env_handle.value, SQL_ATTR_DDBC_VERSION, SQL_OV_DDBC3_80, 0 ) if result_set_env < 0: print( "Error: ", - ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_ENV, env_handle, result_set_env), + ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_ENV, env_handle.value, result_set_env), ) raise RuntimeError( f"Failed to set DDBC version attribute. Error code: {result_set_env}" ) # Allocate connection handle - dbc_handle = alloc_handle(SQL_HANDLE_DBC, env_handle) + dbc_handle = alloc_handle(SQL_HANDLE_DBC, env_handle.value) # Fetch the connection string from environment variables connection_string = os.getenv("DB_CONNECTION_STRING") - if not connection_string: raise EnvironmentError( "Environment variable 'DB_CONNECTION_STRING' is not set or is empty." @@ -376,7 +378,7 @@ def add_numeric_param(params, param_infos, param): print("Connection successful!") # Allocate connection statement handle - stmt_handle = alloc_handle(SQL_HANDLE_STMT, dbc_handle) + stmt_handle = alloc_handle(SQL_HANDLE_STMT, dbc_handle.value) ParamInfo = ddbc_bindings.ParamInfo """ @@ -439,16 +441,16 @@ def add_numeric_param(params, param_infos, param): print(row) else: print("No columns to fetch data from.") - ret_fetch = ddbc_bindings.DDBCSQLMoreResults(stmt_handle) + ret_fetch = ddbc_bindings.DDBCSQLMoreResults(stmt_handle.value) # Free the statement handle free_handle(SQL_HANDLE_STMT, stmt_handle) # Disconnect from the data source - result_disconnect = ddbc_bindings.DDBCSQLDisconnect(dbc_handle) + result_disconnect = ddbc_bindings.DDBCSQLDisconnect(dbc_handle.value) if result_disconnect < 0: print( "Error: ", - ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_DBC, dbc_handle, result_disconnect), + ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_DBC, dbc_handle.value, result_disconnect), ) raise RuntimeError( f"Failed to disconnect from the data source. Error code: {result_disconnect}" diff --git a/mssql_python/type.py b/mssql_python/type.py index 85124b9b..5bc9781c 100644 --- a/mssql_python/type.py +++ b/mssql_python/type.py @@ -97,7 +97,7 @@ def TimestampFromTicks(ticks: int) -> datetime.datetime: """ Generates a timestamp object from ticks. """ - return datetime.datetime.fromtimestamp(ticks, datetime.timezone.utc) + return datetime.datetime.fromtimestamp(ticks, datetime.UTC) def Binary(string: str) -> bytes: diff --git a/setup.py b/setup.py index da2f988b..4f4a8659 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,6 @@ import sys from setuptools import setup, find_packages from setuptools.dist import Distribution -from wheel.bdist_wheel import bdist_wheel # Custom distribution to force platform-specific wheel class BinaryDistribution(Distribution): @@ -71,6 +70,25 @@ def finalize_options(self): f'mssql_python.libs.{arch}.1033', f'mssql_python.libs.{arch}.vcredist' ]) +elif sys.platform.startswith('darwin'): + # macOS platform + import platform + arch = os.environ.get('ARCHITECTURE', None) + + # Auto-detect architecture if not specified + if arch is None: + if platform.machine() == 'arm64': + arch = 'arm64' + platform_tag = 'macosx_11_0_arm64' + else: + arch = 'x64' + platform_tag = 'macosx_10_9_x86_64' + + # Add architecture-specific packages for macOS + packages.extend([ + f'mssql_python.libs.{arch}', + f'mssql_python.libs.{arch}.macos' + ]) else: platform_tag = 'any' # Fallback @@ -88,6 +106,7 @@ def finalize_options(self): # Include PYD and DLL files inside mssql_python, exclude YML files 'mssql_python': [ 'ddbc_bindings.cp*.pyd', # Include all PYD files + 'ddbc_bindings.cp*.so', # Include all SO files 'libs/*', 'libs/**/*', '*.dll' @@ -98,6 +117,7 @@ def finalize_options(self): python_requires='>=3.10', classifiers=[ 'Operating System :: Microsoft :: Windows', + 'Operating System :: MacOS', ], zip_safe=False, # Force binary distribution diff --git a/tests/conftest.py b/tests/conftest.py index 2b3ec4f3..25327664 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -9,20 +9,20 @@ import pytest import os -from mssql_python import connect, ddbc_bindings +from mssql_python import connect import time def pytest_configure(config): # Add any necessary configuration here pass -@pytest.fixture(scope='session') +@pytest.fixture(scope='module') def conn_str(): conn_str = os.getenv('DB_CONNECTION_STRING') return conn_str @pytest.fixture(scope="module") -def db_connection(conn_str): +def db_connection(conn_str): try: conn = connect(conn_str) except Exception as e: @@ -33,10 +33,8 @@ def db_connection(conn_str): else: pytest.fail(f"Database connection failed: {e}") yield conn - conn.close() @pytest.fixture(scope="module") def cursor(db_connection): cursor = db_connection.cursor() yield cursor - cursor.close() diff --git a/tests/test_003_connection.py b/tests/test_003_connection.py index bd37a468..ce31ec08 100644 --- a/tests/test_003_connection.py +++ b/tests/test_003_connection.py @@ -11,7 +11,7 @@ """ import pytest -from mssql_python import Connection, connect +from mssql_python import Connection def drop_table_if_exists(cursor, table_name): """Drop the table if it exists""" @@ -33,33 +33,7 @@ def test_connection(db_connection): def test_construct_connection_string(db_connection): # Check if the connection string is constructed correctly with kwargs - conn_str = db_connection._construct_connection_string(host="localhost", user="me", password="mypwd", database="mydb", encrypt="yes", trust_server_certificate="yes") - assert "Server=localhost;" in conn_str, "Connection string should contain 'Server=localhost;'" - assert "Uid=me;" in conn_str, "Connection string should contain 'Uid=me;'" - assert "Pwd=mypwd;" in conn_str, "Connection string should contain 'Pwd=mypwd;'" - assert "Database=mydb;" in conn_str, "Connection string should contain 'Database=mydb;'" - assert "Encrypt=yes;" in conn_str, "Connection string should contain 'Encrypt=yes;'" - assert "TrustServerCertificate=yes;" in conn_str, "Connection string should contain 'TrustServerCertificate=yes;'" - assert "APP=MSSQL-Python" in conn_str, "Connection string should contain 'APP=MSSQL-Python'" - assert "Driver={ODBC Driver 18 for SQL Server}" in conn_str, "Connection string should contain 'Driver={ODBC Driver 18 for SQL Server}'" - assert "Driver={ODBC Driver 18 for SQL Server};;APP=MSSQL-Python;Server=localhost;Uid=me;Pwd=mypwd;Database=mydb;Encrypt=yes;TrustServerCertificate=yes;" == conn_str, "Connection string is incorrect" - -def test_connection_string_with_attrs_before(db_connection): - # Check if the connection string is constructed correctly with attrs_before - conn_str = db_connection._construct_connection_string(host="localhost", user="me", password="mypwd", database="mydb", encrypt="yes", trust_server_certificate="yes", attrs_before={1256: "token"}) - assert "Server=localhost;" in conn_str, "Connection string should contain 'Server=localhost;'" - assert "Uid=me;" in conn_str, "Connection string should contain 'Uid=me;'" - assert "Pwd=mypwd;" in conn_str, "Connection string should contain 'Pwd=mypwd;'" - assert "Database=mydb;" in conn_str, "Connection string should contain 'Database=mydb;'" - assert "Encrypt=yes;" in conn_str, "Connection string should contain 'Encrypt=yes;'" - assert "TrustServerCertificate=yes;" in conn_str, "Connection string should contain 'TrustServerCertificate=yes;'" - assert "APP=MSSQL-Python" in conn_str, "Connection string should contain 'APP=MSSQL-Python'" - assert "Driver={ODBC Driver 18 for SQL Server}" in conn_str, "Connection string should contain 'Driver={ODBC Driver 18 for SQL Server}'" - assert "{1256: token}" not in conn_str, "Connection string should not contain '{1256: token}'" - -def test_connection_string_with_odbc_param(db_connection): - # Check if the connection string is constructed correctly with ODBC parameters - conn_str = db_connection._construct_connection_string(server="localhost", uid="me", pwd="mypwd", database="mydb", encrypt="yes", trust_server_certificate="yes") + conn_str = db_connection._construct_connection_string("",host="localhost", user="me", password="mypwd", database="mydb", encrypt="yes", trust_server_certificate="yes") assert "Server=localhost;" in conn_str, "Connection string should contain 'Server=localhost;'" assert "Uid=me;" in conn_str, "Connection string should contain 'Uid=me;'" assert "Pwd=mypwd;" in conn_str, "Connection string should contain 'Pwd=mypwd;'" @@ -173,8 +147,6 @@ def test_invalid_connection_string(): with pytest.raises(Exception): Connection("invalid_connection_string") -def test_connection_close(conn_str): - # Create a separate connection just for this test - temp_conn = connect(conn_str) - # Check if the database connection can be closed - temp_conn.close() +def test_connection_close(db_connection): + # Check if the database connection is closed + db_connection.close() \ No newline at end of file diff --git a/tests/test_004_cursor.py b/tests/test_004_cursor.py index 45f3663d..67c501bd 100644 --- a/tests/test_004_cursor.py +++ b/tests/test_004_cursor.py @@ -11,7 +11,6 @@ import pytest from datetime import datetime, date, time import decimal -from mssql_python import Connection # Setup test table TEST_TABLE = """ @@ -1145,13 +1144,8 @@ def test_numeric_precision_scale_negative_exponent(cursor, db_connection): cursor.execute("DROP TABLE pytest_numeric_test") db_connection.commit() -def test_close(db_connection): +def test_close(cursor): """Test closing the cursor""" - try: - cursor = db_connection.cursor() - cursor.close() - assert cursor.closed, "Cursor should be closed after calling close()" - except Exception as e: - pytest.fail(f"Cursor close test failed: {e}") - finally: - cursor = db_connection.cursor() + cursor.close() + with pytest.raises(Exception): + cursor.execute("SELECT 1") diff --git a/tests/test_005_exceptions.py b/tests/test_005_exceptions.py index 030c4f16..8757717d 100644 --- a/tests/test_005_exceptions.py +++ b/tests/test_005_exceptions.py @@ -1,5 +1,5 @@ import pytest -from mssql_python import connect, Connection +from mssql_python import connect from mssql_python.exceptions import ( Exception, Warning, @@ -71,7 +71,7 @@ def test_not_supported_error_exception(): def test_unknown_error_exception(): with pytest.raises(DatabaseError) as excinfo: raise_exception('99999', 'Unknown error') - assert str(excinfo.value) == "Driver Error: An error occurred with SQLSTATE code: 99999; DDBC Error: Unknown error" + assert str(excinfo.value) == "Driver Error: An error occurred with SQLSTATE code; DDBC Error: Unknown DDBC error: 99999" def test_syntax_error(cursor): with pytest.raises(ProgrammingError) as excinfo: @@ -83,17 +83,16 @@ def test_table_not_found_error(cursor): cursor.execute("SELECT * FROM non_existent_table") assert "Base table or view not found" in str(excinfo.value) -def test_data_truncation_error(cursor, db_connection): +def test_data_truncation_error(cursor): try: cursor.execute("CREATE TABLE pytest_test_truncation (id INT, name NVARCHAR(5))") cursor.execute("INSERT INTO pytest_test_truncation (id, name) VALUES (?, ?)", [1, 'TooLongName']) - except ProgrammingError as excinfo: + except DataError as excinfo: assert "String or binary data would be truncated" in str(excinfo) finally: drop_table_if_exists(cursor, "pytest_test_truncation") - db_connection.commit() -def test_unique_constraint_error(cursor, db_connection): +def test_unique_constraint_error(cursor): try: drop_table_if_exists(cursor, "pytest_test_unique") cursor.execute("CREATE TABLE pytest_test_unique (id INT PRIMARY KEY, name NVARCHAR(50))") @@ -105,9 +104,8 @@ def test_unique_constraint_error(cursor, db_connection): pytest.fail(f"Test failed: {e}") finally: drop_table_if_exists(cursor, "pytest_test_unique") - db_connection.commit() -def test_foreign_key_constraint_error(cursor, db_connection): +def test_foreign_key_constraint_error(cursor): try: drop_table_if_exists(cursor, "pytest_child_table") drop_table_if_exists(cursor, "pytest_parent_table") @@ -122,9 +120,8 @@ def test_foreign_key_constraint_error(cursor, db_connection): finally: drop_table_if_exists(cursor, "pytest_child_table") drop_table_if_exists(cursor, "pytest_parent_table") - db_connection.commit() def test_connection_error(db_connection): with pytest.raises(OperationalError) as excinfo: - Connection("InvalidConnectionString") + connect("InvalidConnectionString") assert "Client unable to establish connection" in str(excinfo.value) From d3e1fb1c4667501de7f58d56780d11bc4ea9b259 Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Fri, 23 May 2025 15:36:33 +0530 Subject: [PATCH 02/32] restoring LICENSING --- mssql_python/libs/LICENSING | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 mssql_python/libs/LICENSING diff --git a/mssql_python/libs/LICENSING b/mssql_python/libs/LICENSING new file mode 100644 index 00000000..6d9b0d9e --- /dev/null +++ b/mssql_python/libs/LICENSING @@ -0,0 +1,19 @@ +A. The dynamic-link libraries (DLLs) in the mssql_python\libs\win folder fall under different Microsoft licenses. +==================================================================================================== +Below is a breakdown of these components by their respective licenses. + +1. Microsoft ODBC Driver 18 End User License Agreement (EULA) +These components are part of the Microsoft ODBC Driver 18 for SQL Server and are governed by the Microsoft ODBC Driver 18 EULA. + +- msodbcsqlr18.rll – Resource library containing localized error messages for the ODBC driver. +- msodbcdiag18.dll – Diagnostic library for handling error reporting and troubleshooting. +- msodbcsql18.dll – Core ODBC driver enabling connectivity between SQL Server and applications. + +For official licensing terms, refer to: mssql_python\libs\win\MICROSOFT_ODBC_DRIVER_FOR_SQL_SERVER_LICENSE.txt + +2. Microsoft Visual C++ Redistributable EULA +These components are part of the Microsoft Visual C++ Redistributable and are governed by the Microsoft Visual C++ Redistributable EULA. + +- msvcp140.dll – Microsoft C++ Standard Library runtime, required for running C++ applications. + +For redistribution and usage terms, refer to: mssql_python\libs\win\MICROSOFT_VISUAL_STUDIO_LICENSE.txt From efc738d30827e1c7fe81379f69f7d28598673e30 Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Fri, 23 May 2025 15:58:03 +0530 Subject: [PATCH 03/32] reverting unnecessary changes --- mssql_python/testing_ddbc_bindings.py | 66 +++++++++++++-------------- mssql_python/type.py | 2 +- 2 files changed, 33 insertions(+), 35 deletions(-) diff --git a/mssql_python/testing_ddbc_bindings.py b/mssql_python/testing_ddbc_bindings.py index a8fdadf3..a5aa2ae7 100644 --- a/mssql_python/testing_ddbc_bindings.py +++ b/mssql_python/testing_ddbc_bindings.py @@ -3,7 +3,6 @@ Licensed under the MIT license. This module provides functions to test DDBC bindings. """ - import ctypes import datetime import os @@ -27,15 +26,13 @@ def alloc_handle(handle_type, input_handle): """ Allocate a handle for the given handle type and input handle. """ - handle = ctypes.c_void_p() - result_alloc = ddbc_bindings.DDBCSQLAllocHandle( + result_alloc, handle = ddbc_bindings.DDBCSQLAllocHandle( handle_type, - input_handle, - ctypes.cast(ctypes.pointer(handle), ctypes.c_void_p).value, + input_handle ) if result_alloc < 0: print( - "Error:", ddbc_bindings.DDBCSQLCheckError(handle_type, handle.value, result_alloc) + "Error:", ddbc_bindings.DDBCSQLCheckError(handle_type, handle, result_alloc) ) raise RuntimeError(f"Failed to allocate handle. Error code: {result_alloc}") return handle @@ -45,10 +42,10 @@ def free_handle(handle_type, handle): """ Free the handle for the given handle type and handle. """ - result_free = ddbc_bindings.DDBCSQLFreeHandle(handle_type, handle.value) + result_free = ddbc_bindings.DDBCSQLFreeHandle(handle_type, handle) if result_free < 0: print( - "Error:", ddbc_bindings.DDBCSQLCheckError(handle_type, handle.value, result_free) + "Error:", ddbc_bindings.DDBCSQLCheckError(handle_type, handle, result_free) ) raise RuntimeError(f"Failed to free handle. Error code: {result_free}") @@ -60,12 +57,12 @@ def ddbc_sql_execute( Execute an SQL statement using DDBC bindings. """ result_execute = ddbc_bindings.DDBCSQLExecute( - stmt_handle.value, query, params, param_info_list, is_stmt_prepared, use_prepare + stmt_handle, query, params, param_info_list, is_stmt_prepared, use_prepare ) if result_execute < 0: print( "Error: ", - ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_STMT, stmt_handle.value, result_execute), + ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_STMT, stmt_handle, result_execute), ) raise RuntimeError(f"Failed to execute query. Error code: {result_execute}") return result_execute @@ -79,12 +76,12 @@ def fetch_data_onebyone(stmt_handle): ret_fetch = 1 while ret_fetch != SQL_NO_DATA: row = [] - ret_fetch = ddbc_bindings.DDBCSQLFetchOne(stmt_handle.value, row) + ret_fetch = ddbc_bindings.DDBCSQLFetchOne(stmt_handle, row) if ret_fetch < 0: print( "Error: ", ddbc_bindings.DDBCSQLCheckError( - SQL_HANDLE_STMT, stmt_handle.value, ret_fetch + SQL_HANDLE_STMT, stmt_handle, ret_fetch ), ) raise RuntimeError(f"Failed to fetch data. Error code: {ret_fetch}") @@ -100,12 +97,12 @@ def fetch_data_many(stmt_handle): rows = [] ret_fetch = 1 while ret_fetch != SQL_NO_DATA: - ret_fetch = ddbc_bindings.DDBCSQLFetchMany(stmt_handle.value, rows, 10) + ret_fetch = ddbc_bindings.DDBCSQLFetchMany(stmt_handle, rows, 10) if ret_fetch < 0: print( "Error: ", ddbc_bindings.DDBCSQLCheckError( - SQL_HANDLE_STMT, stmt_handle.value, ret_fetch + SQL_HANDLE_STMT, stmt_handle, ret_fetch ), ) raise RuntimeError(f"Failed to fetch data. Error code: {ret_fetch}") @@ -117,11 +114,11 @@ def fetch_data_all(stmt_handle): Fetch all data using DDBC bindings. """ rows = [] - ret_fetch = ddbc_bindings.DDBCSQLFetchAll(stmt_handle.value, rows) + ret_fetch = ddbc_bindings.DDBCSQLFetchAll(stmt_handle, rows) if ret_fetch != SQL_NO_DATA: print( "Error: ", - ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_STMT, stmt_handle.value, ret_fetch), + ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_STMT, stmt_handle, ret_fetch), ) raise RuntimeError(f"Failed to fetch data. Error code: {ret_fetch}") return rows @@ -132,28 +129,28 @@ def fetch_data(stmt_handle): Fetch data using DDBC bindings. """ rows = [] - column_count = ddbc_bindings.DDBCSQLNumResultCols(stmt_handle.value) + column_count = ddbc_bindings.DDBCSQLNumResultCols(stmt_handle) print("Number of columns = " + str(column_count)) while True: - result_fetch = ddbc_bindings.DDBCSQLFetch(stmt_handle.value) + result_fetch = ddbc_bindings.DDBCSQLFetch(stmt_handle) if result_fetch == SQL_NO_DATA: break if result_fetch < 0: print( "Error: ", ddbc_bindings.DDBCSQLCheckError( - SQL_HANDLE_STMT, stmt_handle.value, result_fetch + SQL_HANDLE_STMT, stmt_handle, result_fetch ), ) raise RuntimeError(f"Failed to fetch data. Error code: {result_fetch}") if column_count > 0: row = [] - result_get_data = ddbc_bindings.DDBCSQLGetData(stmt_handle.value, column_count, row) + result_get_data = ddbc_bindings.DDBCSQLGetData(stmt_handle, column_count, row) if result_get_data < 0: print( "Error: ", ddbc_bindings.DDBCSQLCheckError( - SQL_HANDLE_STMT, stmt_handle.value, result_get_data + SQL_HANDLE_STMT, stmt_handle, result_get_data ), ) raise RuntimeError(f"Failed to get data. Error code: {result_get_data}") @@ -166,11 +163,11 @@ def describe_columns(stmt_handle): Describe columns using DDBC bindings. """ column_names = [] - result_describe = ddbc_bindings.DDBCSQLDescribeCol(stmt_handle.value, column_names) + result_describe = ddbc_bindings.DDBCSQLDescribeCol(stmt_handle, column_names) if result_describe < 0: print( "Error: ", - ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_STMT, stmt_handle.value, result_describe), + ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_STMT, stmt_handle, result_describe), ) raise RuntimeError(f"Failed to describe columns. Error code: {result_describe}") return column_names @@ -180,11 +177,11 @@ def connect_to_db(dbc_handle, connection_string): """ Connect to the database using DDBC bindings. """ - result_connect = ddbc_bindings.DDBCSQLDriverConnect(dbc_handle.value, 0, connection_string) + result_connect = ddbc_bindings.DDBCSQLDriverConnect(dbc_handle, 0, connection_string) if result_connect < 0: print( "Error: ", - ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_DBC, dbc_handle.value, result_connect), + ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_DBC, dbc_handle, result_connect), ) raise RuntimeError(f"SQLDriverConnect failed. Error code: {result_connect}") @@ -348,26 +345,27 @@ def add_numeric_param(params, param_infos, param): if __name__ == "__main__": # Allocate environment handle - env_handle = alloc_handle(SQL_HANDLE_ENV, 0) - + env_handle = alloc_handle(SQL_HANDLE_ENV, None) + # Set the DDBC version environment attribute result_set_env = ddbc_bindings.DDBCSQLSetEnvAttr( - env_handle.value, SQL_ATTR_DDBC_VERSION, SQL_OV_DDBC3_80, 0 + env_handle, SQL_ATTR_DDBC_VERSION, SQL_OV_DDBC3_80, 0 ) if result_set_env < 0: print( "Error: ", - ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_ENV, env_handle.value, result_set_env), + ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_ENV, env_handle, result_set_env), ) raise RuntimeError( f"Failed to set DDBC version attribute. Error code: {result_set_env}" ) # Allocate connection handle - dbc_handle = alloc_handle(SQL_HANDLE_DBC, env_handle.value) + dbc_handle = alloc_handle(SQL_HANDLE_DBC, env_handle) # Fetch the connection string from environment variables connection_string = os.getenv("DB_CONNECTION_STRING") + if not connection_string: raise EnvironmentError( "Environment variable 'DB_CONNECTION_STRING' is not set or is empty." @@ -378,7 +376,7 @@ def add_numeric_param(params, param_infos, param): print("Connection successful!") # Allocate connection statement handle - stmt_handle = alloc_handle(SQL_HANDLE_STMT, dbc_handle.value) + stmt_handle = alloc_handle(SQL_HANDLE_STMT, dbc_handle) ParamInfo = ddbc_bindings.ParamInfo """ @@ -441,16 +439,16 @@ def add_numeric_param(params, param_infos, param): print(row) else: print("No columns to fetch data from.") - ret_fetch = ddbc_bindings.DDBCSQLMoreResults(stmt_handle.value) + ret_fetch = ddbc_bindings.DDBCSQLMoreResults(stmt_handle) # Free the statement handle free_handle(SQL_HANDLE_STMT, stmt_handle) # Disconnect from the data source - result_disconnect = ddbc_bindings.DDBCSQLDisconnect(dbc_handle.value) + result_disconnect = ddbc_bindings.DDBCSQLDisconnect(dbc_handle) if result_disconnect < 0: print( "Error: ", - ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_DBC, dbc_handle.value, result_disconnect), + ddbc_bindings.DDBCSQLCheckError(SQL_HANDLE_DBC, dbc_handle, result_disconnect), ) raise RuntimeError( f"Failed to disconnect from the data source. Error code: {result_disconnect}" diff --git a/mssql_python/type.py b/mssql_python/type.py index 5bc9781c..85124b9b 100644 --- a/mssql_python/type.py +++ b/mssql_python/type.py @@ -97,7 +97,7 @@ def TimestampFromTicks(ticks: int) -> datetime.datetime: """ Generates a timestamp object from ticks. """ - return datetime.datetime.fromtimestamp(ticks, datetime.UTC) + return datetime.datetime.fromtimestamp(ticks, datetime.timezone.utc) def Binary(string: str) -> bytes: From afdd03f7c68fc4a933cb811b4ccefc8993b25d9a Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Fri, 23 May 2025 15:59:06 +0530 Subject: [PATCH 04/32] reverting back tests --- tests/conftest.py | 8 +++++--- tests/test_003_connection.py | 38 +++++++++++++++++++++++++++++++----- tests/test_004_cursor.py | 14 +++++++++---- tests/test_005_exceptions.py | 17 +++++++++------- 4 files changed, 58 insertions(+), 19 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 25327664..2b3ec4f3 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -9,20 +9,20 @@ import pytest import os -from mssql_python import connect +from mssql_python import connect, ddbc_bindings import time def pytest_configure(config): # Add any necessary configuration here pass -@pytest.fixture(scope='module') +@pytest.fixture(scope='session') def conn_str(): conn_str = os.getenv('DB_CONNECTION_STRING') return conn_str @pytest.fixture(scope="module") -def db_connection(conn_str): +def db_connection(conn_str): try: conn = connect(conn_str) except Exception as e: @@ -33,8 +33,10 @@ def db_connection(conn_str): else: pytest.fail(f"Database connection failed: {e}") yield conn + conn.close() @pytest.fixture(scope="module") def cursor(db_connection): cursor = db_connection.cursor() yield cursor + cursor.close() diff --git a/tests/test_003_connection.py b/tests/test_003_connection.py index ce31ec08..bd37a468 100644 --- a/tests/test_003_connection.py +++ b/tests/test_003_connection.py @@ -11,7 +11,7 @@ """ import pytest -from mssql_python import Connection +from mssql_python import Connection, connect def drop_table_if_exists(cursor, table_name): """Drop the table if it exists""" @@ -33,7 +33,33 @@ def test_connection(db_connection): def test_construct_connection_string(db_connection): # Check if the connection string is constructed correctly with kwargs - conn_str = db_connection._construct_connection_string("",host="localhost", user="me", password="mypwd", database="mydb", encrypt="yes", trust_server_certificate="yes") + conn_str = db_connection._construct_connection_string(host="localhost", user="me", password="mypwd", database="mydb", encrypt="yes", trust_server_certificate="yes") + assert "Server=localhost;" in conn_str, "Connection string should contain 'Server=localhost;'" + assert "Uid=me;" in conn_str, "Connection string should contain 'Uid=me;'" + assert "Pwd=mypwd;" in conn_str, "Connection string should contain 'Pwd=mypwd;'" + assert "Database=mydb;" in conn_str, "Connection string should contain 'Database=mydb;'" + assert "Encrypt=yes;" in conn_str, "Connection string should contain 'Encrypt=yes;'" + assert "TrustServerCertificate=yes;" in conn_str, "Connection string should contain 'TrustServerCertificate=yes;'" + assert "APP=MSSQL-Python" in conn_str, "Connection string should contain 'APP=MSSQL-Python'" + assert "Driver={ODBC Driver 18 for SQL Server}" in conn_str, "Connection string should contain 'Driver={ODBC Driver 18 for SQL Server}'" + assert "Driver={ODBC Driver 18 for SQL Server};;APP=MSSQL-Python;Server=localhost;Uid=me;Pwd=mypwd;Database=mydb;Encrypt=yes;TrustServerCertificate=yes;" == conn_str, "Connection string is incorrect" + +def test_connection_string_with_attrs_before(db_connection): + # Check if the connection string is constructed correctly with attrs_before + conn_str = db_connection._construct_connection_string(host="localhost", user="me", password="mypwd", database="mydb", encrypt="yes", trust_server_certificate="yes", attrs_before={1256: "token"}) + assert "Server=localhost;" in conn_str, "Connection string should contain 'Server=localhost;'" + assert "Uid=me;" in conn_str, "Connection string should contain 'Uid=me;'" + assert "Pwd=mypwd;" in conn_str, "Connection string should contain 'Pwd=mypwd;'" + assert "Database=mydb;" in conn_str, "Connection string should contain 'Database=mydb;'" + assert "Encrypt=yes;" in conn_str, "Connection string should contain 'Encrypt=yes;'" + assert "TrustServerCertificate=yes;" in conn_str, "Connection string should contain 'TrustServerCertificate=yes;'" + assert "APP=MSSQL-Python" in conn_str, "Connection string should contain 'APP=MSSQL-Python'" + assert "Driver={ODBC Driver 18 for SQL Server}" in conn_str, "Connection string should contain 'Driver={ODBC Driver 18 for SQL Server}'" + assert "{1256: token}" not in conn_str, "Connection string should not contain '{1256: token}'" + +def test_connection_string_with_odbc_param(db_connection): + # Check if the connection string is constructed correctly with ODBC parameters + conn_str = db_connection._construct_connection_string(server="localhost", uid="me", pwd="mypwd", database="mydb", encrypt="yes", trust_server_certificate="yes") assert "Server=localhost;" in conn_str, "Connection string should contain 'Server=localhost;'" assert "Uid=me;" in conn_str, "Connection string should contain 'Uid=me;'" assert "Pwd=mypwd;" in conn_str, "Connection string should contain 'Pwd=mypwd;'" @@ -147,6 +173,8 @@ def test_invalid_connection_string(): with pytest.raises(Exception): Connection("invalid_connection_string") -def test_connection_close(db_connection): - # Check if the database connection is closed - db_connection.close() \ No newline at end of file +def test_connection_close(conn_str): + # Create a separate connection just for this test + temp_conn = connect(conn_str) + # Check if the database connection can be closed + temp_conn.close() diff --git a/tests/test_004_cursor.py b/tests/test_004_cursor.py index 67c501bd..45f3663d 100644 --- a/tests/test_004_cursor.py +++ b/tests/test_004_cursor.py @@ -11,6 +11,7 @@ import pytest from datetime import datetime, date, time import decimal +from mssql_python import Connection # Setup test table TEST_TABLE = """ @@ -1144,8 +1145,13 @@ def test_numeric_precision_scale_negative_exponent(cursor, db_connection): cursor.execute("DROP TABLE pytest_numeric_test") db_connection.commit() -def test_close(cursor): +def test_close(db_connection): """Test closing the cursor""" - cursor.close() - with pytest.raises(Exception): - cursor.execute("SELECT 1") + try: + cursor = db_connection.cursor() + cursor.close() + assert cursor.closed, "Cursor should be closed after calling close()" + except Exception as e: + pytest.fail(f"Cursor close test failed: {e}") + finally: + cursor = db_connection.cursor() diff --git a/tests/test_005_exceptions.py b/tests/test_005_exceptions.py index 8757717d..030c4f16 100644 --- a/tests/test_005_exceptions.py +++ b/tests/test_005_exceptions.py @@ -1,5 +1,5 @@ import pytest -from mssql_python import connect +from mssql_python import connect, Connection from mssql_python.exceptions import ( Exception, Warning, @@ -71,7 +71,7 @@ def test_not_supported_error_exception(): def test_unknown_error_exception(): with pytest.raises(DatabaseError) as excinfo: raise_exception('99999', 'Unknown error') - assert str(excinfo.value) == "Driver Error: An error occurred with SQLSTATE code; DDBC Error: Unknown DDBC error: 99999" + assert str(excinfo.value) == "Driver Error: An error occurred with SQLSTATE code: 99999; DDBC Error: Unknown error" def test_syntax_error(cursor): with pytest.raises(ProgrammingError) as excinfo: @@ -83,16 +83,17 @@ def test_table_not_found_error(cursor): cursor.execute("SELECT * FROM non_existent_table") assert "Base table or view not found" in str(excinfo.value) -def test_data_truncation_error(cursor): +def test_data_truncation_error(cursor, db_connection): try: cursor.execute("CREATE TABLE pytest_test_truncation (id INT, name NVARCHAR(5))") cursor.execute("INSERT INTO pytest_test_truncation (id, name) VALUES (?, ?)", [1, 'TooLongName']) - except DataError as excinfo: + except ProgrammingError as excinfo: assert "String or binary data would be truncated" in str(excinfo) finally: drop_table_if_exists(cursor, "pytest_test_truncation") + db_connection.commit() -def test_unique_constraint_error(cursor): +def test_unique_constraint_error(cursor, db_connection): try: drop_table_if_exists(cursor, "pytest_test_unique") cursor.execute("CREATE TABLE pytest_test_unique (id INT PRIMARY KEY, name NVARCHAR(50))") @@ -104,8 +105,9 @@ def test_unique_constraint_error(cursor): pytest.fail(f"Test failed: {e}") finally: drop_table_if_exists(cursor, "pytest_test_unique") + db_connection.commit() -def test_foreign_key_constraint_error(cursor): +def test_foreign_key_constraint_error(cursor, db_connection): try: drop_table_if_exists(cursor, "pytest_child_table") drop_table_if_exists(cursor, "pytest_parent_table") @@ -120,8 +122,9 @@ def test_foreign_key_constraint_error(cursor): finally: drop_table_if_exists(cursor, "pytest_child_table") drop_table_if_exists(cursor, "pytest_parent_table") + db_connection.commit() def test_connection_error(db_connection): with pytest.raises(OperationalError) as excinfo: - connect("InvalidConnectionString") + Connection("InvalidConnectionString") assert "Client unable to establish connection" in str(excinfo.value) From 519a99a204b2a921cfe0bd8af3e72ba9ed1449a2 Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Fri, 23 May 2025 17:13:05 +0530 Subject: [PATCH 05/32] cmakelists print lib dirs --- mssql_python/pybind/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mssql_python/pybind/CMakeLists.txt b/mssql_python/pybind/CMakeLists.txt index dece3667..636b43c9 100644 --- a/mssql_python/pybind/CMakeLists.txt +++ b/mssql_python/pybind/CMakeLists.txt @@ -242,8 +242,10 @@ else() if(WIN32 AND DEFINED PYTHON_LIB_DIR) # On Windows, link with the Python lib if(EXISTS "${PYTHON_LIB_DIR}/python${PYTHON_VERSION}.lib") + message(STATUS "Found Python library: ${PYTHON_LIB_DIR}/python${PYTHON_VERSION}.lib") target_link_libraries(ddbc_bindings PRIVATE "${PYTHON_LIB_DIR}/python${PYTHON_VERSION}.lib") elseif(EXISTS "${PYTHON_LIB_DIR}/python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}.lib") + message(STATUS "Found Python library: ${PYTHON_LIB_DIR}/python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}.lib") target_link_libraries(ddbc_bindings PRIVATE "${PYTHON_LIB_DIR}/python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}.lib") endif() endif() From 79b2f680c520d8564f2390181b3065423e9eb48b Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Thu, 29 May 2025 12:38:56 +0530 Subject: [PATCH 06/32] fixed python lib dir variable --- mssql_python/pybind/CMakeLists.txt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/mssql_python/pybind/CMakeLists.txt b/mssql_python/pybind/CMakeLists.txt index 636b43c9..94d81a89 100644 --- a/mssql_python/pybind/CMakeLists.txt +++ b/mssql_python/pybind/CMakeLists.txt @@ -83,7 +83,7 @@ if(DEFINED PYTHON_INCLUDE_DIR AND NOT "${PYTHON_INCLUDE_DIR}" STREQUAL "") else() # Try to detect Python include directory execute_process( - COMMAND python3 -c "import sysconfig; print(sysconfig.get_path('include'))" + COMMAND python -c "import sysconfig; print(sysconfig.get_path('include'))" OUTPUT_VARIABLE PYTHON_INCLUDE_DIR OUTPUT_STRIP_TRAILING_WHITESPACE ) @@ -95,7 +95,7 @@ if(DEFINED PYBIND11_INCLUDE_DIR AND NOT "${PYBIND11_INCLUDE_DIR}" STREQUAL "") else() # Try to detect pybind11 include directory execute_process( - COMMAND python3 -c "import pybind11; print(pybind11.get_include())" + COMMAND python -c "import pybind11; print(pybind11.get_include())" OUTPUT_VARIABLE PYBIND11_INCLUDE_DIR OUTPUT_STRIP_TRAILING_WHITESPACE ) @@ -104,19 +104,19 @@ endif() # Find Python Library for linking execute_process( - COMMAND python3 -c "import sysconfig; print(sysconfig.get_config_var('LIBDIR'))" - OUTPUT_VARIABLE PYTHON_LIBDIR + COMMAND python -c "import sysconfig; print(sysconfig.get_config_var('LIBDIR'))" + OUTPUT_VARIABLE PYTHON_LIB_DIR OUTPUT_STRIP_TRAILING_WHITESPACE ) -message(STATUS "Python LIBDIR from sysconfig: ${PYTHON_LIBDIR}") +message(STATUS "Python LIBDIR from sysconfig: ${PYTHON_LIB_DIR}") # On macOS, we may need additional work to find the Python library -if(APPLE AND (NOT PYTHON_LIBDIR OR "${PYTHON_LIBDIR}" STREQUAL "")) +if(APPLE AND (NOT PYTHON_LIB_DIR OR "${PYTHON_LIB_DIR}" STREQUAL "")) message(STATUS "LIBDIR is None or empty, trying alternative methods") # Get Python executable path execute_process( - COMMAND python3 -c "import sys; print(sys.executable)" + COMMAND python -c "import sys; print(sys.executable)" OUTPUT_VARIABLE PYTHON_EXECUTABLE OUTPUT_STRIP_TRAILING_WHITESPACE ) @@ -134,7 +134,7 @@ if(APPLE AND (NOT PYTHON_LIBDIR OR "${PYTHON_LIBDIR}" STREQUAL "")) # Get Python version for library name execute_process( - COMMAND python3 -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')" + COMMAND python -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')" OUTPUT_VARIABLE PYTHON_VERSION_FULL OUTPUT_STRIP_TRAILING_WHITESPACE ) @@ -211,7 +211,7 @@ if(APPLE) else() # Otherwise, try to link to the framework execute_process( - COMMAND python3 -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')" + COMMAND python -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')" OUTPUT_VARIABLE PYTHON_VERSION_FULL OUTPUT_STRIP_TRAILING_WHITESPACE ) From 69fa4a7a4302a5c9a11454fdc1b6f12d4f32e62a Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Thu, 29 May 2025 14:52:30 +0530 Subject: [PATCH 07/32] removed unixodbc altogether and modified readme and setup --- .../libs/macos/lib/libmsodbcsql.18.dylib | Bin 1673120 -> 1673120 bytes .../libs/macos/lib/libodbcinst.2.dylib | Bin 111808 -> 111808 bytes .../libs/macos/odbc_include/autotest.h | 176 -- .../libs/macos/odbc_include/odbcinst.h | 458 ---- .../libs/macos/odbc_include/odbcinstext.h | 369 --- mssql_python/libs/macos/odbc_include/sql.h | 839 ------- mssql_python/libs/macos/odbc_include/sqlext.h | 2204 ----------------- mssql_python/libs/macos/odbc_include/sqlspi.h | 173 -- .../libs/macos/odbc_include/sqltypes.h | 482 ---- .../libs/macos/odbc_include/sqlucode.h | 789 ------ .../odbc_include/unixODBC/unixodbc_conf.h | 484 ---- .../libs/macos/odbc_include/unixodbc.h | 17 - .../libs/macos/odbc_include/uodbc_extras.h | 85 - .../libs/macos/odbc_include/uodbc_stats.h | 83 - mssql_python/pybind/CMakeLists.txt | 2 +- mssql_python/pybind/README.md | 42 +- mssql_python/pybind/build.sh | 19 +- mssql_python/pybind/ddbc_bindings_mac.cpp | 4 +- setup.py | 11 +- 19 files changed, 47 insertions(+), 6190 deletions(-) delete mode 100644 mssql_python/libs/macos/odbc_include/autotest.h delete mode 100644 mssql_python/libs/macos/odbc_include/odbcinst.h delete mode 100644 mssql_python/libs/macos/odbc_include/odbcinstext.h delete mode 100644 mssql_python/libs/macos/odbc_include/sql.h delete mode 100644 mssql_python/libs/macos/odbc_include/sqlext.h delete mode 100644 mssql_python/libs/macos/odbc_include/sqlspi.h delete mode 100644 mssql_python/libs/macos/odbc_include/sqltypes.h delete mode 100644 mssql_python/libs/macos/odbc_include/sqlucode.h delete mode 100644 mssql_python/libs/macos/odbc_include/unixODBC/unixodbc_conf.h delete mode 100644 mssql_python/libs/macos/odbc_include/unixodbc.h delete mode 100644 mssql_python/libs/macos/odbc_include/uodbc_extras.h delete mode 100644 mssql_python/libs/macos/odbc_include/uodbc_stats.h diff --git a/mssql_python/libs/macos/lib/libmsodbcsql.18.dylib b/mssql_python/libs/macos/lib/libmsodbcsql.18.dylib index f54bd9d287d6495d231b1e733e18dc888ee44d76..56605d671cb5438d93270fdbe08403d442bed83f 100755 GIT binary patch delta 160 zcmZ3`pSGYsZG#=hWG4 -#include - -/* platform specific... */ -#ifdef _WINDOWS - #include -#endif - -/* standard ODBC stuff... */ -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef WIN32 - #ifdef PATH_MAX - #define _MAX_PATH PATH_MAX - #else - #define _MAX_PATH 256 - #endif -#endif - -extern HINSTANCE hLoadedInst; - -/*---------------------------------------------------------------------------------- - Defines and Macros -----------------------------------------------------------------------------------*/ - -#define TEST_ABORTED (-1) - -#define AUTO_MAX_TEST_NAME 35 -#define AUTO_MAX_TESTCASE_NAME 35 -#define AUTO_MAX_TESTDESC_NAME 75 - -#define MAXFLUSH 300 -#define MAX_USER_INFO 50 -#define MAX_KEYWORD_LEN 149 - -/* */ -#ifdef WIN32 - #define EXTFUNCDECL _stdcall - #define EXTFUN _stdcall - #define MY_EXPORT __declspec(dllexport) -#else - #define EXTFUNCDECL - #define EXTFUN - #define MY_EXPORT -#endif - -#define InitTest(lps) \ -{ lps->cErrors=0; } -#define AbortTest(lps) \ -{ lps->cErrors=TEST_ABORTED; } - -#define AllocateMemory(cb) (calloc(cb,1)) -#define ReleaseMemory(lp) (free(lp)) - -#define NumItems(s) (sizeof(s) / sizeof(s[0])) - -/* Following will access bit number pos in a bit array and return */ -/* TRUE if it is set, FALSE if it is not */ -#define CQBITS (sizeof(unsigned int) * 8) -#define getqbit(lpa, pos) \ - (lpa[((pos) / CQBITS)] & (1 << ((pos) - (CQBITS * ((pos) / CQBITS))))) -#define GETBIT(p1,p2) getqbit(p1,(p2)-1) - -/* - * Message box defines - */ - -#ifndef WIN32 - #define MB_OK (0x0000) - #define MB_ABORTRETRYIGNORE (0x0001) - #define MB_OKCANCEL (0x0002) - #define MB_RETRYCANCEL (0x0003) - #define MB_YESNO (0x0004) - #define MB_YESNOCANCEL (0x0005) - - #define MB_ICONEXCLAMATION (0x0000) - #define MB_ICONWARNING MB_ICONEXCLAMATION - #define MB_ICONINFORMATION (0x0010) - #define MB_ICONASTERISK MB_ICONINFORMATION - #define MB_ICONQUESTION (0x0020) - #define MB_ICONSTOP (0x0030) - #define MB_ICONERROR MB_ICONSTOP - #define MB_ICONHAND MB_ICONSTOP - - #define MB_DEFBUTTON1 (0x0000) - #define MB_DEFBUTTON2 (0x0100) - #define MB_DEFBUTTON3 (0x0200) - #define MB_DEFBUTTON4 (0x0300) - - #define MB_APPMODAL (0x0000) - #define MB_SYSTEMMODAL (0x1000) - #define MB_TASKMODAL (0x2000) - - #define MB_DEFAULT_DESKTOP_ONLY (0x0000) - #define MB_HELP (0x0000) - #define MB_RIGHT (0x0000) - #define MB_RTLREADING (0x0000) - #define MB_SETFOREGROUND (0x0000) - #define MB_TOPMOST (0x0000) - #define MB_SERVICE_NOTIFICATION (0x0000) - #define MB_SERVICE_NOTIFICATION_NT3X (0x0000) -#endif - -/*! - This structure contains the information found in the .INI file for a - data source. The filled out structure is in turn passed to AutoTestFunc - to drive the individual tests. -*/ -typedef struct tagSERVERINFO { - HWND hwnd; /* Output edit window */ - CHAR szLogFile[_MAX_PATH]; /* Output log file */ - HENV henv; /* .EXE's henv */ - HDBC hdbc; /* .EXE's hdbc */ - HSTMT hstmt; /* .EXE's hstmt */ - - /* The following items are gathered from the .INI file and may be defined */ - /* via the "Manage Test Sources" menu item from ODBC Test */ - CHAR szSource[SQL_MAX_DSN_LENGTH+1]; - CHAR szValidServer0[SQL_MAX_DSN_LENGTH+1]; - CHAR szValidLogin0[MAX_USER_INFO+1]; - CHAR szValidPassword0[MAX_USER_INFO+1]; - CHAR szKeywords[MAX_KEYWORD_LEN+1]; - - /* Following are used for run-time */ - UINT FAR * rglMask; /* Run test mask */ - int failed; /* Track failures on a test case basis */ - int cErrors; /* Count of errors */ - BOOL fDebug; /* TRUE if debugging is to be enabled */ - BOOL fScreen; /* TRUE if test output goes to screen */ - BOOL fLog; /* TRUE if test output goes to log */ - BOOL fIsolate; /* TRUE to isolate output */ - UDWORD vCursorLib; /* Value for SQL_ODBC_CURSOR on SQLSetConnectOption */ - HINSTANCE hLoadedInst; /* Instance handle of loaded test */ - - /* Following are used for buffering output to edit window */ - CHAR szBuff[MAXFLUSH]; /* Hold temporary results */ - UINT cBuff; /* Number of TCHARs in szBuff */ - } SERVERINFO; -typedef SERVERINFO FAR * lpSERVERINFO; - - -BOOL EXTFUNCDECL FAR szLogPrintf(lpSERVERINFO lps, BOOL fForce, LPTSTR szFmt, ...); -int EXTFUNCDECL FAR szMessageBox(HWND hwnd, UINT style, LPTSTR szTitle, LPTSTR szFmt, ...); -LPTSTR EXTFUN GetRCString(HINSTANCE hInst, LPTSTR buf, int cbbuf, UINT ids); - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/mssql_python/libs/macos/odbc_include/odbcinst.h b/mssql_python/libs/macos/odbc_include/odbcinst.h deleted file mode 100644 index aa74a6fd..00000000 --- a/mssql_python/libs/macos/odbc_include/odbcinst.h +++ /dev/null @@ -1,458 +0,0 @@ -/************************************************** - * odbcinst.h - * - ************************************************** - * This code was created by Peter Harvey @ CodeByDesign. - * Released under LGPL 28.JAN.99 - * - * Contributions from... - * ----------------------------------------------- - * Peter Harvey - pharvey@codebydesign.com - **************************************************/ -#ifndef __ODBCINST_H -#define __ODBCINST_H - -#include - -#ifndef BOOL -#define BOOL int -#endif - -#ifndef __SQL -#include "sql.h" -#endif - - -/*! - * \brief Our generic window handle. - * - * This is used wherever a HWND is needed. The caller inits this according - * to which UI the caller has (or simply desires). This may be a; console, xlib, qt3, qt4, - * gtk, mono, carbon, etc. - * - * SQLCreateDataSource - * (maps to ODBCCreateDataSource entry point in UI plugin) - * - * This function requires a HWND (and it must NOT be NULL as per ODBC spec.). So - * the caller should *always* init an ODBCINSTWND and cast it to HWND as it is passed to - * SQLCreateDataSource. - * - * SQLManageDataSources - * (maps to ODBCManageDataSources entry point in UI plugin) - * - * This function requires a HWND (and it must NOT be NULL as per ODBC spec.). So - * the caller should *always* init an ODBCINSTWND and cast it to HWND as it is passed to - * SQLManageDataSources. However; it may make sense to have a NULL hWnd... this is what - * an ODBC Administrator program would typically do. - * - * Plugin Selection - * - * 1. Passing a NULL to a function instead of a valid HODBCINSTWND may result in an error - * (this is the case with SQLCreateDataSource). In anycase; passing a NULL in this way - * negates the use of any UI plugin. - * - * 2. szUI has a value and it is the file name (no path and no extension) of the UI - * plugin. The plugin is loaded and the appropriate function is called with hWnd. The - * caller must have init hWnd in a manner which is appropriate for the UI plugin. - * - * 3. Passing an empty szUI indicates that the UI plugin should be determined by other - * means (see 4). In such a case it is dangerous to use hWnd because it may not match - * the type expected by the plugin. hWnd will be ignored and a NULL will be passed to the UI - * plugin. - * - * 4. The fallback logic for determining the UI plugin is as follows; - * - use the ODBCINSTUI environment variable to get the UI plugin file name - * - use the ODBCINSTUI value in odbcinst.ini to get the UI plugin file name - * - * NOTE: In the future we may want to consider making HWND of this type instead of having - * two different types and having to cast HODBCINSTWND into a HWND. - */ -typedef struct tODBCINSTWND -{ - char szUI[FILENAME_MAX]; /*!< Plugin file name (no path and no extension) ie "odbcinstQ4". */ - HWND hWnd; /*!< this is passed to the UI plugin - caller must know what the plugin is expecting */ - -} ODBCINSTWND, *HODBCINSTWND; - - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef ODBCVER -#define ODBCVER 0x0351 -#endif - -#ifndef WINVER -#define WINVER 0x0400 -#endif - -/* SQLConfigDataSource request flags */ -#define ODBC_ADD_DSN 1 -#define ODBC_CONFIG_DSN 2 -#define ODBC_REMOVE_DSN 3 - -#if (ODBCVER >= 0x0250) -#define ODBC_ADD_SYS_DSN 4 -#define ODBC_CONFIG_SYS_DSN 5 -#define ODBC_REMOVE_SYS_DSN 6 -#if (ODBCVER >= 0x0300) -#define ODBC_REMOVE_DEFAULT_DSN 7 -#endif /* ODBCVER >= 0x0300 */ - -/* install request flags */ -#define ODBC_INSTALL_INQUIRY 1 -#define ODBC_INSTALL_COMPLETE 2 - -/* config driver flags */ -#define ODBC_INSTALL_DRIVER 1 -#define ODBC_REMOVE_DRIVER 2 -#define ODBC_CONFIG_DRIVER 3 -#define ODBC_CONFIG_DRIVER_MAX 100 -#endif - -/* SQLGetConfigMode and SQLSetConfigMode flags */ -#if (ODBCVER >= 0x0300) -#define ODBC_BOTH_DSN 0 -#define ODBC_USER_DSN 1 -#define ODBC_SYSTEM_DSN 2 -#endif /* ODBCVER >= 0x0300 */ - -/* SQLInstallerError code */ -#if (ODBCVER >= 0x0300) -#define ODBC_ERROR_GENERAL_ERR 1 -#define ODBC_ERROR_INVALID_BUFF_LEN 2 -#define ODBC_ERROR_INVALID_HWND 3 -#define ODBC_ERROR_INVALID_STR 4 -#define ODBC_ERROR_INVALID_REQUEST_TYPE 5 -#define ODBC_ERROR_COMPONENT_NOT_FOUND 6 -#define ODBC_ERROR_INVALID_NAME 7 -#define ODBC_ERROR_INVALID_KEYWORD_VALUE 8 -#define ODBC_ERROR_INVALID_DSN 9 -#define ODBC_ERROR_INVALID_INF 10 -#define ODBC_ERROR_REQUEST_FAILED 11 -#define ODBC_ERROR_INVALID_PATH 12 -#define ODBC_ERROR_LOAD_LIB_FAILED 13 -#define ODBC_ERROR_INVALID_PARAM_SEQUENCE 14 -#define ODBC_ERROR_INVALID_LOG_FILE 15 -#define ODBC_ERROR_USER_CANCELED 16 -#define ODBC_ERROR_USAGE_UPDATE_FAILED 17 -#define ODBC_ERROR_CREATE_DSN_FAILED 18 -#define ODBC_ERROR_WRITING_SYSINFO_FAILED 19 -#define ODBC_ERROR_REMOVE_DSN_FAILED 20 -#define ODBC_ERROR_OUT_OF_MEM 21 -#define ODBC_ERROR_OUTPUT_STRING_TRUNCATED 22 -#endif /* ODBCVER >= 0x0300 */ - -#ifndef EXPORT -#define EXPORT -#endif - -#ifdef __OS2__ -#define INSTAPI _System -#else -#define INSTAPI -#endif - -/* HIGH LEVEL CALLS */ -BOOL INSTAPI SQLInstallODBC (HWND hwndParent, - LPCSTR lpszInfFile, - LPCSTR lpszSrcPath, - LPCSTR lpszDrivers); -BOOL INSTAPI SQLManageDataSources (HWND hwndParent); -BOOL INSTAPI SQLCreateDataSource (HWND hwndParent, - LPCSTR lpszDSN); -BOOL INSTAPI SQLGetTranslator (HWND hwnd, - LPSTR lpszName, - WORD cbNameMax, - WORD *pcbNameOut, - LPSTR lpszPath, - WORD cbPathMax, - WORD *pcbPathOut, - DWORD *pvOption); - -/* LOW LEVEL CALLS */ -BOOL INSTAPI SQLInstallDriver (LPCSTR lpszInfFile, - LPCSTR lpszDriver, - LPSTR lpszPath, - WORD cbPathMax, - WORD * pcbPathOut); -BOOL INSTAPI SQLInstallDriverManager (LPSTR lpszPath, - WORD cbPathMax, - WORD * pcbPathOut); -BOOL INSTAPI SQLGetInstalledDrivers (LPSTR lpszBuf, - WORD cbBufMax, - WORD * pcbBufOut); -BOOL INSTAPI SQLGetAvailableDrivers (LPCSTR lpszInfFile, - LPSTR lpszBuf, - WORD cbBufMax, - WORD * pcbBufOut); -BOOL INSTAPI SQLConfigDataSource (HWND hwndParent, - WORD fRequest, - LPCSTR lpszDriver, - LPCSTR lpszAttributes); -BOOL INSTAPI SQLRemoveDefaultDataSource(void); -BOOL INSTAPI SQLWriteDSNToIni (LPCSTR lpszDSN, - LPCSTR lpszDriver); -BOOL INSTAPI SQLRemoveDSNFromIni (LPCSTR lpszDSN); -BOOL INSTAPI SQLValidDSN (LPCSTR lpszDSN); - -BOOL INSTAPI SQLWritePrivateProfileString(LPCSTR lpszSection, - LPCSTR lpszEntry, - LPCSTR lpszString, - LPCSTR lpszFilename); - -int INSTAPI SQLGetPrivateProfileString( LPCSTR lpszSection, - LPCSTR lpszEntry, - LPCSTR lpszDefault, - LPSTR lpszRetBuffer, - int cbRetBuffer, - LPCSTR lpszFilename); - -#if (ODBCVER >= 0x0250) -BOOL INSTAPI SQLRemoveDriverManager(LPDWORD lpdwUsageCount); -BOOL INSTAPI SQLInstallTranslator(LPCSTR lpszInfFile, - LPCSTR lpszTranslator, - LPCSTR lpszPathIn, - LPSTR lpszPathOut, - WORD cbPathOutMax, - WORD *pcbPathOut, - WORD fRequest, - LPDWORD lpdwUsageCount); -BOOL INSTAPI SQLRemoveTranslator(LPCSTR lpszTranslator, - LPDWORD lpdwUsageCount); -BOOL INSTAPI SQLRemoveDriver(LPCSTR lpszDriver, - BOOL fRemoveDSN, - LPDWORD lpdwUsageCount); -BOOL INSTAPI SQLConfigDriver(HWND hwndParent, - WORD fRequest, - LPCSTR lpszDriver, - LPCSTR lpszArgs, - LPSTR lpszMsg, - WORD cbMsgMax, - WORD *pcbMsgOut); -#endif - -#if (ODBCVER >= 0x0300) -SQLRETURN INSTAPI SQLInstallerError(WORD iError, - DWORD *pfErrorCode, - LPSTR lpszErrorMsg, - WORD cbErrorMsgMax, - WORD *pcbErrorMsg); -SQLRETURN INSTAPI SQLPostInstallerError(DWORD dwErrorCode, LPCSTR lpszErrMsg); - -BOOL INSTAPI SQLWriteFileDSN(LPCSTR lpszFileName, - LPCSTR lpszAppName, - LPCSTR lpszKeyName, - LPCSTR lpszString); - -BOOL INSTAPI SQLReadFileDSN(LPCSTR lpszFileName, - LPCSTR lpszAppName, - LPCSTR lpszKeyName, - LPSTR lpszString, - WORD cbString, - WORD *pcbString); -BOOL INSTAPI SQLInstallDriverEx(LPCSTR lpszDriver, - LPCSTR lpszPathIn, - LPSTR lpszPathOut, - WORD cbPathOutMax, - WORD *pcbPathOut, - WORD fRequest, - LPDWORD lpdwUsageCount); -BOOL INSTAPI SQLInstallTranslatorEx(LPCSTR lpszTranslator, - LPCSTR lpszPathIn, - LPSTR lpszPathOut, - WORD cbPathOutMax, - WORD *pcbPathOut, - WORD fRequest, - LPDWORD lpdwUsageCount); -BOOL INSTAPI SQLGetConfigMode(UWORD *pwConfigMode); -BOOL INSTAPI SQLSetConfigMode(UWORD wConfigMode); -#endif /* ODBCVER >= 0x0300 */ - -/* Driver specific Setup APIs called by installer */ -BOOL INSTAPI ConfigDSN (HWND hwndParent, - WORD fRequest, - LPCSTR lpszDriver, - LPCSTR lpszAttributes); - -BOOL INSTAPI ConfigTranslator ( HWND hwndParent, - DWORD *pvOption); - -#if (ODBCVER >= 0x0250) -BOOL INSTAPI ConfigDriver(HWND hwndParent, - WORD fRequest, - LPCSTR lpszDriver, - LPCSTR lpszArgs, - LPSTR lpszMsg, - WORD cbMsgMax, - WORD *pcbMsgOut); -#endif - -/* - * UNICODE APIs - */ - -BOOL INSTAPI SQLInstallODBCW (HWND hwndParent, - LPCWSTR lpszInfFile, - LPCWSTR lpszSrcPath, - LPCWSTR lpszDrivers); -BOOL INSTAPI SQLCreateDataSourceW (HWND hwndParent, - LPCWSTR lpszDSN); - -BOOL INSTAPI SQLGetTranslatorW (HWND hwnd, - LPWSTR lpszName, - WORD cbNameMax, - WORD *pcbNameOut, - LPWSTR lpszPath, - WORD cbPathMax, - WORD *pcbPathOut, - DWORD *pvOption); -BOOL INSTAPI SQLInstallDriverW (LPCWSTR lpszInfFile, - LPCWSTR lpszDriver, - LPWSTR lpszPath, - WORD cbPathMax, - WORD * pcbPathOut); -BOOL INSTAPI SQLInstallDriverManagerW (LPWSTR lpszPath, - WORD cbPathMax, - WORD * pcbPathOut); -BOOL INSTAPI SQLGetInstalledDriversW (LPWSTR lpszBuf, - WORD cbBufMax, - WORD * pcbBufOut); -BOOL INSTAPI SQLGetAvailableDriversW (LPCWSTR lpszInfFile, - LPWSTR lpszBuf, - WORD cbBufMax, - WORD * pcbBufOut); -BOOL INSTAPI SQLConfigDataSourceW (HWND hwndParent, - WORD fRequest, - LPCWSTR lpszDriver, - LPCWSTR lpszAttributes); -BOOL INSTAPI SQLWriteDSNToIniW (LPCWSTR lpszDSN, - LPCWSTR lpszDriver); -BOOL INSTAPI SQLRemoveDSNFromIniW (LPCWSTR lpszDSN); -BOOL INSTAPI SQLValidDSNW (LPCWSTR lpszDSN); - -BOOL INSTAPI SQLWritePrivateProfileStringW(LPCWSTR lpszSection, - LPCWSTR lpszEntry, - LPCWSTR lpszString, - LPCWSTR lpszFilename); - -int INSTAPI SQLGetPrivateProfileStringW( LPCWSTR lpszSection, - LPCWSTR lpszEntry, - LPCWSTR lpszDefault, - LPWSTR lpszRetBuffer, - int cbRetBuffer, - LPCWSTR lpszFilename); - -#if (ODBCVER >= 0x0250) -BOOL INSTAPI SQLInstallTranslatorW(LPCWSTR lpszInfFile, - LPCWSTR lpszTranslator, - LPCWSTR lpszPathIn, - LPWSTR lpszPathOut, - WORD cbPathOutMax, - WORD *pcbPathOut, - WORD fRequest, - LPDWORD lpdwUsageCount); -BOOL INSTAPI SQLRemoveTranslatorW(LPCWSTR lpszTranslator, - LPDWORD lpdwUsageCount); -BOOL INSTAPI SQLRemoveDriverW(LPCWSTR lpszDriver, - BOOL fRemoveDSN, - LPDWORD lpdwUsageCount); -BOOL INSTAPI SQLConfigDriverW(HWND hwndParent, - WORD fRequest, - LPCWSTR lpszDriver, - LPCWSTR lpszArgs, - LPWSTR lpszMsg, - WORD cbMsgMax, - WORD *pcbMsgOut); -#endif - -#if (ODBCVER >= 0x0300) -SQLRETURN INSTAPI SQLInstallerErrorW(WORD iError, - DWORD *pfErrorCode, - LPWSTR lpszErrorMsg, - WORD cbErrorMsgMax, - WORD *pcbErrorMsg); -SQLRETURN INSTAPI SQLPostInstallerErrorW(DWORD dwErrorCode, - LPCWSTR lpszErrorMsg); - -BOOL INSTAPI SQLWriteFileDSNW(LPCWSTR lpszFileName, - LPCWSTR lpszAppName, - LPCWSTR lpszKeyName, - LPCWSTR lpszString); - -BOOL INSTAPI SQLReadFileDSNW(LPCWSTR lpszFileName, - LPCWSTR lpszAppName, - LPCWSTR lpszKeyName, - LPWSTR lpszString, - WORD cbString, - WORD *pcbString); -BOOL INSTAPI SQLInstallDriverExW(LPCWSTR lpszDriver, - LPCWSTR lpszPathIn, - LPWSTR lpszPathOut, - WORD cbPathOutMax, - WORD *pcbPathOut, - WORD fRequest, - LPDWORD lpdwUsageCount); -BOOL INSTAPI SQLInstallTranslatorExW(LPCWSTR lpszTranslator, - LPCWSTR lpszPathIn, - LPWSTR lpszPathOut, - WORD cbPathOutMax, - WORD *pcbPathOut, - WORD fRequest, - LPDWORD lpdwUsageCount); -#endif /* ODBCVER >= 0x0300 */ - -/* Driver specific Setup APIs called by installer */ - -BOOL INSTAPI ConfigDSNW (HWND hwndParent, - WORD fRequest, - LPCWSTR lpszDriver, - LPCWSTR lpszAttributes); - - -#if (ODBCVER >= 0x0250) -BOOL INSTAPI ConfigDriverW(HWND hwndParent, - WORD fRequest, - LPCWSTR lpszDriver, - LPCWSTR lpszArgs, - LPWSTR lpszMsg, - WORD cbMsgMax, - WORD *pcbMsgOut); -#endif - -#ifndef SQL_NOUNICODEMAP /* define this to disable the mapping */ -#ifdef UNICODE - -#define SQLInstallODBC SQLInstallODBCW -#define SQLCreateDataSource SQLCreateDataSourceW -#define SQLGetTranslator SQLGetTranslatorW -#define SQLInstallDriver SQLInstallDriverW -#define SQLInstallDriverManager SQLInstallDriverManagerW -#define SQLGetInstalledDrivers SQLGetInstalledDriversW -#define SQLGetAvailableDrivers SQLGetAvailableDriversW -#define SQLConfigDataSource SQLConfigDataSourceW -#define SQLWriteDSNToIni SQLWriteDSNToIniW -#define SQLRemoveDSNFromIni SQLRemoveDSNFromIniW -#define SQLValidDSN SQLValidDSNW -#define SQLWritePrivateProfileString SQLWritePrivateProfileStringW -#define SQLGetPrivateProfileString SQLGetPrivateProfileStringW -#define SQLInstallTranslator SQLInstallTranslatorW -#define SQLRemoveTranslator SQLRemoveTranslatorW -#define SQLRemoveDriver SQLRemoveDriverW -#define SQLConfigDriver SQLConfigDriverW -#define SQLInstallerError SQLInstallerErrorW -#define SQLPostInstallerError SQLPostInstallerErrorW -#define SQLReadFileDSN SQLReadFileDSNW -#define SQLWriteFileDSN SQLWriteFileDSNW -#define SQLInstallDriverEx SQLInstallDriverExW -#define SQLInstallTranslatorEx SQLInstallTranslatorExW - -#endif -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/mssql_python/libs/macos/odbc_include/odbcinstext.h b/mssql_python/libs/macos/odbc_include/odbcinstext.h deleted file mode 100644 index 6bdaf670..00000000 --- a/mssql_python/libs/macos/odbc_include/odbcinstext.h +++ /dev/null @@ -1,369 +0,0 @@ -/************************************************** - * odbcinstext.h - * - ************************************************** - * This code was created by Peter Harvey @ CodeByDesign. - * Released under LGPL 28.JAN.99 - * - * Contributions from... - * ----------------------------------------------- - * Peter Harvey - pharvey@codebydesign.com - **************************************************/ -#ifndef _ODBCINST_H -#define _ODBCINST_H - -#ifdef UNIXODBC_SOURCE - -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_PWD_H -#include -#endif -#ifdef HAVE_SYS_TYPES_H -#include -#endif - -#ifndef ODBCVER -#define ODBCVER 0x0380 -#endif - -#include -#include -#include - -/******************************************************** - * CONSTANTS WHICH DO NOT EXIST ELSEWHERE - ********************************************************/ -#ifndef TRUE -#define FALSE 0; -#define TRUE 1; -#endif - -#else /* not UNIXODBC_SOURCE */ - -/******************************************************** - * outside the unixODBC source tree only the * - * public interface is exposed * - ********************************************************/ - -#include - -/******************************************************** - * these limits are originally defined in ini.h * - * but are needed to implement ODBCINSTGetProperties * - * for the Driver Setup * - ********************************************************/ - -#define INI_MAX_LINE 1000 -#define INI_MAX_OBJECT_NAME INI_MAX_LINE -#define INI_MAX_PROPERTY_NAME INI_MAX_LINE -#define INI_MAX_PROPERTY_VALUE INI_MAX_LINE - -#endif /* UNIXODBC_SOURCE */ - -/******************************************************** - * PUBLIC API - ********************************************************/ - -#ifdef __cplusplus -extern "C" -{ -#endif - -BOOL INSTAPI SQLConfigDataSource( HWND hWnd, - WORD nRequest, - LPCSTR pszDriver, - LPCSTR pszAttributes ); - -BOOL INSTAPI SQLGetConfigMode( UWORD *pnConfigMode ); - -BOOL INSTAPI SQLGetInstalledDrivers( LPSTR pszBuf, - WORD nBufMax, - WORD *pnBufOut ); - -BOOL INSTAPI SQLInstallDriverEx( LPCSTR pszDriver, - LPCSTR pszPathIn, - LPSTR pszPathOut, - WORD nPathOutMax, - WORD *nPathOut, - WORD nRequest, - LPDWORD pnUsageCount ); - -BOOL INSTAPI SQLInstallDriverManager( LPSTR pszPath, - WORD nPathMax, - WORD *pnPathOut ); - -RETCODE INSTAPI SQLInstallerError( WORD nError, - DWORD *pnErrorCode, - LPSTR pszErrorMsg, - WORD nErrorMsgMax, - WORD *nErrorMsg ); - -BOOL INSTAPI SQLManageDataSources( HWND hWnd ); - -BOOL INSTAPI SQLReadFileDSN( LPCSTR pszFileName, - LPCSTR pszAppName, - LPCSTR pszKeyName, - LPSTR pszString, - WORD nString, - WORD *pnString ); - -BOOL INSTAPI SQLRemoveDriver( LPCSTR pszDriver, - BOOL nRemoveDSN, - LPDWORD pnUsageCount ); - -BOOL INSTAPI SQLRemoveDriverManager( LPDWORD pnUsageCount ); - -BOOL INSTAPI SQLRemoveDSNFromIni( LPCSTR pszDSN ); - -BOOL INSTAPI SQLRemoveTranslator( LPCSTR pszTranslator, - LPDWORD pnUsageCount ); - -BOOL INSTAPI SQLSetConfigMode( UWORD nConfigMode ); - -BOOL INSTAPI SQLValidDSN( LPCSTR pszDSN ); - -BOOL INSTAPI SQLWriteDSNToIni( LPCSTR pszDSN, - LPCSTR pszDriver ); - -BOOL INSTAPI SQLWriteFileDSN( LPCSTR pszFileName, - LPCSTR pszAppName, - LPCSTR pszKeyName, - LPCSTR pszString ); - -BOOL INSTAPI SQLWritePrivateProfileString( - LPCSTR pszSection, - LPCSTR pszEntry, - LPCSTR pszString, - LPCSTR pszFileName ); - - - -#ifdef __cplusplus -} -#endif - -#ifdef UNIXODBC_SOURCE - -/******************************************************** - * PRIVATE API - ********************************************************/ -#if defined(__cplusplus) - extern "C" { -#endif - -BOOL _odbcinst_UserINI( - char *pszFileName, - BOOL bVerify ); - -BOOL _odbcinst_SystemINI( - char *pszFileName, - BOOL bVerify ); - -BOOL _odbcinst_FileINI( char *pszPath ); - -char * INSTAPI odbcinst_system_file_path( char *buffer ); -char * INSTAPI odbcinst_system_file_name( char *buffer ); -char * INSTAPI odbcinst_user_file_path( char *buffer ); -char * INSTAPI odbcinst_user_file_name( char *buffer ); - -BOOL _odbcinst_ConfigModeINI( - char *pszFileName ); - -int _odbcinst_GetSections( - HINI hIni, - LPSTR pRetBuffer, - int nRetBuffer, - int *pnBufPos ); - -int _odbcinst_GetEntries( - HINI hIni, - LPCSTR pszSection, - LPSTR pRetBuffer, - int nRetBuffer, - int *pnBufPos ); - -int _SQLGetInstalledDrivers( - LPCSTR pszSection, - LPCSTR pszEntry, - LPCSTR pszDefault, - LPCSTR pRetBuffer, - int nRetBuffer ); - -BOOL _SQLWriteInstalledDrivers( - LPCSTR pszSection, - LPCSTR pszEntry, - LPCSTR pszString ); - -BOOL _SQLDriverConnectPrompt( - HWND hwnd, - SQLCHAR *dsn, - SQLSMALLINT len_dsn ); - -BOOL _SQLDriverConnectPromptW( - HWND hwnd, - SQLWCHAR *dsn, - SQLSMALLINT len_dsn ); - -void __set_config_mode( int mode ); -int __get_config_mode( void ); - -int inst_logPushMsg( - char *pszModule, - char *pszFunctionName, - int nLine, - int nSeverity, - int nCode, - char *pszMessage ); - -int inst_logPeekMsg( long nMsg, HLOGMSG *phMsg ); -int inst_logClear(); - - -/* - * we should look at caching this info, the calls can become expensive - */ - -#ifndef DISABLE_INI_CACHING - -struct ini_cache -{ - char *fname; - char *section; - char *entry; - char *value; - char *default_value; - int buffer_size; - int ret_value; - int config_mode; - long timestamp; - struct ini_cache *next; -}; - -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* UNIXODBC_SOURCE */ - -/********************************* - * ODBCINST - PROPERTIES - ********************************* - * - * PURPOSE: - * - * To provide the caller a mechanism to interact with Data Source properties - * containing Driver specific options while avoiding embedding GUI code in - * the ODBC infrastructure. - * - * DETAILS: - * - * 1. Application calls libodbcinst.ODBCINSTConstructProperties() - * - odbcinst will load the driver and call libMyDrvS.ODBCINSTGetProperties() to build a list of all possible properties - * 2. Application calls libodbcinst.ODBCINSTSetProperty() - * - use, as required, to init values (ie if configuring existing DataSource) - * - use libodbcinst.SetConfigMode() & libodbcinst.SQLGetPrivateProfileString() to read existing Data Source info (do not forget to set the mode back) - * - do not forget to set mode back to ODBC_BOTH_DSN using SetConfigMode() when done reading - * - no call to Driver Setup - * 3. Application calls libodbcinst.ODBCINSTValidateProperty() - * - use as required (ie on leave widget event) - * - an assesment of the entire property list is also done - * - this is passed onto the driver setup DLL - * 4. Application should refresh widgets in case aPromptData or szValue has changed - * - refresh should occur for each property where bRefresh = 1 - * 5. Application calls libodbcinst.ODBCINSTValidateProperties() - * - call this just before saving new Data Source or updating existing Data Source - * - should always call this before saving - * - use libodbcinst.SetConfigMode() & libodbcinst.SQLWritePrivateProfileString() to save Data Source info - * - do not forget to set mode back to ODBC_BOTH_DSN using SetConfigMode() when done saving - * - this is passed onto the driver setup DLL - * 6. Application calls ODBCINSTDestructProperties() to free up memory - * - unload Driver Setup DLL - * - frees memory (Driver Setup allocates most of the memory but we free ALL of it in odbcinst) - * - * NOTES - * - * 1. odbcinst implements 5 functions to support this GUI config stuff - * 2. Driver Setup DLL implements just 3 functions for its share of the work - * - *********************************/ - -#define ODBCINST_SUCCESS 0 -#define ODBCINST_WARNING 1 -#define ODBCINST_ERROR 2 - -#define ODBCINST_PROMPTTYPE_LABEL 0 /* readonly */ -#define ODBCINST_PROMPTTYPE_TEXTEDIT 1 -#define ODBCINST_PROMPTTYPE_LISTBOX 2 -#define ODBCINST_PROMPTTYPE_COMBOBOX 3 -#define ODBCINST_PROMPTTYPE_FILENAME 4 -#define ODBCINST_PROMPTTYPE_HIDDEN 5 -#define ODBCINST_PROMPTTYPE_TEXTEDIT_PASSWORD 6 - -typedef struct tODBCINSTPROPERTY -{ - struct tODBCINSTPROPERTY *pNext; /* pointer to next property, NULL if last property */ - - char szName[INI_MAX_PROPERTY_NAME+1]; /* property name */ - char szValue[INI_MAX_PROPERTY_VALUE+1]; /* property value */ - int nPromptType; /* PROMPTTYPE_TEXTEDIT, PROMPTTYPE_LISTBOX, PROMPTTYPE_COMBOBOX, PROMPTTYPE_FILENAME */ - char **aPromptData; /* array of pointers terminated with a NULL value in array. */ - char *pszHelp; /* help on this property (driver setups should keep it short) */ - void *pWidget; /* CALLER CAN STORE A POINTER TO ? HERE */ - int bRefresh; /* app should refresh widget ie Driver Setup has changed aPromptData or szValue */ - void *hDLL; /* for odbcinst internal use... only first property has valid one */ -} ODBCINSTPROPERTY, *HODBCINSTPROPERTY; - -/* - * Plugin name - */ - -#define ODBCINSTPLUGIN "odbcinstQ5" - -/* - * Conversion routines for wide interface - */ - -char* _multi_string_alloc_and_copy( LPCWSTR in ); -char* _single_string_alloc_and_copy( LPCWSTR in ); -void _single_string_copy_to_wide( SQLWCHAR *out, LPCSTR in, int len ); -int _multi_string_copy_to_wide( SQLWCHAR *out, LPCSTR in, int len ); -int _single_copy_to_wide( SQLWCHAR *out, LPCSTR in, int len ); -SQLWCHAR* _multi_string_alloc_and_expand( LPCSTR in ); -SQLWCHAR* _single_string_alloc_and_expand( LPCSTR in ); -void _single_copy_from_wide( SQLCHAR *out, LPCWSTR in, int len ); -int _multi_string_length( LPCSTR in ); - -/* - * To support finding UI plugin - */ -char *_getUIPluginName( char *pszName, char *pszUI ); -char *_appendUIPluginExtension( char *pszNameAndExtension, char *pszName ); -char *_prependUIPluginPath( char *pszPathAndName, char *pszName ); - -#if defined(__cplusplus) - extern "C" { -#endif - -/* ONLY IMPLEMENTED IN ODBCINST (not in Driver Setup) */ -int INSTAPI ODBCINSTConstructProperties( char *szDriver, HODBCINSTPROPERTY *hFirstProperty ); -int INSTAPI ODBCINSTSetProperty( HODBCINSTPROPERTY hFirstProperty, char *pszProperty, char *pszValue ); -int INSTAPI ODBCINSTDestructProperties( HODBCINSTPROPERTY *hFirstProperty ); -int INSTAPI ODBCINSTAddProperty( HODBCINSTPROPERTY hFirstProperty, char *pszProperty, char *pszValue ); - -/* IMPLEMENTED IN ODBCINST AND DRIVER SETUP */ -int INSTAPI ODBCINSTValidateProperty( HODBCINSTPROPERTY hFirstProperty, char *pszProperty, char *pszMessage ); -int INSTAPI ODBCINSTValidateProperties( HODBCINSTPROPERTY hFirstProperty, HODBCINSTPROPERTY hBadProperty, char *pszMessage ); - -/* ONLY IMPLEMENTED IN DRIVER SETUP (not in ODBCINST) */ -int INSTAPI ODBCINSTGetProperties( HODBCINSTPROPERTY hFirstProperty ); - -#if defined(__cplusplus) - } -#endif - -#endif - diff --git a/mssql_python/libs/macos/odbc_include/sql.h b/mssql_python/libs/macos/odbc_include/sql.h deleted file mode 100644 index 7f0ce009..00000000 --- a/mssql_python/libs/macos/odbc_include/sql.h +++ /dev/null @@ -1,839 +0,0 @@ -/************************************************** - * sql.h - * - * These should be consistent with the MS version. - * - **************************************************/ -#ifndef __SQL_H -#define __SQL_H - - -/**************************** - * default to 3.51 declare something else before here and you get a whole new ball of wax - ***************************/ -#ifndef ODBCVER -#define ODBCVER 0x0380 -#endif - -#ifndef __SQLTYPES_H -#include "sqltypes.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/**************************** - * some ret values - ***************************/ -#define SQL_NULL_DATA (-1) -#define SQL_DATA_AT_EXEC (-2) -#define SQL_SUCCESS 0 -#define SQL_SUCCESS_WITH_INFO 1 -#if (ODBCVER >= 0x0300) -#define SQL_NO_DATA 100 -#endif -#define SQL_ERROR (-1) -#define SQL_INVALID_HANDLE (-2) -#define SQL_STILL_EXECUTING 2 -#define SQL_NEED_DATA 99 -#define SQL_SUCCEEDED(rc) (((rc)&(~1))==0) - -#if (ODBCVER >= 0x0380) -#define SQL_PARAM_DATA_AVAILABLE 101 -#endif - -/**************************** - * use these to indicate string termination to some function - ***************************/ -#define SQL_NTS (-3) -#define SQL_NTSL (-3L) - -/* maximum message length */ -#define SQL_MAX_MESSAGE_LENGTH 512 - -/* date/time length constants */ -#if (ODBCVER >= 0x0300) -#define SQL_DATE_LEN 10 -#define SQL_TIME_LEN 8 /* add P+1 if precision is nonzero */ -#define SQL_TIMESTAMP_LEN 19 /* add P+1 if precision is nonzero */ -#endif - -/* handle type identifiers */ -#if (ODBCVER >= 0x0300) -#define SQL_HANDLE_ENV 1 -#define SQL_HANDLE_DBC 2 -#define SQL_HANDLE_STMT 3 -#define SQL_HANDLE_DESC 4 -#endif - -/* environment attribute */ -#if (ODBCVER >= 0x0300) -#define SQL_ATTR_OUTPUT_NTS 10001 -#endif - -/* connection attributes */ -#if (ODBCVER >= 0x0300) -#define SQL_ATTR_AUTO_IPD 10001 -#define SQL_ATTR_METADATA_ID 10014 -#endif /* ODBCVER >= 0x0300 */ - -/* statement attributes */ -#if (ODBCVER >= 0x0300) -#define SQL_ATTR_APP_ROW_DESC 10010 -#define SQL_ATTR_APP_PARAM_DESC 10011 -#define SQL_ATTR_IMP_ROW_DESC 10012 -#define SQL_ATTR_IMP_PARAM_DESC 10013 -#define SQL_ATTR_CURSOR_SCROLLABLE (-1) -#define SQL_ATTR_CURSOR_SENSITIVITY (-2) -#endif - -/* SQL_ATTR_CURSOR_SCROLLABLE values */ -#if (ODBCVER >= 0x0300) -#define SQL_NONSCROLLABLE 0 -#define SQL_SCROLLABLE 1 -#endif /* ODBCVER >= 0x0300 */ - -/* identifiers of fields in the SQL descriptor */ -#if (ODBCVER >= 0x0300) -#define SQL_DESC_COUNT 1001 -#define SQL_DESC_TYPE 1002 -#define SQL_DESC_LENGTH 1003 -#define SQL_DESC_OCTET_LENGTH_PTR 1004 -#define SQL_DESC_PRECISION 1005 -#define SQL_DESC_SCALE 1006 -#define SQL_DESC_DATETIME_INTERVAL_CODE 1007 -#define SQL_DESC_NULLABLE 1008 -#define SQL_DESC_INDICATOR_PTR 1009 -#define SQL_DESC_DATA_PTR 1010 -#define SQL_DESC_NAME 1011 -#define SQL_DESC_UNNAMED 1012 -#define SQL_DESC_OCTET_LENGTH 1013 -#define SQL_DESC_ALLOC_TYPE 1099 -#endif - -/* identifiers of fields in the diagnostics area */ -#if (ODBCVER >= 0x0300) -#define SQL_DIAG_RETURNCODE 1 -#define SQL_DIAG_NUMBER 2 -#define SQL_DIAG_ROW_COUNT 3 -#define SQL_DIAG_SQLSTATE 4 -#define SQL_DIAG_NATIVE 5 -#define SQL_DIAG_MESSAGE_TEXT 6 -#define SQL_DIAG_DYNAMIC_FUNCTION 7 -#define SQL_DIAG_CLASS_ORIGIN 8 -#define SQL_DIAG_SUBCLASS_ORIGIN 9 -#define SQL_DIAG_CONNECTION_NAME 10 -#define SQL_DIAG_SERVER_NAME 11 -#define SQL_DIAG_DYNAMIC_FUNCTION_CODE 12 -#endif - -/* dynamic function codes */ -#if (ODBCVER >= 0x0300) -#define SQL_DIAG_ALTER_DOMAIN 3 -#define SQL_DIAG_ALTER_TABLE 4 -#define SQL_DIAG_CALL 7 -#define SQL_DIAG_CREATE_ASSERTION 6 -#define SQL_DIAG_CREATE_CHARACTER_SET 8 -#define SQL_DIAG_CREATE_COLLATION 10 -#define SQL_DIAG_CREATE_DOMAIN 23 -#define SQL_DIAG_CREATE_INDEX (-1) -#define SQL_DIAG_CREATE_SCHEMA 64 -#define SQL_DIAG_CREATE_TABLE 77 -#define SQL_DIAG_CREATE_TRANSLATION 79 -#define SQL_DIAG_CREATE_VIEW 84 -#define SQL_DIAG_DELETE_WHERE 19 -#define SQL_DIAG_DROP_ASSERTION 24 -#define SQL_DIAG_DROP_CHARACTER_SET 25 -#define SQL_DIAG_DROP_COLLATION 26 -#define SQL_DIAG_DROP_DOMAIN 27 -#define SQL_DIAG_DROP_INDEX (-2) -#define SQL_DIAG_DROP_SCHEMA 31 -#define SQL_DIAG_DROP_TABLE 32 -#define SQL_DIAG_DROP_TRANSLATION 33 -#define SQL_DIAG_DROP_VIEW 36 -#define SQL_DIAG_DYNAMIC_DELETE_CURSOR 38 -#define SQL_DIAG_DYNAMIC_UPDATE_CURSOR 81 -#define SQL_DIAG_GRANT 48 -#define SQL_DIAG_INSERT 50 -#define SQL_DIAG_REVOKE 59 -#define SQL_DIAG_SELECT_CURSOR 85 -#define SQL_DIAG_UNKNOWN_STATEMENT 0 -#define SQL_DIAG_UPDATE_WHERE 82 -#endif /* ODBCVER >= 0x0300 */ - -/* SQL data type codes */ -#define SQL_UNKNOWN_TYPE 0 -#define SQL_CHAR 1 -#define SQL_NUMERIC 2 -#define SQL_DECIMAL 3 -#define SQL_INTEGER 4 -#define SQL_SMALLINT 5 -#define SQL_FLOAT 6 -#define SQL_REAL 7 -#define SQL_DOUBLE 8 -#if (ODBCVER >= 0x0300) -#define SQL_DATETIME 9 -#endif -#define SQL_VARCHAR 12 - -/* One-parameter shortcuts for date/time data types */ -#if (ODBCVER >= 0x0300) -#define SQL_TYPE_DATE 91 -#define SQL_TYPE_TIME 92 -#define SQL_TYPE_TIMESTAMP 93 -#endif - -/* Statement attribute values for cursor sensitivity */ -#if (ODBCVER >= 0x0300) -#define SQL_UNSPECIFIED 0 -#define SQL_INSENSITIVE 1 -#define SQL_SENSITIVE 2 -#endif - -/* GetTypeInfo() request for all data types */ -#define SQL_ALL_TYPES 0 - -/* Default conversion code for SQLBindCol(), SQLBindParam() and SQLGetData() */ -#if (ODBCVER >= 0x0300) -#define SQL_DEFAULT 99 -#endif - -/* SQLGetData() code indicating that the application row descriptor - * specifies the data type - */ -#if (ODBCVER >= 0x0300) -#define SQL_ARD_TYPE (-99) -#endif - -/* SQL date/time type subcodes */ -#if (ODBCVER >= 0x0300) -#define SQL_CODE_DATE 1 -#define SQL_CODE_TIME 2 -#define SQL_CODE_TIMESTAMP 3 -#endif - -/* CLI option values */ -#if (ODBCVER >= 0x0300) -#define SQL_FALSE 0 -#define SQL_TRUE 1 -#endif - -/* values of NULLABLE field in descriptor */ -#define SQL_NO_NULLS 0 -#define SQL_NULLABLE 1 - -/* Value returned by SQLGetTypeInfo() to denote that it is - * not known whether or not a data type supports null values. - */ -#define SQL_NULLABLE_UNKNOWN 2 - -/* Values returned by SQLGetTypeInfo() to show WHERE clause - * supported - */ -#if (ODBCVER >= 0x0300) -#define SQL_PRED_NONE 0 -#define SQL_PRED_CHAR 1 -#define SQL_PRED_BASIC 2 -#endif - -/* values of UNNAMED field in descriptor */ -#if (ODBCVER >= 0x0300) -#define SQL_NAMED 0 -#define SQL_UNNAMED 1 -#endif - -/* values of ALLOC_TYPE field in descriptor */ -#if (ODBCVER >= 0x0300) -#define SQL_DESC_ALLOC_AUTO 1 -#define SQL_DESC_ALLOC_USER 2 -#endif - -/* FreeStmt() options */ -#define SQL_CLOSE 0 -#define SQL_DROP 1 -#define SQL_UNBIND 2 -#define SQL_RESET_PARAMS 3 - -/* Codes used for FetchOrientation in SQLFetchScroll(), - and in SQLDataSources() -*/ -#define SQL_FETCH_NEXT 1 -#define SQL_FETCH_FIRST 2 - -/* Other codes used for FetchOrientation in SQLFetchScroll() */ -#define SQL_FETCH_LAST 3 -#define SQL_FETCH_PRIOR 4 -#define SQL_FETCH_ABSOLUTE 5 -#define SQL_FETCH_RELATIVE 6 - -/* SQLEndTran() options */ -#define SQL_COMMIT 0 -#define SQL_ROLLBACK 1 - -/* null handles returned by SQLAllocHandle() */ -#define SQL_NULL_HENV 0 -#define SQL_NULL_HDBC 0 -#define SQL_NULL_HSTMT 0 -#if (ODBCVER >= 0x0300) -#define SQL_NULL_HDESC 0 -#define SQL_NULL_DESC 0 -#endif - -/* null handle used in place of parent handle when allocating HENV */ -#if (ODBCVER >= 0x0300) -#define SQL_NULL_HANDLE 0L -#endif - -/* Values that may appear in the result set of SQLSpecialColumns() */ -#define SQL_SCOPE_CURROW 0 -#define SQL_SCOPE_TRANSACTION 1 -#define SQL_SCOPE_SESSION 2 - -#define SQL_PC_UNKNOWN 0 -#if (ODBCVER >= 0x0300) -#define SQL_PC_NON_PSEUDO 1 -#endif -#define SQL_PC_PSEUDO 2 - -/* Reserved value for the IdentifierType argument of SQLSpecialColumns() */ -#if (ODBCVER >= 0x0300) -#define SQL_ROW_IDENTIFIER 1 -#endif - -/* Reserved values for UNIQUE argument of SQLStatistics() */ -#define SQL_INDEX_UNIQUE 0 -#define SQL_INDEX_ALL 1 - -/* Values that may appear in the result set of SQLStatistics() */ -#define SQL_INDEX_CLUSTERED 1 -#define SQL_INDEX_HASHED 2 -#define SQL_INDEX_OTHER 3 - -/* SQLGetFunctions() values to identify ODBC APIs */ -#define SQL_API_SQLALLOCCONNECT 1 -#define SQL_API_SQLALLOCENV 2 -#if (ODBCVER >= 0x0300) -#define SQL_API_SQLALLOCHANDLE 1001 -#endif -#define SQL_API_SQLALLOCSTMT 3 -#define SQL_API_SQLBINDCOL 4 -#if (ODBCVER >= 0x0300) -#define SQL_API_SQLBINDPARAM 1002 -#endif -#define SQL_API_SQLCANCEL 5 -#if (ODBCVER >= 0x0300) -#define SQL_API_SQLCLOSECURSOR 1003 -#define SQL_API_SQLCOLATTRIBUTE 6 -#endif -#define SQL_API_SQLCOLUMNS 40 -#define SQL_API_SQLCONNECT 7 -#if (ODBCVER >= 0x0300) -#define SQL_API_SQLCOPYDESC 1004 -#endif -#define SQL_API_SQLDATASOURCES 57 -#define SQL_API_SQLDESCRIBECOL 8 -#define SQL_API_SQLDISCONNECT 9 -#if (ODBCVER >= 0x0300) -#define SQL_API_SQLENDTRAN 1005 -#endif -#define SQL_API_SQLERROR 10 -#define SQL_API_SQLEXECDIRECT 11 -#define SQL_API_SQLEXECUTE 12 -#define SQL_API_SQLFETCH 13 -#if (ODBCVER >= 0x0300) -#define SQL_API_SQLFETCHSCROLL 1021 -#endif -#define SQL_API_SQLFREECONNECT 14 -#define SQL_API_SQLFREEENV 15 -#if (ODBCVER >= 0x0300) -#define SQL_API_SQLFREEHANDLE 1006 -#endif -#define SQL_API_SQLFREESTMT 16 -#if (ODBCVER >= 0x0300) -#define SQL_API_SQLGETCONNECTATTR 1007 -#endif -#define SQL_API_SQLGETCONNECTOPTION 42 -#define SQL_API_SQLGETCURSORNAME 17 -#define SQL_API_SQLGETDATA 43 -#if (ODBCVER >= 0x0300) -#define SQL_API_SQLGETDESCFIELD 1008 -#define SQL_API_SQLGETDESCREC 1009 -#define SQL_API_SQLGETDIAGFIELD 1010 -#define SQL_API_SQLGETDIAGREC 1011 -#define SQL_API_SQLGETENVATTR 1012 -#endif -#define SQL_API_SQLGETFUNCTIONS 44 -#define SQL_API_SQLGETINFO 45 -#if (ODBCVER >= 0x0300) -#define SQL_API_SQLGETSTMTATTR 1014 -#endif -#define SQL_API_SQLGETSTMTOPTION 46 -#define SQL_API_SQLGETTYPEINFO 47 -#define SQL_API_SQLNUMRESULTCOLS 18 -#define SQL_API_SQLPARAMDATA 48 -#define SQL_API_SQLPREPARE 19 -#define SQL_API_SQLPUTDATA 49 -#define SQL_API_SQLROWCOUNT 20 -#if (ODBCVER >= 0x0300) -#define SQL_API_SQLSETCONNECTATTR 1016 -#endif -#define SQL_API_SQLSETCONNECTOPTION 50 -#define SQL_API_SQLSETCURSORNAME 21 -#if (ODBCVER >= 0x0300) -#define SQL_API_SQLSETDESCFIELD 1017 -#define SQL_API_SQLSETDESCREC 1018 -#define SQL_API_SQLSETENVATTR 1019 -#endif -#define SQL_API_SQLSETPARAM 22 -#if (ODBCVER >= 0x0300) -#define SQL_API_SQLSETSTMTATTR 1020 -#endif -#define SQL_API_SQLSETSTMTOPTION 51 -#define SQL_API_SQLSPECIALCOLUMNS 52 -#define SQL_API_SQLSTATISTICS 53 -#define SQL_API_SQLTABLES 54 -#define SQL_API_SQLTRANSACT 23 - -#if (ODBCVER >= 0x0380) -#define SQL_API_SQLCANCELHANDLE 1022 -#endif - -/* Information requested by SQLGetInfo() */ -#if (ODBCVER >= 0x0300) -#define SQL_MAX_DRIVER_CONNECTIONS 0 -#define SQL_MAXIMUM_DRIVER_CONNECTIONS SQL_MAX_DRIVER_CONNECTIONS -#define SQL_MAX_CONCURRENT_ACTIVITIES 1 -#define SQL_MAXIMUM_CONCURRENT_ACTIVITIES SQL_MAX_CONCURRENT_ACTIVITIES -#endif -#define SQL_DATA_SOURCE_NAME 2 -#define SQL_FETCH_DIRECTION 8 -#define SQL_SERVER_NAME 13 -#define SQL_SEARCH_PATTERN_ESCAPE 14 -#define SQL_DBMS_NAME 17 -#define SQL_DBMS_VER 18 -#define SQL_ACCESSIBLE_TABLES 19 -#define SQL_ACCESSIBLE_PROCEDURES 20 -#define SQL_CURSOR_COMMIT_BEHAVIOR 23 -#define SQL_DATA_SOURCE_READ_ONLY 25 -#define SQL_DEFAULT_TXN_ISOLATION 26 -#define SQL_IDENTIFIER_CASE 28 -#define SQL_IDENTIFIER_QUOTE_CHAR 29 -#define SQL_MAX_COLUMN_NAME_LEN 30 -#define SQL_MAXIMUM_COLUMN_NAME_LENGTH SQL_MAX_COLUMN_NAME_LEN -#define SQL_MAX_CURSOR_NAME_LEN 31 -#define SQL_MAXIMUM_CURSOR_NAME_LENGTH SQL_MAX_CURSOR_NAME_LEN -#define SQL_MAX_SCHEMA_NAME_LEN 32 -#define SQL_MAXIMUM_SCHEMA_NAME_LENGTH SQL_MAX_SCHEMA_NAME_LEN -#define SQL_MAX_CATALOG_NAME_LEN 34 -#define SQL_MAXIMUM_CATALOG_NAME_LENGTH SQL_MAX_CATALOG_NAME_LEN -#define SQL_MAX_TABLE_NAME_LEN 35 -#define SQL_SCROLL_CONCURRENCY 43 -#define SQL_TXN_CAPABLE 46 -#define SQL_TRANSACTION_CAPABLE SQL_TXN_CAPABLE -#define SQL_USER_NAME 47 -#define SQL_TXN_ISOLATION_OPTION 72 -#define SQL_TRANSACTION_ISOLATION_OPTION SQL_TXN_ISOLATION_OPTION -#define SQL_INTEGRITY 73 -#define SQL_GETDATA_EXTENSIONS 81 -#define SQL_NULL_COLLATION 85 -#define SQL_ALTER_TABLE 86 -#define SQL_ORDER_BY_COLUMNS_IN_SELECT 90 -#define SQL_SPECIAL_CHARACTERS 94 -#define SQL_MAX_COLUMNS_IN_GROUP_BY 97 -#define SQL_MAXIMUM_COLUMNS_IN_GROUP_BY SQL_MAX_COLUMNS_IN_GROUP_BY -#define SQL_MAX_COLUMNS_IN_INDEX 98 -#define SQL_MAXIMUM_COLUMNS_IN_INDEX SQL_MAX_COLUMNS_IN_INDEX -#define SQL_MAX_COLUMNS_IN_ORDER_BY 99 -#define SQL_MAXIMUM_COLUMNS_IN_ORDER_BY SQL_MAX_COLUMNS_IN_ORDER_BY -#define SQL_MAX_COLUMNS_IN_SELECT 100 -#define SQL_MAXIMUM_COLUMNS_IN_SELECT SQL_MAX_COLUMNS_IN_SELECT -#define SQL_MAX_COLUMNS_IN_TABLE 101 -#define SQL_MAX_INDEX_SIZE 102 -#define SQL_MAXIMUM_INDEX_SIZE SQL_MAX_INDEX_SIZE -#define SQL_MAX_ROW_SIZE 104 -#define SQL_MAXIMUM_ROW_SIZE SQL_MAX_ROW_SIZE -#define SQL_MAX_STATEMENT_LEN 105 -#define SQL_MAXIMUM_STATEMENT_LENGTH SQL_MAX_STATEMENT_LEN -#define SQL_MAX_TABLES_IN_SELECT 106 -#define SQL_MAXIMUM_TABLES_IN_SELECT SQL_MAX_TABLES_IN_SELECT -#define SQL_MAX_USER_NAME_LEN 107 -#define SQL_MAXIMUM_USER_NAME_LENGTH SQL_MAX_USER_NAME_LEN -#if (ODBCVER >= 0x0300) -#define SQL_OJ_CAPABILITIES 115 -#define SQL_OUTER_JOIN_CAPABILITIES SQL_OJ_CAPABILITIES -#endif /* ODBCVER >= 0x0300 */ - -#if (ODBCVER >= 0x0300) -#define SQL_XOPEN_CLI_YEAR 10000 -#define SQL_CURSOR_SENSITIVITY 10001 -#define SQL_DESCRIBE_PARAMETER 10002 -#define SQL_CATALOG_NAME 10003 -#define SQL_COLLATION_SEQ 10004 -#define SQL_MAX_IDENTIFIER_LEN 10005 -#define SQL_MAXIMUM_IDENTIFIER_LENGTH SQL_MAX_IDENTIFIER_LEN -#endif /* ODBCVER >= 0x0300 */ - -/* SQL_ALTER_TABLE bitmasks */ -#if (ODBCVER >= 0x0200) -#define SQL_AT_ADD_COLUMN 0x00000001L -#define SQL_AT_DROP_COLUMN 0x00000002L -#endif /* ODBCVER >= 0x0200 */ - -#if (ODBCVER >= 0x0300) -#define SQL_AT_ADD_CONSTRAINT 0x00000008L - -/* The following bitmasks are ODBC extensions and defined in sqlext.h -*#define SQL_AT_COLUMN_SINGLE 0x00000020L -*#define SQL_AT_ADD_COLUMN_DEFAULT 0x00000040L -*#define SQL_AT_ADD_COLUMN_COLLATION 0x00000080L -*#define SQL_AT_SET_COLUMN_DEFAULT 0x00000100L -*#define SQL_AT_DROP_COLUMN_DEFAULT 0x00000200L -*#define SQL_AT_DROP_COLUMN_CASCADE 0x00000400L -*#define SQL_AT_DROP_COLUMN_RESTRICT 0x00000800L -*#define SQL_AT_ADD_TABLE_CONSTRAINT 0x00001000L -*#define SQL_AT_DROP_TABLE_CONSTRAINT_CASCADE 0x00002000L -*#define SQL_AT_DROP_TABLE_CONSTRAINT_RESTRICT 0x00004000L -*#define SQL_AT_CONSTRAINT_NAME_DEFINITION 0x00008000L -*#define SQL_AT_CONSTRAINT_INITIALLY_DEFERRED 0x00010000L -*#define SQL_AT_CONSTRAINT_INITIALLY_IMMEDIATE 0x00020000L -*#define SQL_AT_CONSTRAINT_DEFERRABLE 0x00040000L -*#define SQL_AT_CONSTRAINT_NON_DEFERRABLE 0x00080000L -*/ -#endif /* ODBCVER >= 0x0300 */ - - -/* SQL_ASYNC_MODE values */ -#if (ODBCVER >= 0x0300) -#define SQL_AM_NONE 0 -#define SQL_AM_CONNECTION 1 -#define SQL_AM_STATEMENT 2 -#endif - -/* SQL_CURSOR_COMMIT_BEHAVIOR values */ -#define SQL_CB_DELETE 0 -#define SQL_CB_CLOSE 1 -#define SQL_CB_PRESERVE 2 - -/* SQL_FETCH_DIRECTION bitmasks */ -#define SQL_FD_FETCH_NEXT 0x00000001L -#define SQL_FD_FETCH_FIRST 0x00000002L -#define SQL_FD_FETCH_LAST 0x00000004L -#define SQL_FD_FETCH_PRIOR 0x00000008L -#define SQL_FD_FETCH_ABSOLUTE 0x00000010L -#define SQL_FD_FETCH_RELATIVE 0x00000020L - -/* SQL_GETDATA_EXTENSIONS bitmasks */ -#define SQL_GD_ANY_COLUMN 0x00000001L -#define SQL_GD_ANY_ORDER 0x00000002L - -/* SQL_IDENTIFIER_CASE values */ -#define SQL_IC_UPPER 1 -#define SQL_IC_LOWER 2 -#define SQL_IC_SENSITIVE 3 -#define SQL_IC_MIXED 4 - -/* SQL_OJ_CAPABILITIES bitmasks */ -/* NB: this means 'outer join', not what you may be thinking */ - - -#if (ODBCVER >= 0x0201) -#define SQL_OJ_LEFT 0x00000001L -#define SQL_OJ_RIGHT 0x00000002L -#define SQL_OJ_FULL 0x00000004L -#define SQL_OJ_NESTED 0x00000008L -#define SQL_OJ_NOT_ORDERED 0x00000010L -#define SQL_OJ_INNER 0x00000020L -#define SQL_OJ_ALL_COMPARISON_OPS 0x00000040L -#endif - -/* SQL_SCROLL_CONCURRENCY bitmasks */ -#define SQL_SCCO_READ_ONLY 0x00000001L -#define SQL_SCCO_LOCK 0x00000002L -#define SQL_SCCO_OPT_ROWVER 0x00000004L -#define SQL_SCCO_OPT_VALUES 0x00000008L - -/* SQL_TXN_CAPABLE values */ -#define SQL_TC_NONE 0 -#define SQL_TC_DML 1 -#define SQL_TC_ALL 2 -#define SQL_TC_DDL_COMMIT 3 -#define SQL_TC_DDL_IGNORE 4 - -/* SQL_TXN_ISOLATION_OPTION bitmasks */ -#define SQL_TXN_READ_UNCOMMITTED 0x00000001L -#define SQL_TRANSACTION_READ_UNCOMMITTED SQL_TXN_READ_UNCOMMITTED -#define SQL_TXN_READ_COMMITTED 0x00000002L -#define SQL_TRANSACTION_READ_COMMITTED SQL_TXN_READ_COMMITTED -#define SQL_TXN_REPEATABLE_READ 0x00000004L -#define SQL_TRANSACTION_REPEATABLE_READ SQL_TXN_REPEATABLE_READ -#define SQL_TXN_SERIALIZABLE 0x00000008L -#define SQL_TRANSACTION_SERIALIZABLE SQL_TXN_SERIALIZABLE - -/* SQL_NULL_COLLATION values */ -#define SQL_NC_HIGH 0 -#define SQL_NC_LOW 1 - - SQLRETURN SQL_API SQLAllocConnect(SQLHENV EnvironmentHandle, - SQLHDBC *ConnectionHandle); - - SQLRETURN SQL_API SQLAllocEnv(SQLHENV *EnvironmentHandle); - -#if (ODBCVER >= 0x0300) - SQLRETURN SQL_API SQLAllocHandle(SQLSMALLINT HandleType, - SQLHANDLE InputHandle, SQLHANDLE *OutputHandle); -#endif - - SQLRETURN SQL_API SQLAllocStmt(SQLHDBC ConnectionHandle, - SQLHSTMT *StatementHandle); - - SQLRETURN SQL_API SQLBindCol(SQLHSTMT StatementHandle, - SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, - SQLPOINTER TargetValue, SQLLEN BufferLength, - SQLLEN *StrLen_or_Ind); - -#if (ODBCVER >= 0x0300) - SQLRETURN SQL_API SQLBindParam(SQLHSTMT StatementHandle, - SQLUSMALLINT ParameterNumber, SQLSMALLINT ValueType, - SQLSMALLINT ParameterType, SQLULEN LengthPrecision, - SQLSMALLINT ParameterScale, SQLPOINTER ParameterValue, - SQLLEN *StrLen_or_Ind); -#endif - - SQLRETURN SQL_API SQLCancel(SQLHSTMT StatementHandle); - -#if (ODBCVER >= 0x0380) -SQLRETURN SQL_API SQLCancelHandle(SQLSMALLINT HandleType, SQLHANDLE InputHandle); -#endif - - -#if (ODBCVER >= 0x0300) - SQLRETURN SQL_API SQLCloseCursor(SQLHSTMT StatementHandle); - - SQLRETURN SQL_API SQLColAttribute(SQLHSTMT StatementHandle, - SQLUSMALLINT ColumnNumber, SQLUSMALLINT FieldIdentifier, - SQLPOINTER CharacterAttribute, SQLSMALLINT BufferLength, - SQLSMALLINT *StringLength, SQLLEN *NumericAttribute ); - - /* spec says (SQLPOINTER) not (SQLEN*) - PAH */ - /* Ms now say SQLLEN* - http://msdn.microsoft.com/library/en-us/odbc/htm/dasdkodbcoverview_64bit.asp - NG */ - -#endif - - - SQLRETURN SQL_API SQLColumns(SQLHSTMT StatementHandle, - SQLCHAR *CatalogName, SQLSMALLINT NameLength1, - SQLCHAR *SchemaName, SQLSMALLINT NameLength2, - SQLCHAR *TableName, SQLSMALLINT NameLength3, - SQLCHAR *ColumnName, SQLSMALLINT NameLength4); - - - SQLRETURN SQL_API SQLConnect(SQLHDBC ConnectionHandle, - SQLCHAR *ServerName, SQLSMALLINT NameLength1, - SQLCHAR *UserName, SQLSMALLINT NameLength2, - SQLCHAR *Authentication, SQLSMALLINT NameLength3); - -#if (ODBCVER >= 0x0300) - SQLRETURN SQL_API SQLCopyDesc(SQLHDESC SourceDescHandle, - SQLHDESC TargetDescHandle); -#endif - - SQLRETURN SQL_API SQLDataSources(SQLHENV EnvironmentHandle, - SQLUSMALLINT Direction, SQLCHAR *ServerName, - SQLSMALLINT BufferLength1, SQLSMALLINT *NameLength1, - SQLCHAR *Description, SQLSMALLINT BufferLength2, - SQLSMALLINT *NameLength2); - - SQLRETURN SQL_API SQLDescribeCol(SQLHSTMT StatementHandle, - SQLUSMALLINT ColumnNumber, SQLCHAR *ColumnName, - SQLSMALLINT BufferLength, SQLSMALLINT *NameLength, - SQLSMALLINT *DataType, SQLULEN *ColumnSize, - SQLSMALLINT *DecimalDigits, SQLSMALLINT *Nullable); - - SQLRETURN SQL_API SQLDisconnect(SQLHDBC ConnectionHandle); - -#if (ODBCVER >= 0x0300) - SQLRETURN SQL_API SQLEndTran(SQLSMALLINT HandleType, SQLHANDLE Handle, - SQLSMALLINT CompletionType); -#endif - - SQLRETURN SQL_API SQLError(SQLHENV EnvironmentHandle, - SQLHDBC ConnectionHandle, SQLHSTMT StatementHandle, - SQLCHAR *Sqlstate, SQLINTEGER *NativeError, - SQLCHAR *MessageText, SQLSMALLINT BufferLength, - SQLSMALLINT *TextLength); - - SQLRETURN SQL_API SQLExecDirect(SQLHSTMT StatementHandle, - SQLCHAR *StatementText, SQLINTEGER TextLength); - - SQLRETURN SQL_API SQLExecute(SQLHSTMT StatementHandle); - - SQLRETURN SQL_API SQLFetch(SQLHSTMT StatementHandle); - -#if (ODBCVER >= 0x0300) - SQLRETURN SQL_API SQLFetchScroll(SQLHSTMT StatementHandle, - SQLSMALLINT FetchOrientation, SQLLEN FetchOffset); -#endif - - SQLRETURN SQL_API SQLFreeConnect(SQLHDBC ConnectionHandle); - - SQLRETURN SQL_API SQLFreeEnv(SQLHENV EnvironmentHandle); - -#if (ODBCVER >= 0x0300) - SQLRETURN SQL_API SQLFreeHandle(SQLSMALLINT HandleType, SQLHANDLE Handle); -#endif - - SQLRETURN SQL_API SQLFreeStmt(SQLHSTMT StatementHandle, - SQLUSMALLINT Option); - -#if (ODBCVER >= 0x0300) - SQLRETURN SQL_API SQLGetConnectAttr(SQLHDBC ConnectionHandle, - SQLINTEGER Attribute, SQLPOINTER Value, - SQLINTEGER BufferLength, SQLINTEGER *StringLength); -#endif - - SQLRETURN SQL_API SQLGetConnectOption(SQLHDBC ConnectionHandle, - SQLUSMALLINT Option, SQLPOINTER Value); - - SQLRETURN SQL_API SQLGetCursorName(SQLHSTMT StatementHandle, - SQLCHAR *CursorName, SQLSMALLINT BufferLength, - SQLSMALLINT *NameLength); - - SQLRETURN SQL_API SQLGetData(SQLHSTMT StatementHandle, - SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, - SQLPOINTER TargetValue, SQLLEN BufferLength, - SQLLEN *StrLen_or_Ind); - -#if (ODBCVER >= 0x0300) - SQLRETURN SQLGetDescField(SQLHDESC DescriptorHandle, - SQLSMALLINT RecNumber, SQLSMALLINT FieldIdentifier, - SQLPOINTER Value, SQLINTEGER BufferLength, - SQLINTEGER *StringLength); - - SQLRETURN SQL_API SQLGetDescRec(SQLHDESC DescriptorHandle, - SQLSMALLINT RecNumber, SQLCHAR *Name, - SQLSMALLINT BufferLength, SQLSMALLINT *StringLength, - SQLSMALLINT *Type, SQLSMALLINT *SubType, - SQLLEN *Length, SQLSMALLINT *Precision, - SQLSMALLINT *Scale, SQLSMALLINT *Nullable); - - SQLRETURN SQL_API SQLGetDiagField(SQLSMALLINT HandleType, SQLHANDLE Handle, - SQLSMALLINT RecNumber, SQLSMALLINT DiagIdentifier, - SQLPOINTER DiagInfo, SQLSMALLINT BufferLength, - SQLSMALLINT *StringLength); - - SQLRETURN SQL_API SQLGetDiagRec(SQLSMALLINT HandleType, SQLHANDLE Handle, - SQLSMALLINT RecNumber, SQLCHAR *Sqlstate, - SQLINTEGER *NativeError, SQLCHAR *MessageText, - SQLSMALLINT BufferLength, SQLSMALLINT *TextLength); - - SQLRETURN SQL_API SQLGetEnvAttr(SQLHENV EnvironmentHandle, - SQLINTEGER Attribute, SQLPOINTER Value, - SQLINTEGER BufferLength, SQLINTEGER *StringLength); -#endif /* ODBCVER >= 0x0300 */ - - SQLRETURN SQL_API SQLGetFunctions(SQLHDBC ConnectionHandle, - SQLUSMALLINT FunctionId, SQLUSMALLINT *Supported); - - SQLRETURN SQL_API SQLGetInfo(SQLHDBC ConnectionHandle, - SQLUSMALLINT InfoType, SQLPOINTER InfoValue, - SQLSMALLINT BufferLength, SQLSMALLINT *StringLength); - -#if (ODBCVER >= 0x0300) - SQLRETURN SQL_API SQLGetStmtAttr(SQLHSTMT StatementHandle, - SQLINTEGER Attribute, SQLPOINTER Value, - SQLINTEGER BufferLength, SQLINTEGER *StringLength); -#endif /* ODBCVER >= 0x0300 */ - - SQLRETURN SQL_API SQLGetStmtOption(SQLHSTMT StatementHandle, - SQLUSMALLINT Option, SQLPOINTER Value); - - SQLRETURN SQL_API SQLGetTypeInfo(SQLHSTMT StatementHandle, - SQLSMALLINT DataType); - - SQLRETURN SQL_API SQLNumResultCols(SQLHSTMT StatementHandle, - SQLSMALLINT *ColumnCount); - - SQLRETURN SQL_API SQLParamData(SQLHSTMT StatementHandle, - SQLPOINTER *Value); - - SQLRETURN SQL_API SQLPrepare(SQLHSTMT StatementHandle, - SQLCHAR *StatementText, SQLINTEGER TextLength); - - SQLRETURN SQL_API SQLPutData(SQLHSTMT StatementHandle, - SQLPOINTER Data, SQLLEN StrLen_or_Ind); - - SQLRETURN SQL_API SQLRowCount(SQLHSTMT StatementHandle, - SQLLEN *RowCount); - -#if (ODBCVER >= 0x0300) - SQLRETURN SQL_API SQLSetConnectAttr(SQLHDBC ConnectionHandle, - SQLINTEGER Attribute, SQLPOINTER Value, - SQLINTEGER StringLength); -#endif /* ODBCVER >= 0x0300 */ - - SQLRETURN SQL_API SQLSetConnectOption(SQLHDBC ConnectionHandle, - SQLUSMALLINT Option, SQLULEN Value); - - SQLRETURN SQL_API SQLSetCursorName(SQLHSTMT StatementHandle, - SQLCHAR *CursorName, SQLSMALLINT NameLength); - -#if (ODBCVER >= 0x0300) - SQLRETURN SQL_API SQLSetDescField(SQLHDESC DescriptorHandle, - SQLSMALLINT RecNumber, SQLSMALLINT FieldIdentifier, - SQLPOINTER Value, SQLINTEGER BufferLength); - - SQLRETURN SQL_API SQLSetDescRec(SQLHDESC DescriptorHandle, - SQLSMALLINT RecNumber, SQLSMALLINT Type, - SQLSMALLINT SubType, SQLLEN Length, - SQLSMALLINT Precision, SQLSMALLINT Scale, - SQLPOINTER Data, SQLLEN *StringLength, - SQLLEN *Indicator); - - SQLRETURN SQL_API SQLSetEnvAttr(SQLHENV EnvironmentHandle, - SQLINTEGER Attribute, SQLPOINTER Value, - SQLINTEGER StringLength); -#endif /* ODBCVER >= 0x0300 */ - - SQLRETURN SQL_API SQLSetParam(SQLHSTMT StatementHandle, - SQLUSMALLINT ParameterNumber, SQLSMALLINT ValueType, - SQLSMALLINT ParameterType, SQLULEN LengthPrecision, - SQLSMALLINT ParameterScale, SQLPOINTER ParameterValue, - SQLLEN *StrLen_or_Ind); - -#if (ODBCVER >= 0x0300) - SQLRETURN SQL_API SQLSetStmtAttr(SQLHSTMT StatementHandle, - SQLINTEGER Attribute, SQLPOINTER Value, - SQLINTEGER StringLength); -#endif - - SQLRETURN SQL_API SQLSetStmtOption(SQLHSTMT StatementHandle, - SQLUSMALLINT Option, SQLULEN Value); - - SQLRETURN SQL_API SQLSpecialColumns(SQLHSTMT StatementHandle, - SQLUSMALLINT IdentifierType, SQLCHAR *CatalogName, - SQLSMALLINT NameLength1, SQLCHAR *SchemaName, - SQLSMALLINT NameLength2, SQLCHAR *TableName, - SQLSMALLINT NameLength3, SQLUSMALLINT Scope, - SQLUSMALLINT Nullable); - - SQLRETURN SQL_API SQLStatistics(SQLHSTMT StatementHandle, - SQLCHAR *CatalogName, SQLSMALLINT NameLength1, - SQLCHAR *SchemaName, SQLSMALLINT NameLength2, - SQLCHAR *TableName, SQLSMALLINT NameLength3, - SQLUSMALLINT Unique, SQLUSMALLINT Reserved); - - SQLRETURN SQL_API SQLTables(SQLHSTMT StatementHandle, - SQLCHAR *CatalogName, SQLSMALLINT NameLength1, - SQLCHAR *SchemaName, SQLSMALLINT NameLength2, - SQLCHAR *TableName, SQLSMALLINT NameLength3, - SQLCHAR *TableType, SQLSMALLINT NameLength4); - - SQLRETURN SQL_API SQLTransact(SQLHENV EnvironmentHandle, - SQLHDBC ConnectionHandle, SQLUSMALLINT CompletionType); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/mssql_python/libs/macos/odbc_include/sqlext.h b/mssql_python/libs/macos/odbc_include/sqlext.h deleted file mode 100644 index 30954618..00000000 --- a/mssql_python/libs/macos/odbc_include/sqlext.h +++ /dev/null @@ -1,2204 +0,0 @@ -/***************************************************** - * sqlext.h - * - * These should be consistent with the MS version. - * - *****************************************************/ -#ifndef __SQLEXT_H -#define __SQLEXT_H - - -/* BEGIN - unixODBC ONLY (programs like ODBCConfig and DataManager use these) */ - -/* COLUMNS IN SQLTables() RESULT SET */ -#define SQLTables_TABLE_CATALOG 1 -#define SQLTables_TABLE_SCHEM 2 -#define SQLTables_TABLE_NAME 3 -#define SQLTables_TABLE_TYPE 4 -#define SQLTables_REMARKS 5 - -/* COLUMNS IN SQLColumns() RESULT SET */ -#define SQLColumns_TABLE_CAT 1 -#define SQLColumns_TABLE_SCHEM 2 -#define SQLColumns_TABLE_NAME 3 -#define SQLColumns_COLUMN_NAME 4 -#define SQLColumns_DATA_TYPE 5 -#define SQLColumns_TYPE_NAME 6 -#define SQLColumns_COLUMN_SIZE 7 -#define SQLColumns_BUFFER_LENGTH 8 -#define SQLColumns_DECIMAL_DIGITS 9 -#define SQLColumns_NUM_PREC_RADIX 10 -#define SQLColumns_NULLABLE 11 -#define SQLColumns_REMARKS 12 -#define SQLColumns_COLUMN_DEF 13 -#define SQLColumns_SQL_DATA_TYPE 14 -#define SQLColumns_SQL_DATETIME_SUB 15 -#define SQLColumns_CHAR_OCTET_LENGTH 16 -#define SQLColumns_ORDINAL_POSITION 17 -#define SQLColumns_IS_NULLABLE 18 - -/* END - unixODBC ONLY */ - -#ifndef __SQL_H -#include "sql.h" -#endif - -#ifdef __cplusplus -extern "C" { /* Assume C declarations for C++ */ -#endif - -/* generally useful constants */ -#define SQL_SPEC_MAJOR 3 /* Major version of specification */ -#define SQL_SPEC_MINOR 52 /* Minor version of specification */ -#define SQL_SPEC_STRING "03.52" /* String constant for version */ - -#define SQL_SQLSTATE_SIZE 5 /* size of SQLSTATE */ -#define SQL_MAX_DSN_LENGTH 32 /* maximum data source name size */ - -#define SQL_MAX_OPTION_STRING_LENGTH 256 - -/* return code SQL_NO_DATA_FOUND is the same as SQL_NO_DATA */ -#if (ODBCVER < 0x0300) -#define SQL_NO_DATA_FOUND 100 -#else -#define SQL_NO_DATA_FOUND SQL_NO_DATA -#endif - -/* an end handle type */ -#if (ODBCVER >= 0x0300) -#define SQL_HANDLE_SENV 5 -#endif /* ODBCVER >= 0x0300 */ - -/* env attribute */ -#if (ODBCVER >= 0x0300) -#define SQL_ATTR_ODBC_VERSION 200 -#define SQL_ATTR_CONNECTION_POOLING 201 -#define SQL_ATTR_CP_MATCH 202 - -/* unixODBC additions */ -#define SQL_ATTR_UNIXODBC_SYSPATH 65001 -#define SQL_ATTR_UNIXODBC_VERSION 65002 -#define SQL_ATTR_UNIXODBC_ENVATTR 65003 -#endif /* ODBCVER >= 0x0300 */ - -#if (ODBCVER >= 0x0300) -/* values for SQL_ATTR_CONNECTION_POOLING */ -#define SQL_CP_OFF 0UL -#define SQL_CP_ONE_PER_DRIVER 1UL -#define SQL_CP_ONE_PER_HENV 2UL -#define SQL_CP_DEFAULT SQL_CP_OFF - -/* values for SQL_ATTR_CP_MATCH */ -#define SQL_CP_STRICT_MATCH 0UL -#define SQL_CP_RELAXED_MATCH 1UL -#define SQL_CP_MATCH_DEFAULT SQL_CP_STRICT_MATCH - -/* values for SQL_ATTR_ODBC_VERSION */ -#define SQL_OV_ODBC2 2UL -#define SQL_OV_ODBC3 3UL -#endif /* ODBCVER >= 0x0300 */ - -#if (ODBCVER >= 0x0380) -/* new values for SQL_ATTR_ODBC_VERSION */ -/* From ODBC 3.8 onwards, we should use * 100 + */ -#define SQL_OV_ODBC3_80 380UL -#endif /* ODBCVER >= 0x0380 */ - -/* connection attributes */ -#define SQL_ACCESS_MODE 101 -#define SQL_AUTOCOMMIT 102 -#define SQL_LOGIN_TIMEOUT 103 -#define SQL_OPT_TRACE 104 -#define SQL_OPT_TRACEFILE 105 -#define SQL_TRANSLATE_DLL 106 -#define SQL_TRANSLATE_OPTION 107 -#define SQL_TXN_ISOLATION 108 -#define SQL_CURRENT_QUALIFIER 109 -#define SQL_ODBC_CURSORS 110 -#define SQL_QUIET_MODE 111 -#define SQL_PACKET_SIZE 112 - -/* connection attributes with new names */ -#if (ODBCVER >= 0x0300) -#define SQL_ATTR_ACCESS_MODE SQL_ACCESS_MODE -#define SQL_ATTR_AUTOCOMMIT SQL_AUTOCOMMIT -#define SQL_ATTR_CONNECTION_TIMEOUT 113 -#define SQL_ATTR_CURRENT_CATALOG SQL_CURRENT_QUALIFIER -#define SQL_ATTR_DISCONNECT_BEHAVIOR 114 -#define SQL_ATTR_ENLIST_IN_DTC 1207 -#define SQL_ATTR_ENLIST_IN_XA 1208 -#define SQL_ATTR_LOGIN_TIMEOUT SQL_LOGIN_TIMEOUT -#define SQL_ATTR_ODBC_CURSORS SQL_ODBC_CURSORS -#define SQL_ATTR_PACKET_SIZE SQL_PACKET_SIZE -#define SQL_ATTR_QUIET_MODE SQL_QUIET_MODE -#define SQL_ATTR_TRACE SQL_OPT_TRACE -#define SQL_ATTR_TRACEFILE SQL_OPT_TRACEFILE -#define SQL_ATTR_TRANSLATE_LIB SQL_TRANSLATE_DLL -#define SQL_ATTR_TRANSLATE_OPTION SQL_TRANSLATE_OPTION -#define SQL_ATTR_TXN_ISOLATION SQL_TXN_ISOLATION -#endif /* ODBCVER >= 0x0300 */ - -#define SQL_ATTR_CONNECTION_DEAD 1209 /* GetConnectAttr only */ - -#define SQL_ATTR_DRIVER_THREADING 1028 /* Driver threading level */ - -#if (ODBCVER >= 0x0351) -/* ODBC Driver Manager sets this connection attribute to a unicode driver - (which supports SQLConnectW) when the application is an ANSI application - (which calls SQLConnect, SQLDriverConnect, or SQLBrowseConnect). - This is SetConnectAttr only and application does not set this attribute - This attribute was introduced because some unicode driver's some APIs may - need to behave differently on ANSI or Unicode applications. A unicode - driver, which has same behavior for both ANSI or Unicode applications, - should return SQL_ERROR when the driver manager sets this connection - attribute. When a unicode driver returns SQL_SUCCESS on this attribute, - the driver manager treates ANSI and Unicode connections differently in - connection pooling. -*/ -#define SQL_ATTR_ANSI_APP 115 -#endif - -#if (ODBCVER >= 0x0380) -#define SQL_ATTR_RESET_CONNECTION 116 -#define SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE 117 -#endif - -/* SQL_CONNECT_OPT_DRVR_START is not meaningful for 3.0 driver */ -#if (ODBCVER < 0x0300) -#define SQL_CONNECT_OPT_DRVR_START 1000 -#endif /* ODBCVER < 0x0300 */ - -#if (ODBCVER < 0x0300) -#define SQL_CONN_OPT_MAX SQL_PACKET_SIZE -#define SQL_CONN_OPT_MIN SQL_ACCESS_MODE -#endif /* ODBCVER < 0x0300 */ - -/* SQL_ACCESS_MODE options */ -#define SQL_MODE_READ_WRITE 0UL -#define SQL_MODE_READ_ONLY 1UL -#define SQL_MODE_DEFAULT SQL_MODE_READ_WRITE - -/* SQL_AUTOCOMMIT options */ -#define SQL_AUTOCOMMIT_OFF 0UL -#define SQL_AUTOCOMMIT_ON 1UL -#define SQL_AUTOCOMMIT_DEFAULT SQL_AUTOCOMMIT_ON - -/* SQL_LOGIN_TIMEOUT options */ -#define SQL_LOGIN_TIMEOUT_DEFAULT 15UL - -/* SQL_OPT_TRACE options */ -#define SQL_OPT_TRACE_OFF 0UL -#define SQL_OPT_TRACE_ON 1UL -#define SQL_OPT_TRACE_DEFAULT SQL_OPT_TRACE_OFF -#ifdef _WINDOWS_ -#define SQL_OPT_TRACE_FILE_DEFAULT "\\temp\\SQL.LOG" -#else -#define SQL_OPT_TRACE_FILE_DEFAULT "/tmp/SQL.LOG" -#endif - -/* SQL_ODBC_CURSORS options */ -#define SQL_CUR_USE_IF_NEEDED 0UL -#define SQL_CUR_USE_ODBC 1UL -#define SQL_CUR_USE_DRIVER 2UL -#define SQL_CUR_DEFAULT SQL_CUR_USE_DRIVER - -#if (ODBCVER >= 0x0300) -/* values for SQL_ATTR_DISCONNECT_BEHAVIOR */ -#define SQL_DB_RETURN_TO_POOL 0UL -#define SQL_DB_DISCONNECT 1UL -#define SQL_DB_DEFAULT SQL_DB_RETURN_TO_POOL - -/* values for SQL_ATTR_ENLIST_IN_DTC */ -#define SQL_DTC_DONE 0L -#endif /* ODBCVER >= 0x0300 */ - -/* values for SQL_ATTR_CONNECTION_DEAD */ -#define SQL_CD_TRUE 1L /* Connection is closed/dead */ -#define SQL_CD_FALSE 0L /* Connection is open/available */ - -/* values for SQL_ATTR_ANSI_APP */ -#if (ODBCVER >= 0x0351) -#define SQL_AA_TRUE 1L /* the application is an ANSI app */ -#define SQL_AA_FALSE 0L /* the application is a Unicode app */ -#endif - -/* values for SQL_ATTR_RESET_CONNECTION */ -#if (ODBCVER >= 0x0380) -#define SQL_RESET_CONNECTION_YES 1UL -#endif - -/* values for SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE */ -#if (ODBCVER >= 0x0380) -#define SQL_ASYNC_DBC_ENABLE_ON 1UL -#define SQL_ASYNC_DBC_ENABLE_OFF 0UL -#define SQL_ASYNC_DBC_ENABLE_DEFAULT SQL_ASYNC_DBC_ENABLE_OFF -#endif - -/* statement attributes */ -#define SQL_QUERY_TIMEOUT 0 -#define SQL_MAX_ROWS 1 -#define SQL_NOSCAN 2 -#define SQL_MAX_LENGTH 3 -#define SQL_ASYNC_ENABLE 4 /* same as SQL_ATTR_ASYNC_ENABLE */ -#define SQL_BIND_TYPE 5 -#define SQL_CURSOR_TYPE 6 -#define SQL_CONCURRENCY 7 -#define SQL_KEYSET_SIZE 8 -#define SQL_ROWSET_SIZE 9 -#define SQL_SIMULATE_CURSOR 10 -#define SQL_RETRIEVE_DATA 11 -#define SQL_USE_BOOKMARKS 12 -#define SQL_GET_BOOKMARK 13 /* GetStmtOption Only */ -#define SQL_ROW_NUMBER 14 /* GetStmtOption Only */ - -/* statement attributes for ODBC 3.0 */ -#if (ODBCVER >= 0x0300) -#define SQL_ATTR_ASYNC_ENABLE 4 -#define SQL_ATTR_CONCURRENCY SQL_CONCURRENCY -#define SQL_ATTR_CURSOR_TYPE SQL_CURSOR_TYPE -#define SQL_ATTR_ENABLE_AUTO_IPD 15 -#define SQL_ATTR_FETCH_BOOKMARK_PTR 16 -#define SQL_ATTR_KEYSET_SIZE SQL_KEYSET_SIZE -#define SQL_ATTR_MAX_LENGTH SQL_MAX_LENGTH -#define SQL_ATTR_MAX_ROWS SQL_MAX_ROWS -#define SQL_ATTR_NOSCAN SQL_NOSCAN -#define SQL_ATTR_PARAM_BIND_OFFSET_PTR 17 -#define SQL_ATTR_PARAM_BIND_TYPE 18 -#define SQL_ATTR_PARAM_OPERATION_PTR 19 -#define SQL_ATTR_PARAM_STATUS_PTR 20 -#define SQL_ATTR_PARAMS_PROCESSED_PTR 21 -#define SQL_ATTR_PARAMSET_SIZE 22 -#define SQL_ATTR_QUERY_TIMEOUT SQL_QUERY_TIMEOUT -#define SQL_ATTR_RETRIEVE_DATA SQL_RETRIEVE_DATA -#define SQL_ATTR_ROW_BIND_OFFSET_PTR 23 -#define SQL_ATTR_ROW_BIND_TYPE SQL_BIND_TYPE -#define SQL_ATTR_ROW_NUMBER SQL_ROW_NUMBER /*GetStmtAttr*/ -#define SQL_ATTR_ROW_OPERATION_PTR 24 -#define SQL_ATTR_ROW_STATUS_PTR 25 -#define SQL_ATTR_ROWS_FETCHED_PTR 26 -#define SQL_ATTR_ROW_ARRAY_SIZE 27 -#define SQL_ATTR_SIMULATE_CURSOR SQL_SIMULATE_CURSOR -#define SQL_ATTR_USE_BOOKMARKS SQL_USE_BOOKMARKS - -#endif /* ODBCVER >= 0x0300 */ - -#if (ODBCVER >= 0x0380) -#define SQL_ATTR_ASYNC_STMT_EVENT 29 -#endif /* ODBCVER >= 0x0380 */ - -#if (ODBCVER < 0x0300) -#define SQL_STMT_OPT_MAX SQL_ROW_NUMBER -#define SQL_STMT_OPT_MIN SQL_QUERY_TIMEOUT -#endif /* ODBCVER < 0x0300 */ - -/* New defines for SEARCHABLE column in SQLGetTypeInfo */ - -#if (ODBCVER >= 0x0300) -#define SQL_COL_PRED_CHAR SQL_LIKE_ONLY -#define SQL_COL_PRED_BASIC SQL_ALL_EXCEPT_LIKE -#endif /* ODBCVER >= 0x0300 */ - - - -/* whether an attribute is a pointer or not */ -#if (ODBCVER >= 0x0300) -#define SQL_IS_POINTER (-4) -#define SQL_IS_UINTEGER (-5) -#define SQL_IS_INTEGER (-6) -#define SQL_IS_USMALLINT (-7) -#define SQL_IS_SMALLINT (-8) -#endif /* ODBCVER >= 0x0300 */ - -/* the value of SQL_ATTR_PARAM_BIND_TYPE */ -#if (ODBCVER >= 0x0300) -#define SQL_PARAM_BIND_BY_COLUMN 0UL -#define SQL_PARAM_BIND_TYPE_DEFAULT SQL_PARAM_BIND_BY_COLUMN -#endif /* ODBCVER >= 0x0300 */ - -/* SQL_QUERY_TIMEOUT options */ -#define SQL_QUERY_TIMEOUT_DEFAULT 0UL - -/* SQL_MAX_ROWS options */ -#define SQL_MAX_ROWS_DEFAULT 0UL - -/* SQL_NOSCAN options */ -#define SQL_NOSCAN_OFF 0UL /* 1.0 FALSE */ -#define SQL_NOSCAN_ON 1UL /* 1.0 TRUE */ -#define SQL_NOSCAN_DEFAULT SQL_NOSCAN_OFF - -/* SQL_MAX_LENGTH options */ -#define SQL_MAX_LENGTH_DEFAULT 0UL - -/* values for SQL_ATTR_ASYNC_ENABLE */ -#define SQL_ASYNC_ENABLE_OFF 0UL -#define SQL_ASYNC_ENABLE_ON 1UL -#define SQL_ASYNC_ENABLE_DEFAULT SQL_ASYNC_ENABLE_OFF - -/* SQL_BIND_TYPE options */ -#define SQL_BIND_BY_COLUMN 0UL -#define SQL_BIND_TYPE_DEFAULT SQL_BIND_BY_COLUMN /* Default value */ - -/* SQL_CONCURRENCY options */ -#define SQL_CONCUR_READ_ONLY 1 -#define SQL_CONCUR_LOCK 2 -#define SQL_CONCUR_ROWVER 3 -#define SQL_CONCUR_VALUES 4 -#define SQL_CONCUR_DEFAULT SQL_CONCUR_READ_ONLY /* Default value */ - -/* SQL_CURSOR_TYPE options */ -#define SQL_CURSOR_FORWARD_ONLY 0UL -#define SQL_CURSOR_KEYSET_DRIVEN 1UL -#define SQL_CURSOR_DYNAMIC 2UL -#define SQL_CURSOR_STATIC 3UL -#define SQL_CURSOR_TYPE_DEFAULT SQL_CURSOR_FORWARD_ONLY /* Default value */ - -/* SQL_ROWSET_SIZE options */ -#define SQL_ROWSET_SIZE_DEFAULT 1UL - -/* SQL_KEYSET_SIZE options */ -#define SQL_KEYSET_SIZE_DEFAULT 0UL - -/* SQL_SIMULATE_CURSOR options */ -#define SQL_SC_NON_UNIQUE 0UL -#define SQL_SC_TRY_UNIQUE 1UL -#define SQL_SC_UNIQUE 2UL - -/* SQL_RETRIEVE_DATA options */ -#define SQL_RD_OFF 0UL -#define SQL_RD_ON 1UL -#define SQL_RD_DEFAULT SQL_RD_ON - -/* SQL_USE_BOOKMARKS options */ -#define SQL_UB_OFF 0UL -#define SQL_UB_ON 01UL -#define SQL_UB_DEFAULT SQL_UB_OFF - -/* New values for SQL_USE_BOOKMARKS attribute */ -#if (ODBCVER >= 0x0300) -#define SQL_UB_FIXED SQL_UB_ON -#define SQL_UB_VARIABLE 2UL -#endif /* ODBCVER >= 0x0300 */ - -/* extended descriptor field */ -#if (ODBCVER >= 0x0300) -#define SQL_DESC_ARRAY_SIZE 20 -#define SQL_DESC_ARRAY_STATUS_PTR 21 -#define SQL_DESC_AUTO_UNIQUE_VALUE SQL_COLUMN_AUTO_INCREMENT -#define SQL_DESC_BASE_COLUMN_NAME 22 -#define SQL_DESC_BASE_TABLE_NAME 23 -#define SQL_DESC_BIND_OFFSET_PTR 24 -#define SQL_DESC_BIND_TYPE 25 -#define SQL_DESC_CASE_SENSITIVE SQL_COLUMN_CASE_SENSITIVE -#define SQL_DESC_CATALOG_NAME SQL_COLUMN_QUALIFIER_NAME -#define SQL_DESC_CONCISE_TYPE SQL_COLUMN_TYPE -#define SQL_DESC_DATETIME_INTERVAL_PRECISION 26 -#define SQL_DESC_DISPLAY_SIZE SQL_COLUMN_DISPLAY_SIZE -#define SQL_DESC_FIXED_PREC_SCALE SQL_COLUMN_MONEY -#define SQL_DESC_LABEL SQL_COLUMN_LABEL -#define SQL_DESC_LITERAL_PREFIX 27 -#define SQL_DESC_LITERAL_SUFFIX 28 -#define SQL_DESC_LOCAL_TYPE_NAME 29 -#define SQL_DESC_MAXIMUM_SCALE 30 -#define SQL_DESC_MINIMUM_SCALE 31 -#define SQL_DESC_NUM_PREC_RADIX 32 -#define SQL_DESC_PARAMETER_TYPE 33 -#define SQL_DESC_ROWS_PROCESSED_PTR 34 -#if (ODBCVER >= 0x0350) -#define SQL_DESC_ROWVER 35 -#endif /* ODBCVER >= 0x0350 */ -#define SQL_DESC_SCHEMA_NAME SQL_COLUMN_OWNER_NAME -#define SQL_DESC_SEARCHABLE SQL_COLUMN_SEARCHABLE -#define SQL_DESC_TYPE_NAME SQL_COLUMN_TYPE_NAME -#define SQL_DESC_TABLE_NAME SQL_COLUMN_TABLE_NAME -#define SQL_DESC_UNSIGNED SQL_COLUMN_UNSIGNED -#define SQL_DESC_UPDATABLE SQL_COLUMN_UPDATABLE -#endif /* ODBCVER >= 0x0300 */ - - -/* defines for diagnostics fields */ -#if (ODBCVER >= 0x0300) -#define SQL_DIAG_CURSOR_ROW_COUNT (-1249) -#define SQL_DIAG_ROW_NUMBER (-1248) -#define SQL_DIAG_COLUMN_NUMBER (-1247) -#endif /* ODBCVER >= 0x0300 */ - -/* SQL extended datatypes */ -#define SQL_DATE 9 -#if (ODBCVER >= 0x0300) -#define SQL_INTERVAL 10 -#endif /* ODBCVER >= 0x0300 */ -#define SQL_TIME 10 -#define SQL_TIMESTAMP 11 -#define SQL_LONGVARCHAR (-1) -#define SQL_BINARY (-2) -#define SQL_VARBINARY (-3) -#define SQL_LONGVARBINARY (-4) -#define SQL_BIGINT (-5) -#define SQL_TINYINT (-6) -#define SQL_BIT (-7) -#if (ODBCVER >= 0x0350) -#define SQL_GUID (-11) -#endif /* ODBCVER >= 0x0350 */ - -#if (ODBCVER >= 0x0300) -/* interval code */ -#define SQL_CODE_YEAR 1 -#define SQL_CODE_MONTH 2 -#define SQL_CODE_DAY 3 -#define SQL_CODE_HOUR 4 -#define SQL_CODE_MINUTE 5 -#define SQL_CODE_SECOND 6 -#define SQL_CODE_YEAR_TO_MONTH 7 -#define SQL_CODE_DAY_TO_HOUR 8 -#define SQL_CODE_DAY_TO_MINUTE 9 -#define SQL_CODE_DAY_TO_SECOND 10 -#define SQL_CODE_HOUR_TO_MINUTE 11 -#define SQL_CODE_HOUR_TO_SECOND 12 -#define SQL_CODE_MINUTE_TO_SECOND 13 - -#define SQL_INTERVAL_YEAR (100 + SQL_CODE_YEAR) -#define SQL_INTERVAL_MONTH (100 + SQL_CODE_MONTH) -#define SQL_INTERVAL_DAY (100 + SQL_CODE_DAY) -#define SQL_INTERVAL_HOUR (100 + SQL_CODE_HOUR) -#define SQL_INTERVAL_MINUTE (100 + SQL_CODE_MINUTE) -#define SQL_INTERVAL_SECOND (100 + SQL_CODE_SECOND) -#define SQL_INTERVAL_YEAR_TO_MONTH (100 + SQL_CODE_YEAR_TO_MONTH) -#define SQL_INTERVAL_DAY_TO_HOUR (100 + SQL_CODE_DAY_TO_HOUR) -#define SQL_INTERVAL_DAY_TO_MINUTE (100 + SQL_CODE_DAY_TO_MINUTE) -#define SQL_INTERVAL_DAY_TO_SECOND (100 + SQL_CODE_DAY_TO_SECOND) -#define SQL_INTERVAL_HOUR_TO_MINUTE (100 + SQL_CODE_HOUR_TO_MINUTE) -#define SQL_INTERVAL_HOUR_TO_SECOND (100 + SQL_CODE_HOUR_TO_SECOND) -#define SQL_INTERVAL_MINUTE_TO_SECOND (100 + SQL_CODE_MINUTE_TO_SECOND) - -#else -#define SQL_INTERVAL_YEAR (-80) -#define SQL_INTERVAL_MONTH (-81) -#define SQL_INTERVAL_YEAR_TO_MONTH (-82) -#define SQL_INTERVAL_DAY (-83) -#define SQL_INTERVAL_HOUR (-84) -#define SQL_INTERVAL_MINUTE (-85) -#define SQL_INTERVAL_SECOND (-86) -#define SQL_INTERVAL_DAY_TO_HOUR (-87) -#define SQL_INTERVAL_DAY_TO_MINUTE (-88) -#define SQL_INTERVAL_DAY_TO_SECOND (-89) -#define SQL_INTERVAL_HOUR_TO_MINUTE (-90) -#define SQL_INTERVAL_HOUR_TO_SECOND (-91) -#define SQL_INTERVAL_MINUTE_TO_SECOND (-92) -#endif /* ODBCVER >= 0x0300 */ - - -#if (ODBCVER <= 0x0300) -#define SQL_UNICODE (-95) -#define SQL_UNICODE_VARCHAR (-96) -#define SQL_UNICODE_LONGVARCHAR (-97) -#define SQL_UNICODE_CHAR SQL_UNICODE -#else -/* The previous definitions for SQL_UNICODE_ are historical and obsolete */ - -#define SQL_UNICODE SQL_WCHAR -#define SQL_UNICODE_VARCHAR SQL_WVARCHAR -#define SQL_UNICODE_LONGVARCHAR SQL_WLONGVARCHAR -#define SQL_UNICODE_CHAR SQL_WCHAR -#endif - -#if (ODBCVER < 0x0300) -#define SQL_TYPE_DRIVER_START SQL_INTERVAL_YEAR -#define SQL_TYPE_DRIVER_END SQL_UNICODE_LONGVARCHAR -#endif /* ODBCVER < 0x0300 */ - -/* C datatype to SQL datatype mapping SQL types - ------------------- */ -#define SQL_C_CHAR SQL_CHAR /* CHAR, VARCHAR, DECIMAL, NUMERIC */ -#define SQL_C_LONG SQL_INTEGER /* INTEGER */ -#define SQL_C_SHORT SQL_SMALLINT /* SMALLINT */ -#define SQL_C_FLOAT SQL_REAL /* REAL */ -#define SQL_C_DOUBLE SQL_DOUBLE /* FLOAT, DOUBLE */ -#if (ODBCVER >= 0x0300) -#define SQL_C_NUMERIC SQL_NUMERIC -#endif /* ODBCVER >= 0x0300 */ -#define SQL_C_DEFAULT 99 - -#define SQL_SIGNED_OFFSET (-20) -#define SQL_UNSIGNED_OFFSET (-22) - -/* C datatype to SQL datatype mapping */ -#define SQL_C_DATE SQL_DATE -#define SQL_C_TIME SQL_TIME -#define SQL_C_TIMESTAMP SQL_TIMESTAMP -#if (ODBCVER >= 0x0300) -#define SQL_C_TYPE_DATE SQL_TYPE_DATE -#define SQL_C_TYPE_TIME SQL_TYPE_TIME -#define SQL_C_TYPE_TIMESTAMP SQL_TYPE_TIMESTAMP -#define SQL_C_INTERVAL_YEAR SQL_INTERVAL_YEAR -#define SQL_C_INTERVAL_MONTH SQL_INTERVAL_MONTH -#define SQL_C_INTERVAL_DAY SQL_INTERVAL_DAY -#define SQL_C_INTERVAL_HOUR SQL_INTERVAL_HOUR -#define SQL_C_INTERVAL_MINUTE SQL_INTERVAL_MINUTE -#define SQL_C_INTERVAL_SECOND SQL_INTERVAL_SECOND -#define SQL_C_INTERVAL_YEAR_TO_MONTH SQL_INTERVAL_YEAR_TO_MONTH -#define SQL_C_INTERVAL_DAY_TO_HOUR SQL_INTERVAL_DAY_TO_HOUR -#define SQL_C_INTERVAL_DAY_TO_MINUTE SQL_INTERVAL_DAY_TO_MINUTE -#define SQL_C_INTERVAL_DAY_TO_SECOND SQL_INTERVAL_DAY_TO_SECOND -#define SQL_C_INTERVAL_HOUR_TO_MINUTE SQL_INTERVAL_HOUR_TO_MINUTE -#define SQL_C_INTERVAL_HOUR_TO_SECOND SQL_INTERVAL_HOUR_TO_SECOND -#define SQL_C_INTERVAL_MINUTE_TO_SECOND SQL_INTERVAL_MINUTE_TO_SECOND -#endif /* ODBCVER >= 0x0300 */ -#define SQL_C_BINARY SQL_BINARY -#define SQL_C_BIT SQL_BIT -#if (ODBCVER >= 0x0300) -#define SQL_C_SBIGINT (SQL_BIGINT+SQL_SIGNED_OFFSET) /* SIGNED BIGINT */ -#define SQL_C_UBIGINT (SQL_BIGINT+SQL_UNSIGNED_OFFSET) /* UNSIGNED BIGINT */ -#endif /* ODBCVER >= 0x0300 */ -#define SQL_C_TINYINT SQL_TINYINT -#define SQL_C_SLONG (SQL_C_LONG+SQL_SIGNED_OFFSET) /* SIGNED INTEGER */ -#define SQL_C_SSHORT (SQL_C_SHORT+SQL_SIGNED_OFFSET) /* SIGNED SMALLINT */ -#define SQL_C_STINYINT (SQL_TINYINT+SQL_SIGNED_OFFSET) /* SIGNED TINYINT */ -#define SQL_C_ULONG (SQL_C_LONG+SQL_UNSIGNED_OFFSET) /* UNSIGNED INTEGER*/ -#define SQL_C_USHORT (SQL_C_SHORT+SQL_UNSIGNED_OFFSET) /* UNSIGNED SMALLINT*/ -#define SQL_C_UTINYINT (SQL_TINYINT+SQL_UNSIGNED_OFFSET) /* UNSIGNED TINYINT*/ - -#if (ODBCVER >= 0x0300) && (SIZEOF_LONG_INT == 8) && !defined(BUILD_LEGACY_64_BIT_MODE) -#define SQL_C_BOOKMARK SQL_C_UBIGINT /* BOOKMARK */ -#else -#define SQL_C_BOOKMARK SQL_C_ULONG /* BOOKMARK */ -#endif - -#if (ODBCVER >= 0x0350) -#define SQL_C_GUID SQL_GUID -#endif /* ODBCVER >= 0x0350 */ - -#define SQL_TYPE_NULL 0 -#if (ODBCVER < 0x0300) -#define SQL_TYPE_MIN SQL_BIT -#define SQL_TYPE_MAX SQL_VARCHAR -#endif - -/* base value of driver-specific C-Type (max is 0x7fff) */ -/* define driver-specific C-Type, named as SQL_DRIVER_C_TYPE_BASE, */ -/* SQL_DRIVER_C_TYPE_BASE+1, SQL_DRIVER_C_TYPE_BASE+2, etc. */ -#if (ODBCVER >= 0x380) -#define SQL_DRIVER_C_TYPE_BASE 0x4000 -#endif - -/* base value of driver-specific fields/attributes (max are 0x7fff [16-bit] or 0x00007fff [32-bit]) */ -/* define driver-specific SQL-Type, named as SQL_DRIVER_SQL_TYPE_BASE, */ -/* SQL_DRIVER_SQL_TYPE_BASE+1, SQL_DRIVER_SQL_TYPE_BASE+2, etc. */ -/* */ -/* Please note that there is no runtime change in this version of DM. */ -/* However, we suggest that driver manufacturers adhere to this range */ -/* as future versions of the DM may enforce these constraints */ -#if (ODBCVER >= 0x380) -#define SQL_DRIVER_SQL_TYPE_BASE 0x4000 -#define SQL_DRIVER_DESC_FIELD_BASE 0x4000 -#define SQL_DRIVER_DIAG_FIELD_BASE 0x4000 -#define SQL_DRIVER_INFO_TYPE_BASE 0x4000 -#define SQL_DRIVER_CONN_ATTR_BASE 0x00004000 -#define SQL_DRIVER_STMT_ATTR_BASE 0x00004000 -#endif - -#if (ODBCVER >= 0x0300) -#define SQL_C_VARBOOKMARK SQL_C_BINARY -#endif /* ODBCVER >= 0x0300 */ - -/* define for SQL_DIAG_ROW_NUMBER and SQL_DIAG_COLUMN_NUMBER */ -#if (ODBCVER >= 0x0300) -#define SQL_NO_ROW_NUMBER (-1) -#define SQL_NO_COLUMN_NUMBER (-1) -#define SQL_ROW_NUMBER_UNKNOWN (-2) -#define SQL_COLUMN_NUMBER_UNKNOWN (-2) -#endif - -/* SQLBindParameter extensions */ -#define SQL_DEFAULT_PARAM (-5) -#define SQL_IGNORE (-6) -#if (ODBCVER >= 0x0300) -#define SQL_COLUMN_IGNORE SQL_IGNORE -#endif /* ODBCVER >= 0x0300 */ -#define SQL_LEN_DATA_AT_EXEC_OFFSET (-100) -#define SQL_LEN_DATA_AT_EXEC(length) (-(length)+SQL_LEN_DATA_AT_EXEC_OFFSET) - -/* binary length for driver specific attributes */ -#define SQL_LEN_BINARY_ATTR_OFFSET (-100) -#define SQL_LEN_BINARY_ATTR(length) (-(length)+SQL_LEN_BINARY_ATTR_OFFSET) - -/* Defines used by Driver Manager when mapping SQLSetParam to SQLBindParameter -*/ -#define SQL_PARAM_TYPE_DEFAULT SQL_PARAM_INPUT_OUTPUT -#define SQL_SETPARAM_VALUE_MAX (-1L) - -/* SQLColAttributes defines */ -#define SQL_COLUMN_COUNT 0 -#define SQL_COLUMN_NAME 1 -#define SQL_COLUMN_TYPE 2 -#define SQL_COLUMN_LENGTH 3 -#define SQL_COLUMN_PRECISION 4 -#define SQL_COLUMN_SCALE 5 -#define SQL_COLUMN_DISPLAY_SIZE 6 -#define SQL_COLUMN_NULLABLE 7 -#define SQL_COLUMN_UNSIGNED 8 -#define SQL_COLUMN_MONEY 9 -#define SQL_COLUMN_UPDATABLE 10 -#define SQL_COLUMN_AUTO_INCREMENT 11 -#define SQL_COLUMN_CASE_SENSITIVE 12 -#define SQL_COLUMN_SEARCHABLE 13 -#define SQL_COLUMN_TYPE_NAME 14 -#define SQL_COLUMN_TABLE_NAME 15 -#define SQL_COLUMN_OWNER_NAME 16 -#define SQL_COLUMN_QUALIFIER_NAME 17 -#define SQL_COLUMN_LABEL 18 -#define SQL_COLATT_OPT_MAX SQL_COLUMN_LABEL -#if (ODBCVER < 0x0300) -#define SQL_COLUMN_DRIVER_START 1000 -#endif /* ODBCVER < 0x0300 */ - -#define SQL_COLATT_OPT_MIN SQL_COLUMN_COUNT - -/* SQLColAttributes subdefines for SQL_COLUMN_UPDATABLE */ -#define SQL_ATTR_READONLY 0 -#define SQL_ATTR_WRITE 1 -#define SQL_ATTR_READWRITE_UNKNOWN 2 - -/* SQLColAttributes subdefines for SQL_COLUMN_SEARCHABLE */ -/* These are also used by SQLGetInfo */ -#define SQL_UNSEARCHABLE 0 -#define SQL_LIKE_ONLY 1 -#define SQL_ALL_EXCEPT_LIKE 2 -#define SQL_SEARCHABLE 3 -#define SQL_PRED_SEARCHABLE SQL_SEARCHABLE - - -/* Special return values for SQLGetData */ -#define SQL_NO_TOTAL (-4) - -/********************************************/ -/* SQLGetFunctions: additional values for */ -/* fFunction to represent functions that */ -/* are not in the X/Open spec. */ -/********************************************/ - -#if (ODBCVER >= 0x0300) -#define SQL_API_SQLALLOCHANDLESTD 73 -#define SQL_API_SQLBULKOPERATIONS 24 -#endif /* ODBCVER >= 0x0300 */ -#define SQL_API_SQLBINDPARAMETER 72 -#define SQL_API_SQLBROWSECONNECT 55 -#define SQL_API_SQLCOLATTRIBUTES 6 -#define SQL_API_SQLCOLUMNPRIVILEGES 56 -#define SQL_API_SQLDESCRIBEPARAM 58 -#define SQL_API_SQLDRIVERCONNECT 41 -#define SQL_API_SQLDRIVERS 71 -#define SQL_API_SQLEXTENDEDFETCH 59 -#define SQL_API_SQLFOREIGNKEYS 60 -#define SQL_API_SQLMORERESULTS 61 -#define SQL_API_SQLNATIVESQL 62 -#define SQL_API_SQLNUMPARAMS 63 -#define SQL_API_SQLPARAMOPTIONS 64 -#define SQL_API_SQLPRIMARYKEYS 65 -#define SQL_API_SQLPROCEDURECOLUMNS 66 -#define SQL_API_SQLPROCEDURES 67 -#define SQL_API_SQLSETPOS 68 -#define SQL_API_SQLSETSCROLLOPTIONS 69 -#define SQL_API_SQLTABLEPRIVILEGES 70 - -/*-------------------------------------------*/ -/* SQL_EXT_API_LAST is not useful with ODBC */ -/* version 3.0 because some of the values */ -/* from X/Open are in the 10000 range. */ -/*-------------------------------------------*/ - -#if (ODBCVER < 0x0300) -#define SQL_EXT_API_LAST SQL_API_SQLBINDPARAMETER -#define SQL_NUM_FUNCTIONS 23 -#define SQL_EXT_API_START 40 -#define SQL_NUM_EXTENSIONS (SQL_EXT_API_LAST-SQL_EXT_API_START+1) -#endif - -/*--------------------------------------------*/ -/* SQL_API_ALL_FUNCTIONS returns an array */ -/* of 'booleans' representing whether a */ -/* function is implemented by the driver. */ -/* */ -/* CAUTION: Only functions defined in ODBC */ -/* version 2.0 and earlier are returned, the */ -/* new high-range function numbers defined by */ -/* X/Open break this scheme. See the new */ -/* method -- SQL_API_ODBC3_ALL_FUNCTIONS */ -/*--------------------------------------------*/ - -#define SQL_API_ALL_FUNCTIONS 0 /* See CAUTION above */ - -/*----------------------------------------------*/ -/* 2.X drivers export a dummy function with */ -/* ordinal number SQL_API_LOADBYORDINAL to speed*/ -/* loading under the windows operating system. */ -/* */ -/* CAUTION: Loading by ordinal is not supported */ -/* for 3.0 and above drivers. */ -/*----------------------------------------------*/ - -#define SQL_API_LOADBYORDINAL 199 /* See CAUTION above */ - -/*----------------------------------------------*/ -/* SQL_API_ODBC3_ALL_FUNCTIONS */ -/* This returns a bitmap, which allows us to */ -/* handle the higher-valued function numbers. */ -/* Use SQL_FUNC_EXISTS(bitmap,function_number) */ -/* to determine if the function exists. */ -/*----------------------------------------------*/ - - -#if (ODBCVER >= 0x0300) -#define SQL_API_ODBC3_ALL_FUNCTIONS 999 -#define SQL_API_ODBC3_ALL_FUNCTIONS_SIZE 250 /* array of 250 words */ - - -#define SQL_FUNC_EXISTS(pfExists, uwAPI) ((*(((UWORD*) (pfExists)) + ((uwAPI) >> 4)) & (1 << ((uwAPI) & 0x000F)) ) ? SQL_TRUE : SQL_FALSE ) - -#endif /* ODBCVER >= 0x0300 */ - - -/************************************************/ -/* Extended definitions for SQLGetInfo */ -/************************************************/ - -/*---------------------------------*/ -/* Values in ODBC 2.0 that are not */ -/* in the X/Open spec */ -/*---------------------------------*/ - -#define SQL_INFO_FIRST 0 -#define SQL_ACTIVE_CONNECTIONS 0 /* MAX_DRIVER_CONNECTIONS */ -#define SQL_ACTIVE_STATEMENTS 1 /* MAX_CONCURRENT_ACTIVITIES */ -#define SQL_DRIVER_HDBC 3 -#define SQL_DRIVER_HENV 4 -#define SQL_DRIVER_HSTMT 5 -#define SQL_DRIVER_NAME 6 -#define SQL_DRIVER_VER 7 -#define SQL_ODBC_API_CONFORMANCE 9 -#define SQL_ODBC_VER 10 -#define SQL_ROW_UPDATES 11 -#define SQL_ODBC_SAG_CLI_CONFORMANCE 12 -#define SQL_ODBC_SQL_CONFORMANCE 15 -#define SQL_PROCEDURES 21 -#define SQL_CONCAT_NULL_BEHAVIOR 22 -#define SQL_CURSOR_ROLLBACK_BEHAVIOR 24 -#define SQL_EXPRESSIONS_IN_ORDERBY 27 -#define SQL_MAX_OWNER_NAME_LEN 32 /* MAX_SCHEMA_NAME_LEN */ -#define SQL_MAX_PROCEDURE_NAME_LEN 33 -#define SQL_MAX_QUALIFIER_NAME_LEN 34 /* MAX_CATALOG_NAME_LEN */ -#define SQL_MULT_RESULT_SETS 36 -#define SQL_MULTIPLE_ACTIVE_TXN 37 -#define SQL_OUTER_JOINS 38 -#define SQL_OWNER_TERM 39 -#define SQL_PROCEDURE_TERM 40 -#define SQL_QUALIFIER_NAME_SEPARATOR 41 -#define SQL_QUALIFIER_TERM 42 -#define SQL_SCROLL_OPTIONS 44 -#define SQL_TABLE_TERM 45 -#define SQL_CONVERT_FUNCTIONS 48 -#define SQL_NUMERIC_FUNCTIONS 49 -#define SQL_STRING_FUNCTIONS 50 -#define SQL_SYSTEM_FUNCTIONS 51 -#define SQL_TIMEDATE_FUNCTIONS 52 -#define SQL_CONVERT_BIGINT 53 -#define SQL_CONVERT_BINARY 54 -#define SQL_CONVERT_BIT 55 -#define SQL_CONVERT_CHAR 56 -#define SQL_CONVERT_DATE 57 -#define SQL_CONVERT_DECIMAL 58 -#define SQL_CONVERT_DOUBLE 59 -#define SQL_CONVERT_FLOAT 60 -#define SQL_CONVERT_INTEGER 61 -#define SQL_CONVERT_LONGVARCHAR 62 -#define SQL_CONVERT_NUMERIC 63 -#define SQL_CONVERT_REAL 64 -#define SQL_CONVERT_SMALLINT 65 -#define SQL_CONVERT_TIME 66 -#define SQL_CONVERT_TIMESTAMP 67 -#define SQL_CONVERT_TINYINT 68 -#define SQL_CONVERT_VARBINARY 69 -#define SQL_CONVERT_VARCHAR 70 -#define SQL_CONVERT_LONGVARBINARY 71 -#define SQL_CONVERT_GUID 173 -#define SQL_ODBC_SQL_OPT_IEF 73 /* SQL_INTEGRITY */ -#define SQL_CORRELATION_NAME 74 -#define SQL_NON_NULLABLE_COLUMNS 75 -#define SQL_DRIVER_HLIB 76 -#define SQL_DRIVER_ODBC_VER 77 -#define SQL_LOCK_TYPES 78 -#define SQL_POS_OPERATIONS 79 -#define SQL_POSITIONED_STATEMENTS 80 -#define SQL_BOOKMARK_PERSISTENCE 82 -#define SQL_STATIC_SENSITIVITY 83 -#define SQL_FILE_USAGE 84 -#define SQL_COLUMN_ALIAS 87 -#define SQL_GROUP_BY 88 -#define SQL_KEYWORDS 89 -#define SQL_OWNER_USAGE 91 -#define SQL_QUALIFIER_USAGE 92 -#define SQL_QUOTED_IDENTIFIER_CASE 93 -#define SQL_SUBQUERIES 95 -#define SQL_UNION 96 -#define SQL_MAX_ROW_SIZE_INCLUDES_LONG 103 -#define SQL_MAX_CHAR_LITERAL_LEN 108 -#define SQL_TIMEDATE_ADD_INTERVALS 109 -#define SQL_TIMEDATE_DIFF_INTERVALS 110 -#define SQL_NEED_LONG_DATA_LEN 111 -#define SQL_MAX_BINARY_LITERAL_LEN 112 -#define SQL_LIKE_ESCAPE_CLAUSE 113 -#define SQL_QUALIFIER_LOCATION 114 - -#if (ODBCVER >= 0x0201 && ODBCVER < 0x0300) -#ifndef SQL_OJ_CAPABILITIES -#define SQL_OJ_CAPABILITIES 65003 /* Temp value until ODBC 3.0 */ -#endif -#endif /* ODBCVER >= 0x0201 && ODBCVER < 0x0300 */ - -/*----------------------------------------------*/ -/* SQL_INFO_LAST and SQL_INFO_DRIVER_START are */ -/* not useful anymore, because X/Open has */ -/* values in the 10000 range. You */ -/* must contact X/Open directly to get a range */ -/* of numbers for driver-specific values. */ -/*----------------------------------------------*/ - -#if (ODBCVER < 0x0300) -#define SQL_INFO_LAST SQL_QUALIFIER_LOCATION -#define SQL_INFO_DRIVER_START 1000 -#endif /* ODBCVER < 0x0300 */ - -/*-----------------------------------------------*/ -/* ODBC 3.0 SQLGetInfo values that are not part */ -/* of the X/Open standard at this time. X/Open */ -/* standard values are in sql.h. */ -/*-----------------------------------------------*/ - -#if (ODBCVER >= 0x0300) -#define SQL_ACTIVE_ENVIRONMENTS 116 -#define SQL_ALTER_DOMAIN 117 - -#define SQL_SQL_CONFORMANCE 118 -#define SQL_DATETIME_LITERALS 119 - -#define SQL_ASYNC_MODE 10021 /* new X/Open spec */ -#define SQL_BATCH_ROW_COUNT 120 -#define SQL_BATCH_SUPPORT 121 -#define SQL_CATALOG_LOCATION SQL_QUALIFIER_LOCATION -#define SQL_CATALOG_NAME_SEPARATOR SQL_QUALIFIER_NAME_SEPARATOR -#define SQL_CATALOG_TERM SQL_QUALIFIER_TERM -#define SQL_CATALOG_USAGE SQL_QUALIFIER_USAGE -#define SQL_CONVERT_WCHAR 122 -#define SQL_CONVERT_INTERVAL_DAY_TIME 123 -#define SQL_CONVERT_INTERVAL_YEAR_MONTH 124 -#define SQL_CONVERT_WLONGVARCHAR 125 -#define SQL_CONVERT_WVARCHAR 126 -#define SQL_CREATE_ASSERTION 127 -#define SQL_CREATE_CHARACTER_SET 128 -#define SQL_CREATE_COLLATION 129 -#define SQL_CREATE_DOMAIN 130 -#define SQL_CREATE_SCHEMA 131 -#define SQL_CREATE_TABLE 132 -#define SQL_CREATE_TRANSLATION 133 -#define SQL_CREATE_VIEW 134 -#define SQL_DRIVER_HDESC 135 -#define SQL_DROP_ASSERTION 136 -#define SQL_DROP_CHARACTER_SET 137 -#define SQL_DROP_COLLATION 138 -#define SQL_DROP_DOMAIN 139 -#define SQL_DROP_SCHEMA 140 -#define SQL_DROP_TABLE 141 -#define SQL_DROP_TRANSLATION 142 -#define SQL_DROP_VIEW 143 -#define SQL_DYNAMIC_CURSOR_ATTRIBUTES1 144 -#define SQL_DYNAMIC_CURSOR_ATTRIBUTES2 145 -#define SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1 146 -#define SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2 147 -#define SQL_INDEX_KEYWORDS 148 -#define SQL_INFO_SCHEMA_VIEWS 149 -#define SQL_KEYSET_CURSOR_ATTRIBUTES1 150 -#define SQL_KEYSET_CURSOR_ATTRIBUTES2 151 -#define SQL_MAX_ASYNC_CONCURRENT_STATEMENTS 10022 /* new X/Open spec */ -#define SQL_ODBC_INTERFACE_CONFORMANCE 152 -#define SQL_PARAM_ARRAY_ROW_COUNTS 153 -#define SQL_PARAM_ARRAY_SELECTS 154 -#define SQL_SCHEMA_TERM SQL_OWNER_TERM -#define SQL_SCHEMA_USAGE SQL_OWNER_USAGE -#define SQL_SQL92_DATETIME_FUNCTIONS 155 -#define SQL_SQL92_FOREIGN_KEY_DELETE_RULE 156 -#define SQL_SQL92_FOREIGN_KEY_UPDATE_RULE 157 -#define SQL_SQL92_GRANT 158 -#define SQL_SQL92_NUMERIC_VALUE_FUNCTIONS 159 -#define SQL_SQL92_PREDICATES 160 -#define SQL_SQL92_RELATIONAL_JOIN_OPERATORS 161 -#define SQL_SQL92_REVOKE 162 -#define SQL_SQL92_ROW_VALUE_CONSTRUCTOR 163 -#define SQL_SQL92_STRING_FUNCTIONS 164 -#define SQL_SQL92_VALUE_EXPRESSIONS 165 -#define SQL_STANDARD_CLI_CONFORMANCE 166 -#define SQL_STATIC_CURSOR_ATTRIBUTES1 167 -#define SQL_STATIC_CURSOR_ATTRIBUTES2 168 - -#define SQL_AGGREGATE_FUNCTIONS 169 -#define SQL_DDL_INDEX 170 -#define SQL_DM_VER 171 -#define SQL_INSERT_STATEMENT 172 -#define SQL_UNION_STATEMENT SQL_UNION -#endif /* ODBCVER >= 0x0300 */ - -#if (ODBCVER >= 0x0380) -/* Info Types */ -#define SQL_ASYNC_DBC_FUNCTIONS 10023 -#endif - -#define SQL_DRIVER_AWARE_POOLING_SUPPORTED 10024 - -#if (ODBCVER >= 0x0380) -#define SQL_ASYNC_NOTIFICATION 10025 - -/* Possible values for SQL_ASYNC_NOTIFICATION */ -#define SQL_ASYNC_NOTIFICATION_NOT_CAPABLE 0x00000000L -#define SQL_ASYNC_NOTIFICATION_CAPABLE 0x00000001L -#endif /* ODBCVER >= 0x0380 */ - -#define SQL_DTC_TRANSITION_COST 1750 - -/* SQL_ALTER_TABLE bitmasks */ -#if (ODBCVER >= 0x0300) -/* the following 5 bitmasks are defined in sql.h -*#define SQL_AT_ADD_COLUMN 0x00000001L -*#define SQL_AT_DROP_COLUMN 0x00000002L -*#define SQL_AT_ADD_CONSTRAINT 0x00000008L -*/ -#define SQL_AT_ADD_COLUMN_SINGLE 0x00000020L -#define SQL_AT_ADD_COLUMN_DEFAULT 0x00000040L -#define SQL_AT_ADD_COLUMN_COLLATION 0x00000080L -#define SQL_AT_SET_COLUMN_DEFAULT 0x00000100L -#define SQL_AT_DROP_COLUMN_DEFAULT 0x00000200L -#define SQL_AT_DROP_COLUMN_CASCADE 0x00000400L -#define SQL_AT_DROP_COLUMN_RESTRICT 0x00000800L -#define SQL_AT_ADD_TABLE_CONSTRAINT 0x00001000L -#define SQL_AT_DROP_TABLE_CONSTRAINT_CASCADE 0x00002000L -#define SQL_AT_DROP_TABLE_CONSTRAINT_RESTRICT 0x00004000L -#define SQL_AT_CONSTRAINT_NAME_DEFINITION 0x00008000L -#define SQL_AT_CONSTRAINT_INITIALLY_DEFERRED 0x00010000L -#define SQL_AT_CONSTRAINT_INITIALLY_IMMEDIATE 0x00020000L -#define SQL_AT_CONSTRAINT_DEFERRABLE 0x00040000L -#define SQL_AT_CONSTRAINT_NON_DEFERRABLE 0x00080000L -#endif /* ODBCVER >= 0x0300 */ - -/* SQL_CONVERT_* return value bitmasks */ - -#define SQL_CVT_CHAR 0x00000001L -#define SQL_CVT_NUMERIC 0x00000002L -#define SQL_CVT_DECIMAL 0x00000004L -#define SQL_CVT_INTEGER 0x00000008L -#define SQL_CVT_SMALLINT 0x00000010L -#define SQL_CVT_FLOAT 0x00000020L -#define SQL_CVT_REAL 0x00000040L -#define SQL_CVT_DOUBLE 0x00000080L -#define SQL_CVT_VARCHAR 0x00000100L -#define SQL_CVT_LONGVARCHAR 0x00000200L -#define SQL_CVT_BINARY 0x00000400L -#define SQL_CVT_VARBINARY 0x00000800L -#define SQL_CVT_BIT 0x00001000L -#define SQL_CVT_TINYINT 0x00002000L -#define SQL_CVT_BIGINT 0x00004000L -#define SQL_CVT_DATE 0x00008000L -#define SQL_CVT_TIME 0x00010000L -#define SQL_CVT_TIMESTAMP 0x00020000L -#define SQL_CVT_LONGVARBINARY 0x00040000L -#if (ODBCVER >= 0x0300) -#define SQL_CVT_INTERVAL_YEAR_MONTH 0x00080000L -#define SQL_CVT_INTERVAL_DAY_TIME 0x00100000L -#define SQL_CVT_WCHAR 0x00200000L -#define SQL_CVT_WLONGVARCHAR 0x00400000L -#define SQL_CVT_WVARCHAR 0x00800000L -#define SQL_CVT_GUID 0x01000000L - -#endif /* ODBCVER >= 0x0300 */ - - -/* SQL_CONVERT_FUNCTIONS functions */ -#define SQL_FN_CVT_CONVERT 0x00000001L -#if (ODBCVER >= 0x0300) -#define SQL_FN_CVT_CAST 0x00000002L -#endif /* ODBCVER >= 0x0300 */ - - -/* SQL_STRING_FUNCTIONS functions */ - -#define SQL_FN_STR_CONCAT 0x00000001L -#define SQL_FN_STR_INSERT 0x00000002L -#define SQL_FN_STR_LEFT 0x00000004L -#define SQL_FN_STR_LTRIM 0x00000008L -#define SQL_FN_STR_LENGTH 0x00000010L -#define SQL_FN_STR_LOCATE 0x00000020L -#define SQL_FN_STR_LCASE 0x00000040L -#define SQL_FN_STR_REPEAT 0x00000080L -#define SQL_FN_STR_REPLACE 0x00000100L -#define SQL_FN_STR_RIGHT 0x00000200L -#define SQL_FN_STR_RTRIM 0x00000400L -#define SQL_FN_STR_SUBSTRING 0x00000800L -#define SQL_FN_STR_UCASE 0x00001000L -#define SQL_FN_STR_ASCII 0x00002000L -#define SQL_FN_STR_CHAR 0x00004000L -#define SQL_FN_STR_DIFFERENCE 0x00008000L -#define SQL_FN_STR_LOCATE_2 0x00010000L -#define SQL_FN_STR_SOUNDEX 0x00020000L -#define SQL_FN_STR_SPACE 0x00040000L -#if (ODBCVER >= 0x0300) -#define SQL_FN_STR_BIT_LENGTH 0x00080000L -#define SQL_FN_STR_CHAR_LENGTH 0x00100000L -#define SQL_FN_STR_CHARACTER_LENGTH 0x00200000L -#define SQL_FN_STR_OCTET_LENGTH 0x00400000L -#define SQL_FN_STR_POSITION 0x00800000L -#endif /* ODBCVER >= 0x0300 */ - -/* SQL_SQL92_STRING_FUNCTIONS */ -#if (ODBCVER >= 0x0300) -#define SQL_SSF_CONVERT 0x00000001L -#define SQL_SSF_LOWER 0x00000002L -#define SQL_SSF_UPPER 0x00000004L -#define SQL_SSF_SUBSTRING 0x00000008L -#define SQL_SSF_TRANSLATE 0x00000010L -#define SQL_SSF_TRIM_BOTH 0x00000020L -#define SQL_SSF_TRIM_LEADING 0x00000040L -#define SQL_SSF_TRIM_TRAILING 0x00000080L -#endif /* ODBCVER >= 0x0300 */ - -/* SQL_NUMERIC_FUNCTIONS functions */ - -#define SQL_FN_NUM_ABS 0x00000001L -#define SQL_FN_NUM_ACOS 0x00000002L -#define SQL_FN_NUM_ASIN 0x00000004L -#define SQL_FN_NUM_ATAN 0x00000008L -#define SQL_FN_NUM_ATAN2 0x00000010L -#define SQL_FN_NUM_CEILING 0x00000020L -#define SQL_FN_NUM_COS 0x00000040L -#define SQL_FN_NUM_COT 0x00000080L -#define SQL_FN_NUM_EXP 0x00000100L -#define SQL_FN_NUM_FLOOR 0x00000200L -#define SQL_FN_NUM_LOG 0x00000400L -#define SQL_FN_NUM_MOD 0x00000800L -#define SQL_FN_NUM_SIGN 0x00001000L -#define SQL_FN_NUM_SIN 0x00002000L -#define SQL_FN_NUM_SQRT 0x00004000L -#define SQL_FN_NUM_TAN 0x00008000L -#define SQL_FN_NUM_PI 0x00010000L -#define SQL_FN_NUM_RAND 0x00020000L -#define SQL_FN_NUM_DEGREES 0x00040000L -#define SQL_FN_NUM_LOG10 0x00080000L -#define SQL_FN_NUM_POWER 0x00100000L -#define SQL_FN_NUM_RADIANS 0x00200000L -#define SQL_FN_NUM_ROUND 0x00400000L -#define SQL_FN_NUM_TRUNCATE 0x00800000L - -/* SQL_SQL92_NUMERIC_VALUE_FUNCTIONS */ -#if (ODBCVER >= 0x0300) -#define SQL_SNVF_BIT_LENGTH 0x00000001L -#define SQL_SNVF_CHAR_LENGTH 0x00000002L -#define SQL_SNVF_CHARACTER_LENGTH 0x00000004L -#define SQL_SNVF_EXTRACT 0x00000008L -#define SQL_SNVF_OCTET_LENGTH 0x00000010L -#define SQL_SNVF_POSITION 0x00000020L -#endif /* ODBCVER >= 0x0300 */ - -/* SQL_TIMEDATE_FUNCTIONS functions */ - -#define SQL_FN_TD_NOW 0x00000001L -#define SQL_FN_TD_CURDATE 0x00000002L -#define SQL_FN_TD_DAYOFMONTH 0x00000004L -#define SQL_FN_TD_DAYOFWEEK 0x00000008L -#define SQL_FN_TD_DAYOFYEAR 0x00000010L -#define SQL_FN_TD_MONTH 0x00000020L -#define SQL_FN_TD_QUARTER 0x00000040L -#define SQL_FN_TD_WEEK 0x00000080L -#define SQL_FN_TD_YEAR 0x00000100L -#define SQL_FN_TD_CURTIME 0x00000200L -#define SQL_FN_TD_HOUR 0x00000400L -#define SQL_FN_TD_MINUTE 0x00000800L -#define SQL_FN_TD_SECOND 0x00001000L -#define SQL_FN_TD_TIMESTAMPADD 0x00002000L -#define SQL_FN_TD_TIMESTAMPDIFF 0x00004000L -#define SQL_FN_TD_DAYNAME 0x00008000L -#define SQL_FN_TD_MONTHNAME 0x00010000L -#if (ODBCVER >= 0x0300) -#define SQL_FN_TD_CURRENT_DATE 0x00020000L -#define SQL_FN_TD_CURRENT_TIME 0x00040000L -#define SQL_FN_TD_CURRENT_TIMESTAMP 0x00080000L -#define SQL_FN_TD_EXTRACT 0x00100000L -#endif /* ODBCVER >= 0x0300 */ - -/* SQL_SQL92_DATETIME_FUNCTIONS */ -#if (ODBCVER >= 0x0300) -#define SQL_SDF_CURRENT_DATE 0x00000001L -#define SQL_SDF_CURRENT_TIME 0x00000002L -#define SQL_SDF_CURRENT_TIMESTAMP 0x00000004L -#endif /* ODBCVER >= 0x0300 */ - -/* SQL_SYSTEM_FUNCTIONS functions */ - -#define SQL_FN_SYS_USERNAME 0x00000001L -#define SQL_FN_SYS_DBNAME 0x00000002L -#define SQL_FN_SYS_IFNULL 0x00000004L - -/* SQL_TIMEDATE_ADD_INTERVALS and SQL_TIMEDATE_DIFF_INTERVALS functions */ - -#define SQL_FN_TSI_FRAC_SECOND 0x00000001L -#define SQL_FN_TSI_SECOND 0x00000002L -#define SQL_FN_TSI_MINUTE 0x00000004L -#define SQL_FN_TSI_HOUR 0x00000008L -#define SQL_FN_TSI_DAY 0x00000010L -#define SQL_FN_TSI_WEEK 0x00000020L -#define SQL_FN_TSI_MONTH 0x00000040L -#define SQL_FN_TSI_QUARTER 0x00000080L -#define SQL_FN_TSI_YEAR 0x00000100L - -/* bitmasks for SQL_DYNAMIC_CURSOR_ATTRIBUTES1, - * SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1, - * SQL_KEYSET_CURSOR_ATTRIBUTES1, and SQL_STATIC_CURSOR_ATTRIBUTES1 - */ -#if (ODBCVER >= 0x0300) -/* supported SQLFetchScroll FetchOrientation's */ -#define SQL_CA1_NEXT 0x00000001L -#define SQL_CA1_ABSOLUTE 0x00000002L -#define SQL_CA1_RELATIVE 0x00000004L -#define SQL_CA1_BOOKMARK 0x00000008L - -/* supported SQLSetPos LockType's */ -#define SQL_CA1_LOCK_NO_CHANGE 0x00000040L -#define SQL_CA1_LOCK_EXCLUSIVE 0x00000080L -#define SQL_CA1_LOCK_UNLOCK 0x00000100L - -/* supported SQLSetPos Operations */ -#define SQL_CA1_POS_POSITION 0x00000200L -#define SQL_CA1_POS_UPDATE 0x00000400L -#define SQL_CA1_POS_DELETE 0x00000800L -#define SQL_CA1_POS_REFRESH 0x00001000L - -/* positioned updates and deletes */ -#define SQL_CA1_POSITIONED_UPDATE 0x00002000L -#define SQL_CA1_POSITIONED_DELETE 0x00004000L -#define SQL_CA1_SELECT_FOR_UPDATE 0x00008000L - -/* supported SQLBulkOperations operations */ -#define SQL_CA1_BULK_ADD 0x00010000L -#define SQL_CA1_BULK_UPDATE_BY_BOOKMARK 0x00020000L -#define SQL_CA1_BULK_DELETE_BY_BOOKMARK 0x00040000L -#define SQL_CA1_BULK_FETCH_BY_BOOKMARK 0x00080000L -#endif /* ODBCVER >= 0x0300 */ - -/* bitmasks for SQL_DYNAMIC_CURSOR_ATTRIBUTES2, - * SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2, - * SQL_KEYSET_CURSOR_ATTRIBUTES2, and SQL_STATIC_CURSOR_ATTRIBUTES2 - */ -#if (ODBCVER >= 0x0300) -/* supported values for SQL_ATTR_SCROLL_CONCURRENCY */ -#define SQL_CA2_READ_ONLY_CONCURRENCY 0x00000001L -#define SQL_CA2_LOCK_CONCURRENCY 0x00000002L -#define SQL_CA2_OPT_ROWVER_CONCURRENCY 0x00000004L -#define SQL_CA2_OPT_VALUES_CONCURRENCY 0x00000008L - -/* sensitivity of the cursor to its own inserts, deletes, and updates */ -#define SQL_CA2_SENSITIVITY_ADDITIONS 0x00000010L -#define SQL_CA2_SENSITIVITY_DELETIONS 0x00000020L -#define SQL_CA2_SENSITIVITY_UPDATES 0x00000040L - -/* semantics of SQL_ATTR_MAX_ROWS */ -#define SQL_CA2_MAX_ROWS_SELECT 0x00000080L -#define SQL_CA2_MAX_ROWS_INSERT 0x00000100L -#define SQL_CA2_MAX_ROWS_DELETE 0x00000200L -#define SQL_CA2_MAX_ROWS_UPDATE 0x00000400L -#define SQL_CA2_MAX_ROWS_CATALOG 0x00000800L -#define SQL_CA2_MAX_ROWS_AFFECTS_ALL (SQL_CA2_MAX_ROWS_SELECT | SQL_CA2_MAX_ROWS_INSERT | SQL_CA2_MAX_ROWS_DELETE | SQL_CA2_MAX_ROWS_UPDATE | SQL_CA2_MAX_ROWS_CATALOG) - -/* semantics of SQL_DIAG_CURSOR_ROW_COUNT */ -#define SQL_CA2_CRC_EXACT 0x00001000L -#define SQL_CA2_CRC_APPROXIMATE 0x00002000L - -/* the kinds of positioned statements that can be simulated */ -#define SQL_CA2_SIMULATE_NON_UNIQUE 0x00004000L -#define SQL_CA2_SIMULATE_TRY_UNIQUE 0x00008000L -#define SQL_CA2_SIMULATE_UNIQUE 0x00010000L -#endif /* ODBCVER >= 0x0300 */ - -/* SQL_ODBC_API_CONFORMANCE values */ - -#define SQL_OAC_NONE 0x0000 -#define SQL_OAC_LEVEL1 0x0001 -#define SQL_OAC_LEVEL2 0x0002 - -/* SQL_ODBC_SAG_CLI_CONFORMANCE values */ - -#define SQL_OSCC_NOT_COMPLIANT 0x0000 -#define SQL_OSCC_COMPLIANT 0x0001 - -/* SQL_ODBC_SQL_CONFORMANCE values */ - -#define SQL_OSC_MINIMUM 0x0000 -#define SQL_OSC_CORE 0x0001 -#define SQL_OSC_EXTENDED 0x0002 - - -/* SQL_CONCAT_NULL_BEHAVIOR values */ - -#define SQL_CB_NULL 0x0000 -#define SQL_CB_NON_NULL 0x0001 - -/* SQL_SCROLL_OPTIONS masks */ - -#define SQL_SO_FORWARD_ONLY 0x00000001L -#define SQL_SO_KEYSET_DRIVEN 0x00000002L -#define SQL_SO_DYNAMIC 0x00000004L -#define SQL_SO_MIXED 0x00000008L -#define SQL_SO_STATIC 0x00000010L - -/* SQL_FETCH_DIRECTION masks */ - -/* SQL_FETCH_RESUME is no longer supported -#define SQL_FD_FETCH_RESUME 0x00000040L -*/ -#define SQL_FD_FETCH_BOOKMARK 0x00000080L - -/* SQL_TXN_ISOLATION_OPTION masks */ -/* SQL_TXN_VERSIONING is no longer supported -#define SQL_TXN_VERSIONING 0x00000010L -*/ - -/* SQL_CORRELATION_NAME values */ - -#define SQL_CN_NONE 0x0000 -#define SQL_CN_DIFFERENT 0x0001 -#define SQL_CN_ANY 0x0002 - -/* SQL_NON_NULLABLE_COLUMNS values */ - -#define SQL_NNC_NULL 0x0000 -#define SQL_NNC_NON_NULL 0x0001 - -/* SQL_NULL_COLLATION values */ - -#define SQL_NC_START 0x0002 -#define SQL_NC_END 0x0004 - -/* SQL_FILE_USAGE values */ - -#define SQL_FILE_NOT_SUPPORTED 0x0000 -#define SQL_FILE_TABLE 0x0001 -#define SQL_FILE_QUALIFIER 0x0002 -#define SQL_FILE_CATALOG SQL_FILE_QUALIFIER /* ODBC 3.0 */ - - -/* SQL_GETDATA_EXTENSIONS values */ - -#define SQL_GD_BLOCK 0x00000004L -#define SQL_GD_BOUND 0x00000008L -#if (ODBCVER >= 0x0380) - #define SQL_GD_OUTPUT_PARAMS 0x00000010L -#endif - -/* SQL_POSITIONED_STATEMENTS masks */ - -#define SQL_PS_POSITIONED_DELETE 0x00000001L -#define SQL_PS_POSITIONED_UPDATE 0x00000002L -#define SQL_PS_SELECT_FOR_UPDATE 0x00000004L - -/* SQL_GROUP_BY values */ - -#define SQL_GB_NOT_SUPPORTED 0x0000 -#define SQL_GB_GROUP_BY_EQUALS_SELECT 0x0001 -#define SQL_GB_GROUP_BY_CONTAINS_SELECT 0x0002 -#define SQL_GB_NO_RELATION 0x0003 -#if (ODBCVER >= 0x0300) -#define SQL_GB_COLLATE 0x0004 - -#endif /* ODBCVER >= 0x0300 */ - -/* SQL_OWNER_USAGE masks */ - -#define SQL_OU_DML_STATEMENTS 0x00000001L -#define SQL_OU_PROCEDURE_INVOCATION 0x00000002L -#define SQL_OU_TABLE_DEFINITION 0x00000004L -#define SQL_OU_INDEX_DEFINITION 0x00000008L -#define SQL_OU_PRIVILEGE_DEFINITION 0x00000010L - -/* SQL_SCHEMA_USAGE masks */ -#if (ODBCVER >= 0x0300) -#define SQL_SU_DML_STATEMENTS SQL_OU_DML_STATEMENTS -#define SQL_SU_PROCEDURE_INVOCATION SQL_OU_PROCEDURE_INVOCATION -#define SQL_SU_TABLE_DEFINITION SQL_OU_TABLE_DEFINITION -#define SQL_SU_INDEX_DEFINITION SQL_OU_INDEX_DEFINITION -#define SQL_SU_PRIVILEGE_DEFINITION SQL_OU_PRIVILEGE_DEFINITION -#endif /* ODBCVER >= 0x0300 */ - -/* SQL_QUALIFIER_USAGE masks */ - -#define SQL_QU_DML_STATEMENTS 0x00000001L -#define SQL_QU_PROCEDURE_INVOCATION 0x00000002L -#define SQL_QU_TABLE_DEFINITION 0x00000004L -#define SQL_QU_INDEX_DEFINITION 0x00000008L -#define SQL_QU_PRIVILEGE_DEFINITION 0x00000010L - -#if (ODBCVER >= 0x0300) -/* SQL_CATALOG_USAGE masks */ -#define SQL_CU_DML_STATEMENTS SQL_QU_DML_STATEMENTS -#define SQL_CU_PROCEDURE_INVOCATION SQL_QU_PROCEDURE_INVOCATION -#define SQL_CU_TABLE_DEFINITION SQL_QU_TABLE_DEFINITION -#define SQL_CU_INDEX_DEFINITION SQL_QU_INDEX_DEFINITION -#define SQL_CU_PRIVILEGE_DEFINITION SQL_QU_PRIVILEGE_DEFINITION -#endif /* ODBCVER >= 0x0300 */ - -/* SQL_SUBQUERIES masks */ - -#define SQL_SQ_COMPARISON 0x00000001L -#define SQL_SQ_EXISTS 0x00000002L -#define SQL_SQ_IN 0x00000004L -#define SQL_SQ_QUANTIFIED 0x00000008L -#define SQL_SQ_CORRELATED_SUBQUERIES 0x00000010L - -/* SQL_UNION masks */ - -#define SQL_U_UNION 0x00000001L -#define SQL_U_UNION_ALL 0x00000002L - -/* SQL_BOOKMARK_PERSISTENCE values */ - -#define SQL_BP_CLOSE 0x00000001L -#define SQL_BP_DELETE 0x00000002L -#define SQL_BP_DROP 0x00000004L -#define SQL_BP_TRANSACTION 0x00000008L -#define SQL_BP_UPDATE 0x00000010L -#define SQL_BP_OTHER_HSTMT 0x00000020L -#define SQL_BP_SCROLL 0x00000040L - -/* SQL_STATIC_SENSITIVITY values */ - -#define SQL_SS_ADDITIONS 0x00000001L -#define SQL_SS_DELETIONS 0x00000002L -#define SQL_SS_UPDATES 0x00000004L - -/* SQL_VIEW values */ -#define SQL_CV_CREATE_VIEW 0x00000001L -#define SQL_CV_CHECK_OPTION 0x00000002L -#define SQL_CV_CASCADED 0x00000004L -#define SQL_CV_LOCAL 0x00000008L - -/* SQL_LOCK_TYPES masks */ - -#define SQL_LCK_NO_CHANGE 0x00000001L -#define SQL_LCK_EXCLUSIVE 0x00000002L -#define SQL_LCK_UNLOCK 0x00000004L - -/* SQL_POS_OPERATIONS masks */ - -#define SQL_POS_POSITION 0x00000001L -#define SQL_POS_REFRESH 0x00000002L -#define SQL_POS_UPDATE 0x00000004L -#define SQL_POS_DELETE 0x00000008L -#define SQL_POS_ADD 0x00000010L - -/* SQL_QUALIFIER_LOCATION values */ - -#define SQL_QL_START 0x0001 -#define SQL_QL_END 0x0002 - -/* Here start return values for ODBC 3.0 SQLGetInfo */ - -#if (ODBCVER >= 0x0300) -/* SQL_AGGREGATE_FUNCTIONS bitmasks */ -#define SQL_AF_AVG 0x00000001L -#define SQL_AF_COUNT 0x00000002L -#define SQL_AF_MAX 0x00000004L -#define SQL_AF_MIN 0x00000008L -#define SQL_AF_SUM 0x00000010L -#define SQL_AF_DISTINCT 0x00000020L -#define SQL_AF_ALL 0x00000040L - -/* SQL_SQL_CONFORMANCE bit masks */ -#define SQL_SC_SQL92_ENTRY 0x00000001L -#define SQL_SC_FIPS127_2_TRANSITIONAL 0x00000002L -#define SQL_SC_SQL92_INTERMEDIATE 0x00000004L -#define SQL_SC_SQL92_FULL 0x00000008L - -/* SQL_DATETIME_LITERALS masks */ -#define SQL_DL_SQL92_DATE 0x00000001L -#define SQL_DL_SQL92_TIME 0x00000002L -#define SQL_DL_SQL92_TIMESTAMP 0x00000004L -#define SQL_DL_SQL92_INTERVAL_YEAR 0x00000008L -#define SQL_DL_SQL92_INTERVAL_MONTH 0x00000010L -#define SQL_DL_SQL92_INTERVAL_DAY 0x00000020L -#define SQL_DL_SQL92_INTERVAL_HOUR 0x00000040L -#define SQL_DL_SQL92_INTERVAL_MINUTE 0x00000080L -#define SQL_DL_SQL92_INTERVAL_SECOND 0x00000100L -#define SQL_DL_SQL92_INTERVAL_YEAR_TO_MONTH 0x00000200L -#define SQL_DL_SQL92_INTERVAL_DAY_TO_HOUR 0x00000400L -#define SQL_DL_SQL92_INTERVAL_DAY_TO_MINUTE 0x00000800L -#define SQL_DL_SQL92_INTERVAL_DAY_TO_SECOND 0x00001000L -#define SQL_DL_SQL92_INTERVAL_HOUR_TO_MINUTE 0x00002000L -#define SQL_DL_SQL92_INTERVAL_HOUR_TO_SECOND 0x00004000L -#define SQL_DL_SQL92_INTERVAL_MINUTE_TO_SECOND 0x00008000L - -/* SQL_CATALOG_LOCATION values */ -#define SQL_CL_START SQL_QL_START -#define SQL_CL_END SQL_QL_END - -/* values for SQL_BATCH_ROW_COUNT */ -#define SQL_BRC_PROCEDURES 0x0000001 -#define SQL_BRC_EXPLICIT 0x0000002 -#define SQL_BRC_ROLLED_UP 0x0000004 - -/* bitmasks for SQL_BATCH_SUPPORT */ -#define SQL_BS_SELECT_EXPLICIT 0x00000001L -#define SQL_BS_ROW_COUNT_EXPLICIT 0x00000002L -#define SQL_BS_SELECT_PROC 0x00000004L -#define SQL_BS_ROW_COUNT_PROC 0x00000008L - -/* Values for SQL_PARAM_ARRAY_ROW_COUNTS getinfo */ -#define SQL_PARC_BATCH 1 -#define SQL_PARC_NO_BATCH 2 - -/* values for SQL_PARAM_ARRAY_SELECTS */ -#define SQL_PAS_BATCH 1 -#define SQL_PAS_NO_BATCH 2 -#define SQL_PAS_NO_SELECT 3 - -/* Bitmasks for SQL_INDEX_KEYWORDS */ -#define SQL_IK_NONE 0x00000000L -#define SQL_IK_ASC 0x00000001L -#define SQL_IK_DESC 0x00000002L -#define SQL_IK_ALL (SQL_IK_ASC | SQL_IK_DESC) - -/* Bitmasks for SQL_INFO_SCHEMA_VIEWS */ - -#define SQL_ISV_ASSERTIONS 0x00000001L -#define SQL_ISV_CHARACTER_SETS 0x00000002L -#define SQL_ISV_CHECK_CONSTRAINTS 0x00000004L -#define SQL_ISV_COLLATIONS 0x00000008L -#define SQL_ISV_COLUMN_DOMAIN_USAGE 0x00000010L -#define SQL_ISV_COLUMN_PRIVILEGES 0x00000020L -#define SQL_ISV_COLUMNS 0x00000040L -#define SQL_ISV_CONSTRAINT_COLUMN_USAGE 0x00000080L -#define SQL_ISV_CONSTRAINT_TABLE_USAGE 0x00000100L -#define SQL_ISV_DOMAIN_CONSTRAINTS 0x00000200L -#define SQL_ISV_DOMAINS 0x00000400L -#define SQL_ISV_KEY_COLUMN_USAGE 0x00000800L -#define SQL_ISV_REFERENTIAL_CONSTRAINTS 0x00001000L -#define SQL_ISV_SCHEMATA 0x00002000L -#define SQL_ISV_SQL_LANGUAGES 0x00004000L -#define SQL_ISV_TABLE_CONSTRAINTS 0x00008000L -#define SQL_ISV_TABLE_PRIVILEGES 0x00010000L -#define SQL_ISV_TABLES 0x00020000L -#define SQL_ISV_TRANSLATIONS 0x00040000L -#define SQL_ISV_USAGE_PRIVILEGES 0x00080000L -#define SQL_ISV_VIEW_COLUMN_USAGE 0x00100000L -#define SQL_ISV_VIEW_TABLE_USAGE 0x00200000L -#define SQL_ISV_VIEWS 0x00400000L - -/* Bitmasks for SQL_ASYNC_MODE */ - -#define SQL_AM_NONE 0 -#define SQL_AM_CONNECTION 1 -#define SQL_AM_STATEMENT 2 - -/* Bitmasks for SQL_ALTER_DOMAIN */ -#define SQL_AD_CONSTRAINT_NAME_DEFINITION 0x00000001L -#define SQL_AD_ADD_DOMAIN_CONSTRAINT 0x00000002L -#define SQL_AD_DROP_DOMAIN_CONSTRAINT 0x00000004L -#define SQL_AD_ADD_DOMAIN_DEFAULT 0x00000008L -#define SQL_AD_DROP_DOMAIN_DEFAULT 0x00000010L -#define SQL_AD_ADD_CONSTRAINT_INITIALLY_DEFERRED 0x00000020L -#define SQL_AD_ADD_CONSTRAINT_INITIALLY_IMMEDIATE 0x00000040L -#define SQL_AD_ADD_CONSTRAINT_DEFERRABLE 0x00000080L -#define SQL_AD_ADD_CONSTRAINT_NON_DEFERRABLE 0x00000100L - - -/* SQL_CREATE_SCHEMA bitmasks */ -#define SQL_CS_CREATE_SCHEMA 0x00000001L -#define SQL_CS_AUTHORIZATION 0x00000002L -#define SQL_CS_DEFAULT_CHARACTER_SET 0x00000004L - -/* SQL_CREATE_TRANSLATION bitmasks */ -#define SQL_CTR_CREATE_TRANSLATION 0x00000001L - -/* SQL_CREATE_ASSERTION bitmasks */ -#define SQL_CA_CREATE_ASSERTION 0x00000001L -#define SQL_CA_CONSTRAINT_INITIALLY_DEFERRED 0x00000010L -#define SQL_CA_CONSTRAINT_INITIALLY_IMMEDIATE 0x00000020L -#define SQL_CA_CONSTRAINT_DEFERRABLE 0x00000040L -#define SQL_CA_CONSTRAINT_NON_DEFERRABLE 0x00000080L - -/* SQL_CREATE_CHARACTER_SET bitmasks */ -#define SQL_CCS_CREATE_CHARACTER_SET 0x00000001L -#define SQL_CCS_COLLATE_CLAUSE 0x00000002L -#define SQL_CCS_LIMITED_COLLATION 0x00000004L - -/* SQL_CREATE_COLLATION bitmasks */ -#define SQL_CCOL_CREATE_COLLATION 0x00000001L - -/* SQL_CREATE_DOMAIN bitmasks */ -#define SQL_CDO_CREATE_DOMAIN 0x00000001L -#define SQL_CDO_DEFAULT 0x00000002L -#define SQL_CDO_CONSTRAINT 0x00000004L -#define SQL_CDO_COLLATION 0x00000008L -#define SQL_CDO_CONSTRAINT_NAME_DEFINITION 0x00000010L -#define SQL_CDO_CONSTRAINT_INITIALLY_DEFERRED 0x00000020L -#define SQL_CDO_CONSTRAINT_INITIALLY_IMMEDIATE 0x00000040L -#define SQL_CDO_CONSTRAINT_DEFERRABLE 0x00000080L -#define SQL_CDO_CONSTRAINT_NON_DEFERRABLE 0x00000100L - -/* SQL_CREATE_TABLE bitmasks */ -#define SQL_CT_CREATE_TABLE 0x00000001L -#define SQL_CT_COMMIT_PRESERVE 0x00000002L -#define SQL_CT_COMMIT_DELETE 0x00000004L -#define SQL_CT_GLOBAL_TEMPORARY 0x00000008L -#define SQL_CT_LOCAL_TEMPORARY 0x00000010L -#define SQL_CT_CONSTRAINT_INITIALLY_DEFERRED 0x00000020L -#define SQL_CT_CONSTRAINT_INITIALLY_IMMEDIATE 0x00000040L -#define SQL_CT_CONSTRAINT_DEFERRABLE 0x00000080L -#define SQL_CT_CONSTRAINT_NON_DEFERRABLE 0x00000100L -#define SQL_CT_COLUMN_CONSTRAINT 0x00000200L -#define SQL_CT_COLUMN_DEFAULT 0x00000400L -#define SQL_CT_COLUMN_COLLATION 0x00000800L -#define SQL_CT_TABLE_CONSTRAINT 0x00001000L -#define SQL_CT_CONSTRAINT_NAME_DEFINITION 0x00002000L - -/* SQL_DDL_INDEX bitmasks */ -#define SQL_DI_CREATE_INDEX 0x00000001L -#define SQL_DI_DROP_INDEX 0x00000002L - -/* SQL_DROP_COLLATION bitmasks */ -#define SQL_DC_DROP_COLLATION 0x00000001L - -/* SQL_DROP_DOMAIN bitmasks */ -#define SQL_DD_DROP_DOMAIN 0x00000001L -#define SQL_DD_RESTRICT 0x00000002L -#define SQL_DD_CASCADE 0x00000004L - -/* SQL_DROP_SCHEMA bitmasks */ -#define SQL_DS_DROP_SCHEMA 0x00000001L -#define SQL_DS_RESTRICT 0x00000002L -#define SQL_DS_CASCADE 0x00000004L - -/* SQL_DROP_CHARACTER_SET bitmasks */ -#define SQL_DCS_DROP_CHARACTER_SET 0x00000001L - -/* SQL_DROP_ASSERTION bitmasks */ -#define SQL_DA_DROP_ASSERTION 0x00000001L - -/* SQL_DROP_TABLE bitmasks */ -#define SQL_DT_DROP_TABLE 0x00000001L -#define SQL_DT_RESTRICT 0x00000002L -#define SQL_DT_CASCADE 0x00000004L - -/* SQL_DROP_TRANSLATION bitmasks */ -#define SQL_DTR_DROP_TRANSLATION 0x00000001L - -/* SQL_DROP_VIEW bitmasks */ -#define SQL_DV_DROP_VIEW 0x00000001L -#define SQL_DV_RESTRICT 0x00000002L -#define SQL_DV_CASCADE 0x00000004L - -/* SQL_INSERT_STATEMENT bitmasks */ -#define SQL_IS_INSERT_LITERALS 0x00000001L -#define SQL_IS_INSERT_SEARCHED 0x00000002L -#define SQL_IS_SELECT_INTO 0x00000004L - -/* SQL_ODBC_INTERFACE_CONFORMANCE values */ -#define SQL_OIC_CORE 1UL -#define SQL_OIC_LEVEL1 2UL -#define SQL_OIC_LEVEL2 3UL - -/* SQL_SQL92_FOREIGN_KEY_DELETE_RULE bitmasks */ -#define SQL_SFKD_CASCADE 0x00000001L -#define SQL_SFKD_NO_ACTION 0x00000002L -#define SQL_SFKD_SET_DEFAULT 0x00000004L -#define SQL_SFKD_SET_NULL 0x00000008L - -/* SQL_SQL92_FOREIGN_KEY_UPDATE_RULE bitmasks */ -#define SQL_SFKU_CASCADE 0x00000001L -#define SQL_SFKU_NO_ACTION 0x00000002L -#define SQL_SFKU_SET_DEFAULT 0x00000004L -#define SQL_SFKU_SET_NULL 0x00000008L - -/* SQL_SQL92_GRANT bitmasks */ -#define SQL_SG_USAGE_ON_DOMAIN 0x00000001L -#define SQL_SG_USAGE_ON_CHARACTER_SET 0x00000002L -#define SQL_SG_USAGE_ON_COLLATION 0x00000004L -#define SQL_SG_USAGE_ON_TRANSLATION 0x00000008L -#define SQL_SG_WITH_GRANT_OPTION 0x00000010L -#define SQL_SG_DELETE_TABLE 0x00000020L -#define SQL_SG_INSERT_TABLE 0x00000040L -#define SQL_SG_INSERT_COLUMN 0x00000080L -#define SQL_SG_REFERENCES_TABLE 0x00000100L -#define SQL_SG_REFERENCES_COLUMN 0x00000200L -#define SQL_SG_SELECT_TABLE 0x00000400L -#define SQL_SG_UPDATE_TABLE 0x00000800L -#define SQL_SG_UPDATE_COLUMN 0x00001000L - -/* SQL_SQL92_PREDICATES bitmasks */ -#define SQL_SP_EXISTS 0x00000001L -#define SQL_SP_ISNOTNULL 0x00000002L -#define SQL_SP_ISNULL 0x00000004L -#define SQL_SP_MATCH_FULL 0x00000008L -#define SQL_SP_MATCH_PARTIAL 0x00000010L -#define SQL_SP_MATCH_UNIQUE_FULL 0x00000020L -#define SQL_SP_MATCH_UNIQUE_PARTIAL 0x00000040L -#define SQL_SP_OVERLAPS 0x00000080L -#define SQL_SP_UNIQUE 0x00000100L -#define SQL_SP_LIKE 0x00000200L -#define SQL_SP_IN 0x00000400L -#define SQL_SP_BETWEEN 0x00000800L -#define SQL_SP_COMPARISON 0x00001000L -#define SQL_SP_QUANTIFIED_COMPARISON 0x00002000L - -/* SQL_SQL92_RELATIONAL_JOIN_OPERATORS bitmasks */ -#define SQL_SRJO_CORRESPONDING_CLAUSE 0x00000001L -#define SQL_SRJO_CROSS_JOIN 0x00000002L -#define SQL_SRJO_EXCEPT_JOIN 0x00000004L -#define SQL_SRJO_FULL_OUTER_JOIN 0x00000008L -#define SQL_SRJO_INNER_JOIN 0x00000010L -#define SQL_SRJO_INTERSECT_JOIN 0x00000020L -#define SQL_SRJO_LEFT_OUTER_JOIN 0x00000040L -#define SQL_SRJO_NATURAL_JOIN 0x00000080L -#define SQL_SRJO_RIGHT_OUTER_JOIN 0x00000100L -#define SQL_SRJO_UNION_JOIN 0x00000200L - -/* SQL_SQL92_REVOKE bitmasks */ -#define SQL_SR_USAGE_ON_DOMAIN 0x00000001L -#define SQL_SR_USAGE_ON_CHARACTER_SET 0x00000002L -#define SQL_SR_USAGE_ON_COLLATION 0x00000004L -#define SQL_SR_USAGE_ON_TRANSLATION 0x00000008L -#define SQL_SR_GRANT_OPTION_FOR 0x00000010L -#define SQL_SR_CASCADE 0x00000020L -#define SQL_SR_RESTRICT 0x00000040L -#define SQL_SR_DELETE_TABLE 0x00000080L -#define SQL_SR_INSERT_TABLE 0x00000100L -#define SQL_SR_INSERT_COLUMN 0x00000200L -#define SQL_SR_REFERENCES_TABLE 0x00000400L -#define SQL_SR_REFERENCES_COLUMN 0x00000800L -#define SQL_SR_SELECT_TABLE 0x00001000L -#define SQL_SR_UPDATE_TABLE 0x00002000L -#define SQL_SR_UPDATE_COLUMN 0x00004000L - -/* SQL_SQL92_ROW_VALUE_CONSTRUCTOR bitmasks */ -#define SQL_SRVC_VALUE_EXPRESSION 0x00000001L -#define SQL_SRVC_NULL 0x00000002L -#define SQL_SRVC_DEFAULT 0x00000004L -#define SQL_SRVC_ROW_SUBQUERY 0x00000008L - -/* SQL_SQL92_VALUE_EXPRESSIONS bitmasks */ -#define SQL_SVE_CASE 0x00000001L -#define SQL_SVE_CAST 0x00000002L -#define SQL_SVE_COALESCE 0x00000004L -#define SQL_SVE_NULLIF 0x00000008L - -/* SQL_STANDARD_CLI_CONFORMANCE bitmasks */ -#define SQL_SCC_XOPEN_CLI_VERSION1 0x00000001L -#define SQL_SCC_ISO92_CLI 0x00000002L - -/* SQL_UNION_STATEMENT bitmasks */ -#define SQL_US_UNION SQL_U_UNION -#define SQL_US_UNION_ALL SQL_U_UNION_ALL - -/* values for SQL_DRIVER_AWARE_POOLING_SUPPORTED */ -#define SQL_DRIVER_AWARE_POOLING_NOT_CAPABLE 0x00000000L -#define SQL_DRIVER_AWARE_POOLING_CAPABLE 0x00000001L -#endif /* ODBCVER >= 0x0300 */ - -/* SQL_DTC_TRANSITION_COST bitmasks */ -#define SQL_DTC_ENLIST_EXPENSIVE 0x00000001L -#define SQL_DTC_UNENLIST_EXPENSIVE 0x00000002L - -#if (ODBCVER >= 0x0380) -/* possible values for SQL_ASYNC_DBC_FUNCTIONS */ -#define SQL_ASYNC_DBC_NOT_CAPABLE 0x00000000L -#define SQL_ASYNC_DBC_CAPABLE 0x00000001L -#endif - -/* additional SQLDataSources fetch directions */ -#if (ODBCVER >= 0x0300) -#define SQL_FETCH_FIRST_USER 31 -#define SQL_FETCH_FIRST_SYSTEM 32 -#endif /* ODBCVER >= 0x0300 */ - - -/* Defines for SQLSetPos */ -#define SQL_ENTIRE_ROWSET 0 - -/* Operations in SQLSetPos */ -#define SQL_POSITION 0 /* 1.0 FALSE */ -#define SQL_REFRESH 1 /* 1.0 TRUE */ -#define SQL_UPDATE 2 -#define SQL_DELETE 3 - -/* Operations in SQLBulkOperations */ -#define SQL_ADD 4 -#define SQL_SETPOS_MAX_OPTION_VALUE SQL_ADD -#if (ODBCVER >= 0x0300) -#define SQL_UPDATE_BY_BOOKMARK 5 -#define SQL_DELETE_BY_BOOKMARK 6 -#define SQL_FETCH_BY_BOOKMARK 7 - -#endif /* ODBCVER >= 0x0300 */ - -/* Lock options in SQLSetPos */ -#define SQL_LOCK_NO_CHANGE 0 /* 1.0 FALSE */ -#define SQL_LOCK_EXCLUSIVE 1 /* 1.0 TRUE */ -#define SQL_LOCK_UNLOCK 2 - -#define SQL_SETPOS_MAX_LOCK_VALUE SQL_LOCK_UNLOCK - -/* Macros for SQLSetPos */ -#define SQL_POSITION_TO(hstmt,irow) SQLSetPos(hstmt,irow,SQL_POSITION,SQL_LOCK_NO_CHANGE) -#define SQL_LOCK_RECORD(hstmt,irow,fLock) SQLSetPos(hstmt,irow,SQL_POSITION,fLock) -#define SQL_REFRESH_RECORD(hstmt,irow,fLock) SQLSetPos(hstmt,irow,SQL_REFRESH,fLock) -#define SQL_UPDATE_RECORD(hstmt,irow) SQLSetPos(hstmt,irow,SQL_UPDATE,SQL_LOCK_NO_CHANGE) -#define SQL_DELETE_RECORD(hstmt,irow) SQLSetPos(hstmt,irow,SQL_DELETE,SQL_LOCK_NO_CHANGE) -#define SQL_ADD_RECORD(hstmt,irow) SQLSetPos(hstmt,irow,SQL_ADD,SQL_LOCK_NO_CHANGE) - -/* Column types and scopes in SQLSpecialColumns. */ -#define SQL_BEST_ROWID 1 -#define SQL_ROWVER 2 - -/* Defines for SQLSpecialColumns (returned in the result set) - SQL_PC_UNKNOWN and SQL_PC_PSEUDO are defined in sql.h */ -#define SQL_PC_NOT_PSEUDO 1 - -/* Defines for SQLStatistics */ -#define SQL_QUICK 0 -#define SQL_ENSURE 1 - -/* Defines for SQLStatistics (returned in the result set) - SQL_INDEX_CLUSTERED, SQL_INDEX_HASHED, and SQL_INDEX_OTHER are - defined in sql.h */ -#define SQL_TABLE_STAT 0 - - -/* Defines for SQLTables */ -#if (ODBCVER >= 0x0300) -#define SQL_ALL_CATALOGS "%" -#define SQL_ALL_SCHEMAS "%" -#define SQL_ALL_TABLE_TYPES "%" -#endif /* ODBCVER >= 0x0300 */ - -/* Options for SQLDriverConnect */ -#define SQL_DRIVER_NOPROMPT 0 -#define SQL_DRIVER_COMPLETE 1 -#define SQL_DRIVER_PROMPT 2 -#define SQL_DRIVER_COMPLETE_REQUIRED 3 - -SQLRETURN SQL_API SQLDriverConnect( - SQLHDBC hdbc, - SQLHWND hwnd, - SQLCHAR *szConnStrIn, - SQLSMALLINT cbConnStrIn, - SQLCHAR *szConnStrOut, - SQLSMALLINT cbConnStrOutMax, - SQLSMALLINT *pcbConnStrOut, - SQLUSMALLINT fDriverCompletion); - -/* Level 2 Functions */ - -/* SQLExtendedFetch "fFetchType" values */ -#define SQL_FETCH_BOOKMARK 8 - -/* SQLExtendedFetch "rgfRowStatus" element values */ -#define SQL_ROW_SUCCESS 0 -#define SQL_ROW_DELETED 1 -#define SQL_ROW_UPDATED 2 -#define SQL_ROW_NOROW 3 -#define SQL_ROW_ADDED 4 -#define SQL_ROW_ERROR 5 -#if (ODBCVER >= 0x0300) -#define SQL_ROW_SUCCESS_WITH_INFO 6 -#define SQL_ROW_PROCEED 0 -#define SQL_ROW_IGNORE 1 -#endif - -/* value for SQL_DESC_ARRAY_STATUS_PTR */ -#if (ODBCVER >= 0x0300) -#define SQL_PARAM_SUCCESS 0 -#define SQL_PARAM_SUCCESS_WITH_INFO 6 -#define SQL_PARAM_ERROR 5 -#define SQL_PARAM_UNUSED 7 -#define SQL_PARAM_DIAG_UNAVAILABLE 1 - -#define SQL_PARAM_PROCEED 0 -#define SQL_PARAM_IGNORE 1 -#endif /* ODBCVER >= 0x0300 */ - -/* Defines for SQLForeignKeys (UPDATE_RULE and DELETE_RULE) */ -#define SQL_CASCADE 0 -#define SQL_RESTRICT 1 -#define SQL_SET_NULL 2 -#if (ODBCVER >= 0x0250) -#define SQL_NO_ACTION 3 -#define SQL_SET_DEFAULT 4 -#endif /* ODBCVER >= 0x0250 */ - -#if (ODBCVER >= 0x0300) -/* Note that the following are in a different column of SQLForeignKeys than */ -/* the previous #defines. These are for DEFERRABILITY. */ - -#define SQL_INITIALLY_DEFERRED 5 -#define SQL_INITIALLY_IMMEDIATE 6 -#define SQL_NOT_DEFERRABLE 7 - -#endif /* ODBCVER >= 0x0300 */ - -/* Defines for SQLBindParameter and - SQLProcedureColumns (returned in the result set) */ -#define SQL_PARAM_TYPE_UNKNOWN 0 -#define SQL_PARAM_INPUT 1 -#define SQL_PARAM_INPUT_OUTPUT 2 -#define SQL_RESULT_COL 3 -#define SQL_PARAM_OUTPUT 4 -#define SQL_RETURN_VALUE 5 -#if (ODBCVER >= 0x0380) - #define SQL_PARAM_INPUT_OUTPUT_STREAM 8 - #define SQL_PARAM_OUTPUT_STREAM 16 -#endif - - -/* Defines for SQLProcedures (returned in the result set) */ -#define SQL_PT_UNKNOWN 0 -#define SQL_PT_PROCEDURE 1 -#define SQL_PT_FUNCTION 2 - -/* This define is too large for RC */ -#define SQL_ODBC_KEYWORDS "ABSOLUTE,ACTION,ADA,ADD,ALL,ALLOCATE,ALTER,AND,ANY,ARE,AS,"\ -"ASC,ASSERTION,AT,AUTHORIZATION,AVG,"\ -"BEGIN,BETWEEN,BIT,BIT_LENGTH,BOTH,BY,CASCADE,CASCADED,CASE,CAST,CATALOG,"\ -"CHAR,CHAR_LENGTH,CHARACTER,CHARACTER_LENGTH,CHECK,CLOSE,COALESCE,"\ -"COLLATE,COLLATION,COLUMN,COMMIT,CONNECT,CONNECTION,CONSTRAINT,"\ -"CONSTRAINTS,CONTINUE,CONVERT,CORRESPONDING,COUNT,CREATE,CROSS,CURRENT,"\ -"CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP,CURRENT_USER,CURSOR,"\ -"DATE,DAY,DEALLOCATE,DEC,DECIMAL,DECLARE,DEFAULT,DEFERRABLE,"\ -"DEFERRED,DELETE,DESC,DESCRIBE,DESCRIPTOR,DIAGNOSTICS,DISCONNECT,"\ -"DISTINCT,DOMAIN,DOUBLE,DROP,"\ -"ELSE,END,END-EXEC,ESCAPE,EXCEPT,EXCEPTION,EXEC,EXECUTE,"\ -"EXISTS,EXTERNAL,EXTRACT,"\ -"FALSE,FETCH,FIRST,FLOAT,FOR,FOREIGN,FORTRAN,FOUND,FROM,FULL,"\ -"GET,GLOBAL,GO,GOTO,GRANT,GROUP,HAVING,HOUR,"\ -"IDENTITY,IMMEDIATE,IN,INCLUDE,INDEX,INDICATOR,INITIALLY,INNER,"\ -"INPUT,INSENSITIVE,INSERT,INT,INTEGER,INTERSECT,INTERVAL,INTO,IS,ISOLATION,"\ -"JOIN,KEY,LANGUAGE,LAST,LEADING,LEFT,LEVEL,LIKE,LOCAL,LOWER,"\ -"MATCH,MAX,MIN,MINUTE,MODULE,MONTH,"\ -"NAMES,NATIONAL,NATURAL,NCHAR,NEXT,NO,NONE,NOT,NULL,NULLIF,NUMERIC,"\ -"OCTET_LENGTH,OF,ON,ONLY,OPEN,OPTION,OR,ORDER,OUTER,OUTPUT,OVERLAPS,"\ -"PAD,PARTIAL,PASCAL,PLI,POSITION,PRECISION,PREPARE,PRESERVE,"\ -"PRIMARY,PRIOR,PRIVILEGES,PROCEDURE,PUBLIC,"\ -"READ,REAL,REFERENCES,RELATIVE,RESTRICT,REVOKE,RIGHT,ROLLBACK,ROWS"\ -"SCHEMA,SCROLL,SECOND,SECTION,SELECT,SESSION,SESSION_USER,SET,SIZE,"\ -"SMALLINT,SOME,SPACE,SQL,SQLCA,SQLCODE,SQLERROR,SQLSTATE,SQLWARNING,"\ -"SUBSTRING,SUM,SYSTEM_USER,"\ -"TABLE,TEMPORARY,THEN,TIME,TIMESTAMP,TIMEZONE_HOUR,TIMEZONE_MINUTE,"\ -"TO,TRAILING,TRANSACTION,TRANSLATE,TRANSLATION,TRIM,TRUE,"\ -"UNION,UNIQUE,UNKNOWN,UPDATE,UPPER,USAGE,USER,USING,"\ -"VALUE,VALUES,VARCHAR,VARYING,VIEW,WHEN,WHENEVER,WHERE,WITH,WORK,WRITE,"\ -"YEAR,ZONE" - -SQLRETURN SQL_API SQLBrowseConnect( - SQLHDBC hdbc, - SQLCHAR *szConnStrIn, - SQLSMALLINT cbConnStrIn, - SQLCHAR *szConnStrOut, - SQLSMALLINT cbConnStrOutMax, - SQLSMALLINT *pcbConnStrOut); - -#if (ODBCVER >= 0x0300) -SQLRETURN SQL_API SQLBulkOperations( - SQLHSTMT StatementHandle, - SQLSMALLINT Operation); -#endif /* ODBCVER >= 0x0300 */ - -SQLRETURN SQL_API SQLColAttributes( - SQLHSTMT hstmt, - SQLUSMALLINT icol, - SQLUSMALLINT fDescType, - SQLPOINTER rgbDesc, - SQLSMALLINT cbDescMax, - SQLSMALLINT *pcbDesc, - SQLLEN *pfDesc); - -SQLRETURN SQL_API SQLColumnPrivileges( - SQLHSTMT hstmt, - SQLCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLCHAR *szTableName, - SQLSMALLINT cbTableName, - SQLCHAR *szColumnName, - SQLSMALLINT cbColumnName); - -SQLRETURN SQL_API SQLDescribeParam( - SQLHSTMT hstmt, - SQLUSMALLINT ipar, - SQLSMALLINT *pfSqlType, - SQLULEN *pcbParamDef, - SQLSMALLINT *pibScale, - SQLSMALLINT *pfNullable); - -SQLRETURN SQL_API SQLExtendedFetch( - SQLHSTMT hstmt, - SQLUSMALLINT fFetchType, - SQLLEN irow, - SQLULEN *pcrow, - SQLUSMALLINT *rgfRowStatus); - -SQLRETURN SQL_API SQLForeignKeys( - SQLHSTMT hstmt, - SQLCHAR *szPkCatalogName, - SQLSMALLINT cbPkCatalogName, - SQLCHAR *szPkSchemaName, - SQLSMALLINT cbPkSchemaName, - SQLCHAR *szPkTableName, - SQLSMALLINT cbPkTableName, - SQLCHAR *szFkCatalogName, - SQLSMALLINT cbFkCatalogName, - SQLCHAR *szFkSchemaName, - SQLSMALLINT cbFkSchemaName, - SQLCHAR *szFkTableName, - SQLSMALLINT cbFkTableName); - -SQLRETURN SQL_API SQLMoreResults( - SQLHSTMT hstmt); - -SQLRETURN SQL_API SQLNativeSql( - SQLHDBC hdbc, - SQLCHAR *szSqlStrIn, - SQLINTEGER cbSqlStrIn, - SQLCHAR *szSqlStr, - SQLINTEGER cbSqlStrMax, - SQLINTEGER *pcbSqlStr); - -SQLRETURN SQL_API SQLNumParams( - SQLHSTMT hstmt, - SQLSMALLINT *pcpar); - -SQLRETURN SQL_API SQLParamOptions( - SQLHSTMT hstmt, - SQLULEN crow, - SQLULEN *pirow); - -SQLRETURN SQL_API SQLPrimaryKeys( - SQLHSTMT hstmt, - SQLCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLCHAR *szTableName, - SQLSMALLINT cbTableName); - -SQLRETURN SQL_API SQLProcedureColumns( - SQLHSTMT hstmt, - SQLCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLCHAR *szProcName, - SQLSMALLINT cbProcName, - SQLCHAR *szColumnName, - SQLSMALLINT cbColumnName); - -SQLRETURN SQL_API SQLProcedures( - SQLHSTMT hstmt, - SQLCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLCHAR *szProcName, - SQLSMALLINT cbProcName); - -SQLRETURN SQL_API SQLSetPos( - SQLHSTMT hstmt, - SQLSETPOSIROW irow, - SQLUSMALLINT fOption, - SQLUSMALLINT fLock); - -SQLRETURN SQL_API SQLTablePrivileges( - SQLHSTMT hstmt, - SQLCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLCHAR *szTableName, - SQLSMALLINT cbTableName); - -SQLRETURN SQL_API SQLDrivers( - SQLHENV henv, - SQLUSMALLINT fDirection, - SQLCHAR *szDriverDesc, - SQLSMALLINT cbDriverDescMax, - SQLSMALLINT *pcbDriverDesc, - SQLCHAR *szDriverAttributes, - SQLSMALLINT cbDrvrAttrMax, - SQLSMALLINT *pcbDrvrAttr); - -SQLRETURN SQL_API SQLBindParameter( - SQLHSTMT hstmt, - SQLUSMALLINT ipar, - SQLSMALLINT fParamType, - SQLSMALLINT fCType, - SQLSMALLINT fSqlType, - SQLULEN cbColDef, - SQLSMALLINT ibScale, - SQLPOINTER rgbValue, - SQLLEN cbValueMax, - SQLLEN *pcbValue); - -/*---------------------------------------------------------*/ -/* SQLAllocHandleStd is implemented to make SQLAllocHandle */ -/* compatible with X/Open standard. an application should */ -/* not call SQLAllocHandleStd directly */ -/*---------------------------------------------------------*/ -#ifdef ODBC_STD -#define SQLAllocHandle SQLAllocHandleStd -#define SQLAllocEnv(phenv) SQLAllocHandleStd(SQL_HANDLE_ENV, SQL_NULL_HANDLE, phenv) - -/* Internal type subcodes */ -#define SQL_YEAR SQL_CODE_YEAR -#define SQL_MONTH SQL_CODE_MONTH -#define SQL_DAY SQL_CODE_DAY -#define SQL_HOUR SQL_CODE_HOUR -#define SQL_MINUTE SQL_CODE_MINUTE -#define SQL_SECOND SQL_CODE_SECOND -#define SQL_YEAR_TO_MONTH SQL_CODE_YEAR_TO_MONTH -#define SQL_DAY_TO_HOUR SQL_CODE_DAY_TO_HOUR -#define SQL_DAY_TO_MINUTE SQL_CODE_DAY_TO_MINUTE -#define SQL_DAY_TO_SECOND SQL_CODE_DAY_TO_SECOND -#define SQL_HOUR_TO_MINUTE SQL_CODE_HOUR_TO_MINUTE -#define SQL_HOUR_TO_SECOND SQL_CODE_HOUR_TO_SECOND -#define SQL_MINUTE_TO_SECOND SQL_CODE_MINUTE_TO_SECOND -#endif /* ODBC_STD */ - -#if (ODBCVER >= 0x0300) -SQLRETURN SQL_API SQLAllocHandleStd( - SQLSMALLINT fHandleType, - SQLHANDLE hInput, - SQLHANDLE *phOutput); -#endif - -/* Deprecated defines from prior versions of ODBC */ -#define SQL_DATABASE_NAME 16 /* Use SQLGetConnectOption/SQL_CURRENT_QUALIFIER */ -#define SQL_FD_FETCH_PREV SQL_FD_FETCH_PRIOR -#define SQL_FETCH_PREV SQL_FETCH_PRIOR -#define SQL_CONCUR_TIMESTAMP SQL_CONCUR_ROWVER -#define SQL_SCCO_OPT_TIMESTAMP SQL_SCCO_OPT_ROWVER -#define SQL_CC_DELETE SQL_CB_DELETE -#define SQL_CR_DELETE SQL_CB_DELETE -#define SQL_CC_CLOSE SQL_CB_CLOSE -#define SQL_CR_CLOSE SQL_CB_CLOSE -#define SQL_CC_PRESERVE SQL_CB_PRESERVE -#define SQL_CR_PRESERVE SQL_CB_PRESERVE -/* SQL_FETCH_RESUME is not supported by 2.0+ drivers -#define SQL_FETCH_RESUME 7 -*/ -#define SQL_SCROLL_FORWARD_ONLY 0L /*-SQL_CURSOR_FORWARD_ONLY */ -#define SQL_SCROLL_KEYSET_DRIVEN (-1L) /*-SQL_CURSOR_KEYSET_DRIVEN */ -#define SQL_SCROLL_DYNAMIC (-2L) /*-SQL_CURSOR_DYNAMIC */ -#define SQL_SCROLL_STATIC (-3L) /*-SQL_CURSOR_STATIC */ - -/* Deprecated functions from prior versions of ODBC */ -SQLRETURN SQL_API SQLSetScrollOptions( /* Use SQLSetStmtOptions */ - SQLHSTMT hstmt, - SQLUSMALLINT fConcurrency, - SQLLEN crowKeyset, - SQLUSMALLINT crowRowset); - -/*! - * \defgroup Tracing. - * - * unixODBC implements a slight variation of the tracing mechanism used - * on MS platforms. The unixODBC method loses the ability to produce trace - * output for invalid handles but gains the following; - * - * - better concurrency - * - allows tracing to be turned on/off and configured at finer granularity - * - hopefully; better performance - * - * unixODBC provides a cross-platform helper library called 'trace' and an - * example/default trace plugin called 'odbctrac'. Those writing an ODBC - * driver can use the 'trace' helper library (a static library). Those wanting - * to create custom trace output can implement a different version of the - * 'odbctrac' plugin. - * - * The text file driver (odbctxt) included with unixODBC is an example of a - * driver using the 'trace' helper library. - * - * The 'trace' library and the example plugin 'odbctrac' are designed to be - * portable on all platforms where unixODBC is available and on MS platforms. - * This will allow drivers using 'trace' and 'odbctrac' plugin to equilly - * portable. On MS platforms - this compliments traditional tracing (mostly - * just used by the Driver Manager). - * - * \sa trace - * odbctxt - * odbctrac - */ -/**@{*/ -#define TRACE_VERSION 1000 /*!< Version of trace API */ -#ifdef UNICODE -RETCODE TraceOpenLogFile(SQLPOINTER,LPWSTR,LPWSTR,DWORD); /*!< open a trace log file */ -#else -RETCODE TraceOpenLogFile(SQLPOINTER,LPSTR,LPSTR,DWORD); /*!< open a trace log file */ -#endif -RETCODE TraceCloseLogFile(SQLPOINTER); /*!< Request to close a trace log */ -SQLRETURN TraceReturn(SQLPOINTER,SQLRETURN); /*!< Call to produce trace output upon function return. */ -DWORD TraceVersion(void); /*!< Returns trace API version */ - -/* Functions for Visual Studio Analyzer*/ -/* to turn on/off tracing or VS events, call TraceVSControl by setting or clearing the following bits */ -#define TRACE_ON 0x00000001L -#define TRACE_VS_EVENT_ON 0x00000002L - -RETCODE TraceVSControl(DWORD); - -/* the flags in ODBC_VS_ARGS */ -#define ODBC_VS_FLAG_UNICODE_ARG 0x00000001L /* the argument is unicode */ -#define ODBC_VS_FLAG_UNICODE_COR 0x00000002L /* the correlation is unicode */ -#define ODBC_VS_FLAG_RETCODE 0x00000004L /* RetCode field is set */ -#define ODBC_VS_FLAG_STOP 0x00000008L /* Stop firing visual studio analyzer events */ - -typedef struct tagODBC_VS_ARGS { -#ifdef GUID_DEFINED - const GUID *pguidEvent; /* the GUID for event */ -#else - const void *pguidEvent; /* the GUID for event */ -#endif - DWORD dwFlags; /* flags for the call */ - union { - WCHAR *wszArg; - CHAR *szArg; - }u1; - union { - WCHAR *wszCorrelation; - CHAR *szCorrelation; - }u2; - RETCODE RetCode; -} ODBC_VS_ARGS, *PODBC_VS_ARGS; - -void FireVSDebugEvent(PODBC_VS_ARGS); -/**@}*/ - -#ifdef __cplusplus -} -#endif - -/* - * connection pooling retry times - */ - -BOOL ODBCSetTryWaitValue ( DWORD dwValue ); -#ifdef __cplusplus -DWORD ODBCGetTryWaitValue ( ); -#else -DWORD ODBCGetTryWaitValue ( void ); -#endif - -#ifndef __SQLUCODE_H -#include "sqlucode.h" -#endif - -#endif diff --git a/mssql_python/libs/macos/odbc_include/sqlspi.h b/mssql_python/libs/macos/odbc_include/sqlspi.h deleted file mode 100644 index e0a9d26d..00000000 --- a/mssql_python/libs/macos/odbc_include/sqlspi.h +++ /dev/null @@ -1,173 +0,0 @@ -/*----------------------------------------------------------------------------- - File: sqlspi.h - - Contents: This is the header for driver writers to support new ODBC - features. Application writers should not include - this header file - Please include and before including this - file - - Based on the sqlspi.h provided by Microsoft - ------------------------------------------------------------------------------*/ - -#ifndef __SQLSPI__ -#define __SQLSPI__ - -#ifdef __cplusplus -extern "C" { // Assume C declarations for C++ -#endif // End of __cplusplus - -/* SQL_SPI is just a marker for "Service Provider Interface", otherwise it is the same as API - Application should not call functions that are marked as SQL_SPI directly */ -#define SQL_SPI SQL_API - -/*-------------------- ODBC Connection Info Handle -----------------------------*/ -/* handle for storing connection information for ODBC driver connection pooling */ -#define SQL_HANDLE_DBC_INFO_TOKEN 6 // Handle type, used in SQLAllocHandle -typedef SQLHANDLE SQLHDBC_INFO_TOKEN; - -/*-------------------- ODBC Pool ID for driver-aware pooling -----------------------------*/ -typedef SQLULEN POOLID; -typedef DWORD* TRANSID; - -/*-------------------- Driver-aware Connection Pooling --------------------------*/ -/* We define a few scores with special meaning */ -/* But driver can return any score between 0 and 100 */ -typedef DWORD SQLConnPoolRating; -#define SQL_CONN_POOL_RATING_BEST 100 /* the best of the rating */ -#define SQL_CONN_POOL_RATING_GOOD_ENOUGH 99 /* the rating is good enough and we can stop rating */ -#define SQL_CONN_POOL_RATING_USELESS 0 /* the candidate connection must not be reused for the current request */ - -/* SQLSetConnectAttr */ -#define SQL_ATTR_DBC_INFO_TOKEN 118 /* reset the pooled connection in case it is not a perfect match */ - -/* Set connection attributes into DBC info token */ -SQLRETURN SQL_SPI SQLSetConnectAttrForDbcInfoW( - SQLHDBC_INFO_TOKEN hDbcInfoToken, - SQLINTEGER Attribute, - SQLPOINTER Value, - SQLINTEGER StringLength); - -/* Set connection information for SQLDriverConnect */ -SQLRETURN SQL_SPI SQLSetDriverConnectInfoW( - SQLHDBC_INFO_TOKEN hDbcInfoToken, - SQLWCHAR *szConnStrIn, - SQLSMALLINT cchConnStrIn); - -/* Set connection information for SQLConnect */ -SQLRETURN SQL_SPI SQLSetConnectInfoW -( - SQLHDBC_INFO_TOKEN hDbcInfoToken, - SQLWCHAR *szDSN, - SQLSMALLINT cchDSN, - SQLWCHAR *szUID, - SQLSMALLINT cchUID, - SQLWCHAR *szAuthStr, - SQLSMALLINT cchAuthStr -); - -/* Get the pool ID for the token */ -SQLRETURN SQL_SPI SQLGetPoolID( - SQLHDBC_INFO_TOKEN hDbcInfoToken, - POOLID* pPoolID); - -/* Return how close hCandidateConnection matches with hRequest */ -/* *pRating must be between SQL_CONN_POOL_RATING_USELESS and SQL_CONN_POOL_RATING_BEST (inclusively) */ -/* If return value is not SQL_SUCCESS or *pRating > SQL_CONN_POOL_RATING_BEST, the candidate */ -/* connection will not be used any more in any other connection request */ -/* If fRequiresTransactionEnlistment is TRUE, transId represents the DTC transaction ID that */ -/* should be enlisted to (transId == 0 means unenlistment). Otherwise, transId should be ignored */ -SQLRETURN SQL_SPI SQLRateConnection( - SQLHDBC_INFO_TOKEN hRequest, - SQLHDBC hCandidateConnection, - BOOL fRequiresTransactionEnlistment, - TRANSID transId, - SQLConnPoolRating *pRating); - -/* Create a physical connection */ -/* If application is calling SQLDriverConnect, szConnStrOut is non-NULL at input. */ -/* Otherwise, it will be set to NULL */ -SQLRETURN SQL_SPI SQLPoolConnectW( - SQLHDBC hdbc, - SQLHDBC_INFO_TOKEN hDbcInfoToken, - SQLWCHAR *szConnStrOut, - SQLSMALLINT cchConnStrOutMax, - SQLSMALLINT *pcchConnStrOut); - -/* Clean up a pool Id that was timed out */ -/*/ poolID [in]: the pool ID (under EnvironmentHandle) to be cleaned */ -SQLRETURN SQL_SPI SQLCleanupConnectionPoolID( - SQLHENV EnvironmentHandle, - POOLID poolID); - -/*-----------------------------------------------------------------------------*/ -/* functions for ANSI drivers */ - -/* Set connection attributes into DBC info token */ -SQLRETURN SQL_SPI SQLSetConnectAttrForDbcInfoA( - SQLHDBC_INFO_TOKEN hDbcInfoToken, - SQLINTEGER Attribute, - SQLPOINTER Value, - SQLINTEGER StringLength); - -/* Set connection information for SQLDriverConnect */ -SQLRETURN SQL_SPI SQLSetDriverConnectInfoA( - SQLHDBC_INFO_TOKEN hDbcInfoToken, - SQLCHAR *szConnStrIn, - SQLSMALLINT cchConnStrIn); - -/* Set connection information for SQLConnect */ -SQLRETURN SQL_SPI SQLSetConnectInfoA -( - SQLHDBC_INFO_TOKEN hDbcInfoToken, - SQLCHAR *szDSN, - SQLSMALLINT cchDSN, - SQLCHAR *szUID, - SQLSMALLINT cchUID, - SQLCHAR *szAuthStr, - SQLSMALLINT cchAuthStr -); - -/* Create a physical connection */ -/* If application is calling SQLDriverConnect, szConnStrOut is non-NULL at input. */ -/* Otherwise, it will be set to NULL */ -SQLRETURN SQL_SPI SQLPoolConnectA( - SQLHDBC hdbc, - SQLHDBC_INFO_TOKEN hDbcInfoToken, - SQLCHAR *szConnStrOut, - SQLSMALLINT cchConnStrOutMax, - SQLSMALLINT *pcchConnStrOut); - -/*-----------------------------------------------------------------------------*/ -/* Unicode mapping */ -/* Define SQL_NOUNICODEMAP to disable the mapping */ -#if (!defined(SQL_NOUNICODEMAP) && defined(UNICODE)) -#define SQLSetConnectAttrForDbcInfo SQLSetConnectAttrForDbcInfoW -#define SQLSetDriverConnectInfo SQLSetDriverConnectInfoW -#define SQLSetConnectInfo SQLSetConnectInfoW -#define SQLPoolConnect SQLPoolConnectW -#else -#define SQLSetConnectAttrForDbcInfo SQLSetConnectAttrForDbcInfoA -#define SQLSetDriverConnectInfo SQLSetDriverConnectInfoA -#define SQLSetConnectInfo SQLSetConnectInfoA -#define SQLPoolConnect SQLPoolConnectA -#endif -/*------------------------------------------------------------------------------*/ - -/*-------------------- Async Notification --------------------------*/ -#if (ODBCVER >= 0x0380) -#define SQL_ATTR_ASYNC_DBC_NOTIFICATION_CALLBACK 120 -#define SQL_ATTR_ASYNC_DBC_NOTIFICATION_CONTEXT 121 - -#define SQL_ATTR_ASYNC_STMT_NOTIFICATION_CALLBACK 30 -#define SQL_ATTR_ASYNC_STMT_NOTIFICATION_CONTEXT 31 - -typedef SQLRETURN (SQL_API *SQL_ASYNC_NOTIFICATION_CALLBACK)(SQLPOINTER pContext, BOOL fLast); -#endif /* ODBCVER >= 0x0380 */ - - -#ifdef __cplusplus -} // End of extern "C" { -#endif -#endif diff --git a/mssql_python/libs/macos/odbc_include/sqltypes.h b/mssql_python/libs/macos/odbc_include/sqltypes.h deleted file mode 100644 index c3350c2c..00000000 --- a/mssql_python/libs/macos/odbc_include/sqltypes.h +++ /dev/null @@ -1,482 +0,0 @@ -/************************************************************* - * sqltypes.h - * - * This is the lowest level include in unixODBC. It defines - * the basic types required by unixODBC and is heavily based - * upon the MS include of the same name (it has to be for - * binary compatability between drivers developed under different - * packages). - * - * You can include this file directly, but it is almost always - * included indirectly, by including, for example sqlext.h - * - * This include makes no effort to be useful on any platforms other - * than Linux (with some exceptions for UNIX in general). - * - * !!!DO NOT CONTAMINATE THIS FILE WITH NON-Linux CODE!!! - * - *************************************************************/ -#ifndef __SQLTYPES_H -#define __SQLTYPES_H - -/**************************** - * default to the 3.80 definitions. should define ODBCVER before here if you want an older set of defines - ***************************/ -#ifndef ODBCVER -#define ODBCVER 0x0380 -#endif - -/* - * if this is set, then use a 4 byte unicode definition, instead of the 2 byte definition that MS use - */ - -#ifdef SQL_WCHART_CONVERT -/* - * Use this if you want to use the C/C++ portable definition of a wide char, wchar_t - * Microsoft hardcoded a definition of unsigned short which may not be compatible with - * your platform specific wide char definition. - */ -#include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * unixODBC needs to know the size of a long integer to #define certain data types. - * SIZEOF_LONG_INT is defined by unixODBC but is not usually defined by other programs. - * In these cases, the compiler uses #defines stored in unixodbc.h to determine the - * correct data types for the target system. - * - * Refer to unixodbc_conf.h for other build-time settings. - */ - -#ifndef SIZEOF_LONG_INT -#include "unixodbc.h" -#endif - -#ifndef SIZEOF_LONG_INT -#error "unixODBC needs to know the size of a `long int' to continue!!!" -#endif - -/**************************** - * These make up for having no windows.h - ***************************/ -#ifndef ALREADY_HAVE_WINDOWS_TYPE - -#define FAR -#define CALLBACK -#ifdef __OS2__ -#define SQL_API _System -#else -#define SQL_API -#endif -#define BOOL int -#ifndef _WINDOWS_ -typedef void* HWND; -#endif -typedef char CHAR; -#ifdef UNICODE - -/* - * NOTE: The Microsoft unicode define is only for apps that want to use TCHARs and - * be able to compile for both unicode and non-unicode with the same source. - * This is not recommended for linux applications and is not supported - * by the standard linux string header files. - */ -#ifdef SQL_WCHART_CONVERT -typedef wchar_t TCHAR; -#else -typedef signed short TCHAR; -#endif - -#else -typedef char TCHAR; -#endif - -typedef unsigned short WORD; -#if (SIZEOF_LONG_INT == 4) -typedef unsigned long DWORD; -#else -typedef unsigned int DWORD; -#endif -typedef unsigned char BYTE; - -#ifdef SQL_WCHART_CONVERT -typedef wchar_t WCHAR; -#else -typedef unsigned short WCHAR; -#endif - -typedef WCHAR* LPWSTR; -typedef const char* LPCSTR; -typedef const WCHAR* LPCWSTR; -typedef TCHAR* LPTSTR; -typedef char* LPSTR; -typedef DWORD* LPDWORD; - -#ifndef _WINDOWS_ -typedef void* HINSTANCE; -#endif - -#endif - - -/**************************** - * standard SQL* data types. use these as much as possible when using ODBC calls/vars - ***************************/ -typedef unsigned char SQLCHAR; - -#if (ODBCVER >= 0x0300) -typedef unsigned char SQLDATE; -typedef unsigned char SQLDECIMAL; -typedef double SQLDOUBLE; -typedef double SQLFLOAT; -#endif - -/* - * can't use a long; it fails on 64 platforms - */ - -/* - * Hopefully by now it should be safe to assume most drivers know about SQLLEN now - * and the default is now sizeof( SQLLEN ) = 8 on 64 bit platforms - * - */ - -#if (SIZEOF_LONG_INT == 8) -#ifdef BUILD_LEGACY_64_BIT_MODE -typedef int SQLINTEGER; -typedef unsigned int SQLUINTEGER; -#define SQLLEN SQLINTEGER -#define SQLULEN SQLUINTEGER -#define SQLSETPOSIROW SQLUSMALLINT -/* - * These are not supprted on 64bit ODBC according to MS, removed, so use at your peril - * - typedef SQLULEN SQLROWCOUNT; - typedef SQLULEN SQLROWSETSIZE; - typedef SQLULEN SQLTRANSID; - typedef SQLLEN SQLROWOFFSET; -*/ -#else -typedef int SQLINTEGER; -typedef unsigned int SQLUINTEGER; -typedef long SQLLEN; -typedef unsigned long SQLULEN; -typedef unsigned long SQLSETPOSIROW; -/* - * These are not supprted on 64bit ODBC according to MS, removed, so use at your peril - * - typedef SQLULEN SQLTRANSID; - typedef SQLULEN SQLROWCOUNT; - typedef SQLUINTEGER SQLROWSETSIZE; - typedef SQLLEN SQLROWOFFSET; - */ -#endif -#else -typedef long SQLINTEGER; -typedef unsigned long SQLUINTEGER; - -/* Handle case of building on mingw-w64 */ - -#ifdef _WIN64 -typedef long long SQLLEN; -typedef unsigned long long SQLULEN; -typedef unsigned long long SQLSETPOSIROW; -#else -#define SQLLEN SQLINTEGER -#define SQLULEN SQLUINTEGER -#define SQLSETPOSIROW SQLUSMALLINT -#endif - -typedef SQLULEN SQLROWCOUNT; -typedef SQLULEN SQLROWSETSIZE; -typedef SQLULEN SQLTRANSID; -typedef SQLLEN SQLROWOFFSET; -#endif - -#if (ODBCVER >= 0x0300) -typedef unsigned char SQLNUMERIC; -#endif - -typedef void * SQLPOINTER; - -#if (ODBCVER >= 0x0300) -typedef float SQLREAL; -#endif - -typedef signed short int SQLSMALLINT; -typedef unsigned short SQLUSMALLINT; - -#if (ODBCVER >= 0x0300) -typedef unsigned char SQLTIME; -typedef unsigned char SQLTIMESTAMP; -typedef unsigned char SQLVARCHAR; -#endif - -typedef SQLSMALLINT SQLRETURN; - -#if (ODBCVER >= 0x0300) -typedef void * SQLHANDLE; -typedef SQLHANDLE SQLHENV; -typedef SQLHANDLE SQLHDBC; -typedef SQLHANDLE SQLHSTMT; -typedef SQLHANDLE SQLHDESC; -#else -typedef void * SQLHENV; -typedef void * SQLHDBC; -typedef void * SQLHSTMT; -/* - * some things like PHP won't build without this - */ -typedef void * SQLHANDLE; -#endif - -/**************************** - * These are cast into the actual struct that is being passed around. The - * DriverManager knows what its structs look like and the Driver knows about its - * structs... the app knows nothing about them... just void* - * These are deprecated in favour of SQLHENV, SQLHDBC, SQLHSTMT - ***************************/ - -#if (ODBCVER >= 0x0300) -typedef SQLHANDLE HENV; -typedef SQLHANDLE HDBC; -typedef SQLHANDLE HSTMT; -#else -typedef void * HENV; -typedef void * HDBC; -typedef void * HSTMT; -#endif - - -/**************************** - * more basic data types to augment what windows.h provides - ***************************/ -#ifndef ALREADY_HAVE_WINDOWS_TYPE - -typedef unsigned char UCHAR; -typedef signed char SCHAR; -typedef SCHAR SQLSCHAR; -#if (SIZEOF_LONG_INT == 4) -typedef long int SDWORD; -typedef unsigned long int UDWORD; -#else -typedef int SDWORD; -typedef unsigned int UDWORD; -#endif -typedef signed short int SWORD; -typedef unsigned short int UWORD; -typedef unsigned int UINT; -typedef signed long SLONG; -typedef signed short SSHORT; -typedef unsigned long ULONG; -typedef unsigned short USHORT; -typedef double SDOUBLE; -typedef double LDOUBLE; -typedef float SFLOAT; -typedef void* PTR; -typedef signed short RETCODE; -typedef void* SQLHWND; - -#endif - -/**************************** - * standard structs for working with date/times - ***************************/ -#ifndef __SQLDATE -#define __SQLDATE -typedef struct tagDATE_STRUCT -{ - SQLSMALLINT year; - SQLUSMALLINT month; - SQLUSMALLINT day; -} DATE_STRUCT; - -#if (ODBCVER >= 0x0300) -typedef DATE_STRUCT SQL_DATE_STRUCT; -#endif - -typedef struct tagTIME_STRUCT -{ - SQLUSMALLINT hour; - SQLUSMALLINT minute; - SQLUSMALLINT second; -} TIME_STRUCT; - -#if (ODBCVER >= 0x0300) -typedef TIME_STRUCT SQL_TIME_STRUCT; -#endif - -typedef struct tagTIMESTAMP_STRUCT -{ - SQLSMALLINT year; - SQLUSMALLINT month; - SQLUSMALLINT day; - SQLUSMALLINT hour; - SQLUSMALLINT minute; - SQLUSMALLINT second; - SQLUINTEGER fraction; -} TIMESTAMP_STRUCT; - -#if (ODBCVER >= 0x0300) -typedef TIMESTAMP_STRUCT SQL_TIMESTAMP_STRUCT; -#endif - - -#if (ODBCVER >= 0x0300) -typedef enum -{ - SQL_IS_YEAR = 1, - SQL_IS_MONTH = 2, - SQL_IS_DAY = 3, - SQL_IS_HOUR = 4, - SQL_IS_MINUTE = 5, - SQL_IS_SECOND = 6, - SQL_IS_YEAR_TO_MONTH = 7, - SQL_IS_DAY_TO_HOUR = 8, - SQL_IS_DAY_TO_MINUTE = 9, - SQL_IS_DAY_TO_SECOND = 10, - SQL_IS_HOUR_TO_MINUTE = 11, - SQL_IS_HOUR_TO_SECOND = 12, - SQL_IS_MINUTE_TO_SECOND = 13 -} SQLINTERVAL; - -#endif - -#if (ODBCVER >= 0x0300) -typedef struct tagSQL_YEAR_MONTH -{ - SQLUINTEGER year; - SQLUINTEGER month; -} SQL_YEAR_MONTH_STRUCT; - -typedef struct tagSQL_DAY_SECOND -{ - SQLUINTEGER day; - SQLUINTEGER hour; - SQLUINTEGER minute; - SQLUINTEGER second; - SQLUINTEGER fraction; -} SQL_DAY_SECOND_STRUCT; - -typedef struct tagSQL_INTERVAL_STRUCT -{ - SQLINTERVAL interval_type; - SQLSMALLINT interval_sign; - union { - SQL_YEAR_MONTH_STRUCT year_month; - SQL_DAY_SECOND_STRUCT day_second; - } intval; - -} SQL_INTERVAL_STRUCT; - -#endif - -#endif - -/**************************** - * - ***************************/ -#ifndef ODBCINT64 -# if (ODBCVER >= 0x0300) -# if (SIZEOF_LONG_INT == 8) -# define ODBCINT64 long -# define UODBCINT64 unsigned long -# define ODBCINT64_TYPE "long" -# define UODBCINT64_TYPE "unsigned long" -# else -# ifdef HAVE_LONG_LONG -# define ODBCINT64 long long -# define UODBCINT64 unsigned long long -# define ODBCINT64_TYPE "long long" -# define UODBCINT64_TYPE "unsigned long long" -# else -/* - * may fail in some cases, but what else can we do ? - */ -struct __bigint_struct -{ - int hiword; - unsigned int loword; -}; -struct __bigint_struct_u -{ - unsigned int hiword; - unsigned int loword; -}; -# define ODBCINT64 struct __bigint_struct -# define UODBCINT64 struct __bigint_struct_u -# define ODBCINT64_TYPE "struct __bigint_struct" -# define UODBCINT64_TYPE "struct __bigint_struct_u" -# endif -# endif -#endif -#endif - -#ifdef ODBCINT64 -typedef ODBCINT64 SQLBIGINT; -#endif -#ifdef UODBCINT64 -typedef UODBCINT64 SQLUBIGINT; -#endif - - -/**************************** - * cursor and bookmark - ***************************/ -#if (ODBCVER >= 0x0300) -#define SQL_MAX_NUMERIC_LEN 16 -typedef struct tagSQL_NUMERIC_STRUCT -{ - SQLCHAR precision; - SQLSCHAR scale; - SQLCHAR sign; /* 1=pos 0=neg */ - SQLCHAR val[SQL_MAX_NUMERIC_LEN]; -} SQL_NUMERIC_STRUCT; -#endif - -#if (ODBCVER >= 0x0350) -#ifdef GUID_DEFINED -#ifndef ALREADY_HAVE_WINDOWS_TYPE -typedef GUID SQLGUID; -#else -typedef struct tagSQLGUID -{ - DWORD Data1; - WORD Data2; - WORD Data3; - BYTE Data4[ 8 ]; -} SQLGUID; -#endif -#else -typedef struct tagSQLGUID -{ - DWORD Data1; - WORD Data2; - WORD Data3; - BYTE Data4[ 8 ]; -} SQLGUID; -#endif -#endif - -typedef SQLULEN BOOKMARK; - -typedef WCHAR SQLWCHAR; - -#ifdef UNICODE -typedef SQLWCHAR SQLTCHAR; -#else -typedef SQLCHAR SQLTCHAR; -#endif - -#ifdef __cplusplus -} -#endif - -#endif - - - diff --git a/mssql_python/libs/macos/odbc_include/sqlucode.h b/mssql_python/libs/macos/odbc_include/sqlucode.h deleted file mode 100644 index 7b29bde8..00000000 --- a/mssql_python/libs/macos/odbc_include/sqlucode.h +++ /dev/null @@ -1,789 +0,0 @@ -/************************************************** - * sqlucode.h - * - * These should be consistent with the MS version. - * - **************************************************/ -#ifndef __SQLUCODE_H -#define __SQLUCODE_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define SQL_WCHAR (-8) -#define SQL_WVARCHAR (-9) -#define SQL_WLONGVARCHAR (-10) -#define SQL_C_WCHAR SQL_WCHAR - -#ifdef UNICODE -#define SQL_C_TCHAR SQL_C_WCHAR -#else -#define SQL_C_TCHAR SQL_C_CHAR -#endif - -#define SQL_SQLSTATE_SIZEW 10 /* size of SQLSTATE for unicode */ - -/* UNICODE versions */ - -SQLRETURN SQL_API SQLColAttributeW( - SQLHSTMT hstmt, - SQLUSMALLINT iCol, - SQLUSMALLINT iField, - SQLPOINTER pCharAttr, - SQLSMALLINT cbCharAttrMax, - SQLSMALLINT *pcbCharAttr, - SQLLEN *pNumAttr); - -SQLRETURN SQL_API SQLColAttributesW( - SQLHSTMT hstmt, - SQLUSMALLINT icol, - SQLUSMALLINT fDescType, - SQLPOINTER rgbDesc, - SQLSMALLINT cbDescMax, - SQLSMALLINT *pcbDesc, - SQLLEN *pfDesc); - -SQLRETURN SQL_API SQLConnectW( - SQLHDBC hdbc, - SQLWCHAR *szDSN, - SQLSMALLINT cbDSN, - SQLWCHAR *szUID, - SQLSMALLINT cbUID, - SQLWCHAR *szAuthStr, - SQLSMALLINT cbAuthStr); - - -SQLRETURN SQL_API SQLDescribeColW( - SQLHSTMT hstmt, - SQLUSMALLINT icol, - SQLWCHAR *szColName, - SQLSMALLINT cbColNameMax, - SQLSMALLINT *pcbColName, - SQLSMALLINT *pfSqlType, - SQLULEN *pcbColDef, - SQLSMALLINT *pibScale, - SQLSMALLINT *pfNullable); - - -SQLRETURN SQL_API SQLErrorW( - SQLHENV henv, - SQLHDBC hdbc, - SQLHSTMT hstmt, - SQLWCHAR *szSqlState, - SQLINTEGER *pfNativeError, - SQLWCHAR *szErrorMsg, - SQLSMALLINT cbErrorMsgMax, - SQLSMALLINT *pcbErrorMsg); - -SQLRETURN SQL_API SQLExecDirectW( - SQLHSTMT hstmt, - SQLWCHAR *szSqlStr, - SQLINTEGER cbSqlStr); - -SQLRETURN SQL_API SQLGetConnectAttrW( - SQLHDBC hdbc, - SQLINTEGER fAttribute, - SQLPOINTER rgbValue, - SQLINTEGER cbValueMax, - SQLINTEGER *pcbValue); - -SQLRETURN SQL_API SQLGetCursorNameW( - SQLHSTMT hstmt, - SQLWCHAR *szCursor, - SQLSMALLINT cbCursorMax, - SQLSMALLINT *pcbCursor); - -#if (ODBCVER >= 0x0300) -SQLRETURN SQL_API SQLSetDescFieldW(SQLHDESC DescriptorHandle, - SQLSMALLINT RecNumber, - SQLSMALLINT FieldIdentifier, - SQLPOINTER Value, - SQLINTEGER BufferLength); - - - -SQLRETURN SQL_API SQLGetDescFieldW( - SQLHDESC hdesc, - SQLSMALLINT iRecord, - SQLSMALLINT iField, - SQLPOINTER rgbValue, - SQLINTEGER cbValueMax, - SQLINTEGER *pcbValue); - -SQLRETURN SQL_API SQLGetDescRecW( - SQLHDESC hdesc, - SQLSMALLINT iRecord, - SQLWCHAR *szName, - SQLSMALLINT cbNameMax, - SQLSMALLINT *pcbName, - SQLSMALLINT *pfType, - SQLSMALLINT *pfSubType, - SQLLEN *pLength, - SQLSMALLINT *pPrecision, - SQLSMALLINT *pScale, - SQLSMALLINT *pNullable); - -SQLRETURN SQL_API SQLGetDiagFieldW( - SQLSMALLINT fHandleType, - SQLHANDLE handle, - SQLSMALLINT iRecord, - SQLSMALLINT fDiagField, - SQLPOINTER rgbDiagInfo, - SQLSMALLINT cbDiagInfoMax, - SQLSMALLINT *pcbDiagInfo); - -SQLRETURN SQL_API SQLGetDiagRecW( - SQLSMALLINT fHandleType, - SQLHANDLE handle, - SQLSMALLINT iRecord, - SQLWCHAR *szSqlState, - SQLINTEGER *pfNativeError, - SQLWCHAR *szErrorMsg, - SQLSMALLINT cbErrorMsgMax, - SQLSMALLINT *pcbErrorMsg); - - -#endif - - -SQLRETURN SQL_API SQLPrepareW( - SQLHSTMT hstmt, - SQLWCHAR *szSqlStr, - SQLINTEGER cbSqlStr); - -SQLRETURN SQL_API SQLSetConnectAttrW( - SQLHDBC hdbc, - SQLINTEGER fAttribute, - SQLPOINTER rgbValue, - SQLINTEGER cbValue); - -SQLRETURN SQL_API SQLSetCursorNameW( - SQLHSTMT hstmt, - SQLWCHAR *szCursor, - SQLSMALLINT cbCursor); - - - - - - - -SQLRETURN SQL_API SQLColumnsW( - SQLHSTMT hstmt, - SQLWCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLWCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLWCHAR *szTableName, - SQLSMALLINT cbTableName, - SQLWCHAR *szColumnName, - SQLSMALLINT cbColumnName); - -SQLRETURN SQL_API SQLGetConnectOptionW( - SQLHDBC hdbc, - SQLUSMALLINT fOption, - SQLPOINTER pvParam); - - - -SQLRETURN SQL_API SQLGetInfoW( - SQLHDBC hdbc, - SQLUSMALLINT fInfoType, - SQLPOINTER rgbInfoValue, - SQLSMALLINT cbInfoValueMax, - SQLSMALLINT *pcbInfoValue); - -SQLRETURN SQL_API SQLGetTypeInfoW( - SQLHSTMT StatementHandle, - SQLSMALLINT DataType); - - -SQLRETURN SQL_API SQLSetConnectOptionW( - SQLHDBC hdbc, - SQLUSMALLINT fOption, - SQLULEN vParam); - - -SQLRETURN SQL_API SQLSpecialColumnsW( - SQLHSTMT hstmt, - SQLUSMALLINT fColType, - SQLWCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLWCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLWCHAR *szTableName, - SQLSMALLINT cbTableName, - SQLUSMALLINT fScope, - SQLUSMALLINT fNullable); - -SQLRETURN SQL_API SQLStatisticsW( - SQLHSTMT hstmt, - SQLWCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLWCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLWCHAR *szTableName, - SQLSMALLINT cbTableName, - SQLUSMALLINT fUnique, - SQLUSMALLINT fAccuracy); - -SQLRETURN SQL_API SQLTablesW( - SQLHSTMT hstmt, - SQLWCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLWCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLWCHAR *szTableName, - SQLSMALLINT cbTableName, - SQLWCHAR *szTableType, - SQLSMALLINT cbTableType); - - - -SQLRETURN SQL_API SQLDataSourcesW( - SQLHENV henv, - SQLUSMALLINT fDirection, - SQLWCHAR *szDSN, - SQLSMALLINT cbDSNMax, - SQLSMALLINT *pcbDSN, - SQLWCHAR *szDescription, - SQLSMALLINT cbDescriptionMax, - SQLSMALLINT *pcbDescription); - - - - -SQLRETURN SQL_API SQLDriverConnectW( - SQLHDBC hdbc, - SQLHWND hwnd, - SQLWCHAR *szConnStrIn, - SQLSMALLINT cbConnStrIn, - SQLWCHAR *szConnStrOut, - SQLSMALLINT cbConnStrOutMax, - SQLSMALLINT *pcbConnStrOut, - SQLUSMALLINT fDriverCompletion); - - -SQLRETURN SQL_API SQLBrowseConnectW( - SQLHDBC hdbc, - SQLWCHAR *szConnStrIn, - SQLSMALLINT cbConnStrIn, - SQLWCHAR *szConnStrOut, - SQLSMALLINT cbConnStrOutMax, - SQLSMALLINT *pcbConnStrOut); - -SQLRETURN SQL_API SQLColumnPrivilegesW( - SQLHSTMT hstmt, - SQLWCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLWCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLWCHAR *szTableName, - SQLSMALLINT cbTableName, - SQLWCHAR *szColumnName, - SQLSMALLINT cbColumnName); - -SQLRETURN SQL_API SQLGetStmtAttrW( - SQLHSTMT hstmt, - SQLINTEGER fAttribute, - SQLPOINTER rgbValue, - SQLINTEGER cbValueMax, - SQLINTEGER *pcbValue); - -SQLRETURN SQL_API SQLSetStmtAttrW( - SQLHSTMT hstmt, - SQLINTEGER fAttribute, - SQLPOINTER rgbValue, - SQLINTEGER cbValueMax); - -SQLRETURN SQL_API SQLForeignKeysW( - SQLHSTMT hstmt, - SQLWCHAR *szPkCatalogName, - SQLSMALLINT cbPkCatalogName, - SQLWCHAR *szPkSchemaName, - SQLSMALLINT cbPkSchemaName, - SQLWCHAR *szPkTableName, - SQLSMALLINT cbPkTableName, - SQLWCHAR *szFkCatalogName, - SQLSMALLINT cbFkCatalogName, - SQLWCHAR *szFkSchemaName, - SQLSMALLINT cbFkSchemaName, - SQLWCHAR *szFkTableName, - SQLSMALLINT cbFkTableName); - - -SQLRETURN SQL_API SQLNativeSqlW( - SQLHDBC hdbc, - SQLWCHAR *szSqlStrIn, - SQLINTEGER cbSqlStrIn, - SQLWCHAR *szSqlStr, - SQLINTEGER cbSqlStrMax, - SQLINTEGER *pcbSqlStr); - - -SQLRETURN SQL_API SQLPrimaryKeysW( - SQLHSTMT hstmt, - SQLWCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLWCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLWCHAR *szTableName, - SQLSMALLINT cbTableName); - -SQLRETURN SQL_API SQLProcedureColumnsW( - SQLHSTMT hstmt, - SQLWCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLWCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLWCHAR *szProcName, - SQLSMALLINT cbProcName, - SQLWCHAR *szColumnName, - SQLSMALLINT cbColumnName); - -SQLRETURN SQL_API SQLProceduresW( - SQLHSTMT hstmt, - SQLWCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLWCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLWCHAR *szProcName, - SQLSMALLINT cbProcName); - - -SQLRETURN SQL_API SQLTablePrivilegesW( - SQLHSTMT hstmt, - SQLWCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLWCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLWCHAR *szTableName, - SQLSMALLINT cbTableName); - -SQLRETURN SQL_API SQLDriversW( - SQLHENV henv, - SQLUSMALLINT fDirection, - SQLWCHAR *szDriverDesc, - SQLSMALLINT cbDriverDescMax, - SQLSMALLINT *pcbDriverDesc, - SQLWCHAR *szDriverAttributes, - SQLSMALLINT cbDrvrAttrMax, - SQLSMALLINT *pcbDrvrAttr); - - -/* ANSI versions */ - -SQLRETURN SQL_API SQLColAttributeA( - SQLHSTMT hstmt, - SQLSMALLINT iCol, - SQLSMALLINT iField, - SQLPOINTER pCharAttr, - SQLSMALLINT cbCharAttrMax, - SQLSMALLINT *pcbCharAttr, - SQLLEN *pNumAttr); - -SQLRETURN SQL_API SQLColAttributesA( - SQLHSTMT hstmt, - SQLUSMALLINT icol, - SQLUSMALLINT fDescType, - SQLPOINTER rgbDesc, - SQLSMALLINT cbDescMax, - SQLSMALLINT *pcbDesc, - SQLLEN *pfDesc); - -SQLRETURN SQL_API SQLConnectA( - SQLHDBC hdbc, - SQLCHAR *szDSN, - SQLSMALLINT cbDSN, - SQLCHAR *szUID, - SQLSMALLINT cbUID, - SQLCHAR *szAuthStr, - SQLSMALLINT cbAuthStr); - - -SQLRETURN SQL_API SQLDescribeColA( - SQLHSTMT hstmt, - SQLUSMALLINT icol, - SQLCHAR *szColName, - SQLSMALLINT cbColNameMax, - SQLSMALLINT *pcbColName, - SQLSMALLINT *pfSqlType, - SQLULEN *pcbColDef, - SQLSMALLINT *pibScale, - SQLSMALLINT *pfNullable); - - -SQLRETURN SQL_API SQLErrorA( - SQLHENV henv, - SQLHDBC hdbc, - SQLHSTMT hstmt, - SQLCHAR *szSqlState, - SQLINTEGER *pfNativeError, - SQLCHAR *szErrorMsg, - SQLSMALLINT cbErrorMsgMax, - SQLSMALLINT *pcbErrorMsg); - -SQLRETURN SQL_API SQLExecDirectA( - SQLHSTMT hstmt, - SQLCHAR *szSqlStr, - SQLINTEGER cbSqlStr); - -SQLRETURN SQL_API SQLGetConnectAttrA( - SQLHDBC hdbc, - SQLINTEGER fAttribute, - SQLPOINTER rgbValue, - SQLINTEGER cbValueMax, - SQLINTEGER *pcbValue); - -SQLRETURN SQL_API SQLGetCursorNameA( - SQLHSTMT hstmt, - SQLCHAR *szCursor, - SQLSMALLINT cbCursorMax, - SQLSMALLINT *pcbCursor); - -#if (ODBCVER >= 0x0300) -SQLRETURN SQL_API SQLGetDescFieldA( - SQLHDESC hdesc, - SQLSMALLINT iRecord, - SQLSMALLINT iField, - SQLPOINTER rgbValue, - SQLINTEGER cbValueMax, - SQLINTEGER *pcbValue); - -SQLRETURN SQL_API SQLGetDescRecA( - SQLHDESC hdesc, - SQLSMALLINT iRecord, - SQLCHAR *szName, - SQLSMALLINT cbNameMax, - SQLSMALLINT *pcbName, - SQLSMALLINT *pfType, - SQLSMALLINT *pfSubType, - SQLLEN *pLength, - SQLSMALLINT *pPrecision, - SQLSMALLINT *pScale, - SQLSMALLINT *pNullable); - -SQLRETURN SQL_API SQLGetDiagFieldA( - SQLSMALLINT fHandleType, - SQLHANDLE handle, - SQLSMALLINT iRecord, - SQLSMALLINT fDiagField, - SQLPOINTER rgbDiagInfo, - SQLSMALLINT cbDiagInfoMax, - SQLSMALLINT *pcbDiagInfo); - -SQLRETURN SQL_API SQLGetDiagRecA( - SQLSMALLINT fHandleType, - SQLHANDLE handle, - SQLSMALLINT iRecord, - SQLCHAR *szSqlState, - SQLINTEGER *pfNativeError, - SQLCHAR *szErrorMsg, - SQLSMALLINT cbErrorMsgMax, - SQLSMALLINT *pcbErrorMsg); - - -SQLRETURN SQL_API SQLGetStmtAttrA( - SQLHSTMT hstmt, - SQLINTEGER fAttribute, - SQLPOINTER rgbValue, - SQLINTEGER cbValueMax, - SQLINTEGER *pcbValue); - -#endif - -SQLRETURN SQL_API SQLGetTypeInfoA( - SQLHSTMT StatementHandle, - SQLSMALLINT DataTyoe); - -SQLRETURN SQL_API SQLPrepareA( - SQLHSTMT hstmt, - SQLCHAR *szSqlStr, - SQLINTEGER cbSqlStr); - -SQLRETURN SQL_API SQLSetConnectAttrA( - SQLHDBC hdbc, - SQLINTEGER fAttribute, - SQLPOINTER rgbValue, - SQLINTEGER cbValue); - -SQLRETURN SQL_API SQLSetCursorNameA( - SQLHSTMT hstmt, - SQLCHAR *szCursor, - SQLSMALLINT cbCursor); - - - - - - - -SQLRETURN SQL_API SQLColumnsA( - SQLHSTMT hstmt, - SQLCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLCHAR *szTableName, - SQLSMALLINT cbTableName, - SQLCHAR *szColumnName, - SQLSMALLINT cbColumnName); - -SQLRETURN SQL_API SQLGetConnectOptionA( - SQLHDBC hdbc, - SQLUSMALLINT fOption, - SQLPOINTER pvParam); - - - -SQLRETURN SQL_API SQLGetInfoA( - SQLHDBC hdbc, - SQLUSMALLINT fInfoType, - SQLPOINTER rgbInfoValue, - SQLSMALLINT cbInfoValueMax, - SQLSMALLINT* pcbInfoValue); - -SQLRETURN SQL_API SQLGetStmtOptionA( - SQLHSTMT hstmt, - SQLUSMALLINT fOption, - SQLPOINTER pvParam); - -SQLRETURN SQL_API SQLSetConnectOptionA( - SQLHDBC hdbc, - SQLUSMALLINT fOption, - SQLULEN vParam); - -SQLRETURN SQL_API SQLSetStmtOptionA( - SQLHSTMT hstmt, - SQLUSMALLINT fOption, - SQLULEN vParam); - -SQLRETURN SQL_API SQLSpecialColumnsA( - SQLHSTMT hstmt, - SQLUSMALLINT fColType, - SQLCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLCHAR *szTableName, - SQLSMALLINT cbTableName, - SQLUSMALLINT fScope, - SQLUSMALLINT fNullable); - -SQLRETURN SQL_API SQLStatisticsA( - SQLHSTMT hstmt, - - SQLCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLCHAR *szTableName, - SQLSMALLINT cbTableName, - SQLUSMALLINT fUnique, - SQLUSMALLINT fAccuracy); - -SQLRETURN SQL_API SQLTablesA( - SQLHSTMT hstmt, - - SQLCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLCHAR *szTableName, - SQLSMALLINT cbTableName, - SQLCHAR *szTableType, - - SQLSMALLINT cbTableType); - - - -SQLRETURN SQL_API SQLDataSourcesA( - SQLHENV henv, - SQLUSMALLINT fDirection, - SQLCHAR *szDSN, - SQLSMALLINT cbDSNMax, - SQLSMALLINT *pcbDSN, - SQLCHAR *szDescription, - SQLSMALLINT cbDescriptionMax, - SQLSMALLINT *pcbDescription); - - - - -SQLRETURN SQL_API SQLDriverConnectA( - SQLHDBC hdbc, - SQLHWND hwnd, - SQLCHAR *szConnStrIn, - SQLSMALLINT cbConnStrIn, - SQLCHAR *szConnStrOut, - SQLSMALLINT cbConnStrOutMax, - SQLSMALLINT *pcbConnStrOut, - SQLUSMALLINT fDriverCompletion); - - -SQLRETURN SQL_API SQLBrowseConnectA( - SQLHDBC hdbc, - SQLCHAR *szConnStrIn, - SQLSMALLINT cbConnStrIn, - SQLCHAR *szConnStrOut, - SQLSMALLINT cbConnStrOutMax, - SQLSMALLINT *pcbConnStrOut); - -SQLRETURN SQL_API SQLColumnPrivilegesA( - SQLHSTMT hstmt, - SQLCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLCHAR *szTableName, - SQLSMALLINT cbTableName, - SQLCHAR *szColumnName, - SQLSMALLINT cbColumnName); - -SQLRETURN SQL_API SQLDescribeParamA( - SQLHSTMT hstmt, - SQLUSMALLINT ipar, - SQLSMALLINT *pfSqlType, - SQLUINTEGER *pcbParamDef, - SQLSMALLINT *pibScale, - SQLSMALLINT *pfNullable); - - -SQLRETURN SQL_API SQLForeignKeysA( - SQLHSTMT hstmt, - SQLCHAR *szPkCatalogName, - SQLSMALLINT cbPkCatalogName, - SQLCHAR *szPkSchemaName, - SQLSMALLINT cbPkSchemaName, - SQLCHAR *szPkTableName, - SQLSMALLINT cbPkTableName, - SQLCHAR *szFkCatalogName, - SQLSMALLINT cbFkCatalogName, - SQLCHAR *szFkSchemaName, - SQLSMALLINT cbFkSchemaName, - SQLCHAR *szFkTableName, - SQLSMALLINT cbFkTableName); - - -SQLRETURN SQL_API SQLNativeSqlA( - SQLHDBC hdbc, - SQLCHAR *szSqlStrIn, - SQLINTEGER cbSqlStrIn, - SQLCHAR *szSqlStr, - SQLINTEGER cbSqlStrMax, - SQLINTEGER *pcbSqlStr); - - -SQLRETURN SQL_API SQLPrimaryKeysA( - SQLHSTMT hstmt, - SQLCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLCHAR *szTableName, - SQLSMALLINT cbTableName); - -SQLRETURN SQL_API SQLProcedureColumnsA( - SQLHSTMT hstmt, - SQLCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLCHAR *szProcName, - SQLSMALLINT cbProcName, - SQLCHAR *szColumnName, - SQLSMALLINT cbColumnName); - -SQLRETURN SQL_API SQLProceduresA( - SQLHSTMT hstmt, - SQLCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLCHAR *szProcName, - SQLSMALLINT cbProcName); - - -SQLRETURN SQL_API SQLTablePrivilegesA( - SQLHSTMT hstmt, - SQLCHAR *szCatalogName, - SQLSMALLINT cbCatalogName, - SQLCHAR *szSchemaName, - SQLSMALLINT cbSchemaName, - SQLCHAR *szTableName, - SQLSMALLINT cbTableName); - -SQLRETURN SQL_API SQLDriversA( - SQLHENV henv, - SQLUSMALLINT fDirection, - SQLCHAR *szDriverDesc, - SQLSMALLINT cbDriverDescMax, - SQLSMALLINT *pcbDriverDesc, - SQLCHAR *szDriverAttributes, - SQLSMALLINT cbDrvrAttrMax, - SQLSMALLINT *pcbDrvrAttr); - - - - - -/*---------------------------------------------*/ -/* Mapping macros for Unicode */ -/*---------------------------------------------*/ - -#ifndef SQL_NOUNICODEMAP /* define this to disable the mapping */ -#ifdef UNICODE - -#define SQLColAttribute SQLColAttributeW -#define SQLColAttributes SQLColAttributesW -#define SQLConnect SQLConnectW -#define SQLDescribeCol SQLDescribeColW -#define SQLError SQLErrorW -#define SQLExecDirect SQLExecDirectW -#define SQLGetConnectAttr SQLGetConnectAttrW -#define SQLGetCursorName SQLGetCursorNameW -#define SQLGetDescField SQLGetDescFieldW -#define SQLGetDescRec SQLGetDescRecW -#define SQLGetDiagField SQLGetDiagFieldW -#define SQLGetDiagRec SQLGetDiagRecW -#define SQLPrepare SQLPrepareW -#define SQLSetConnectAttr SQLSetConnectAttrW -#define SQLSetCursorName SQLSetCursorNameW -#define SQLSetDescField SQLSetDescFieldW -#define SQLSetStmtAttr SQLSetStmtAttrW -#define SQLGetStmtAttr SQLGetStmtAttrW -#define SQLColumns SQLColumnsW -#define SQLGetConnectOption SQLGetConnectOptionW -#define SQLGetInfo SQLGetInfoW -#define SQLGetTypeInfo SQLGetTypeInfoW -#define SQLSetConnectOption SQLSetConnectOptionW -#define SQLSpecialColumns SQLSpecialColumnsW -#define SQLStatistics SQLStatisticsW -#define SQLTables SQLTablesW -#define SQLDataSources SQLDataSourcesW -#define SQLDriverConnect SQLDriverConnectW -#define SQLBrowseConnect SQLBrowseConnectW -#define SQLColumnPrivileges SQLColumnPrivilegesW -#define SQLForeignKeys SQLForeignKeysW -#define SQLNativeSql SQLNativeSqlW -#define SQLPrimaryKeys SQLPrimaryKeysW -#define SQLProcedureColumns SQLProcedureColumnsW -#define SQLProcedures SQLProceduresW -#define SQLTablePrivileges SQLTablePrivilegesW -#define SQLDrivers SQLDriversW - -#endif /* UNICODE */ -#endif /* SQL_NOUNICODEMAP */ - -#ifdef __cplusplus -} -#endif - -#ifndef __SQLEXT_H -#include - -#endif - - -#endif diff --git a/mssql_python/libs/macos/odbc_include/unixODBC/unixodbc_conf.h b/mssql_python/libs/macos/odbc_include/unixODBC/unixodbc_conf.h deleted file mode 100644 index b81ab0d1..00000000 --- a/mssql_python/libs/macos/odbc_include/unixODBC/unixodbc_conf.h +++ /dev/null @@ -1,484 +0,0 @@ -/* unixodbc_conf.h. Generated from unixodbc_conf.h.in by configure. */ -/* config.h.in. Generated from configure.ac by autoheader. */ - -/* Encoding to use for CHAR */ -#define ASCII_ENCODING "auto-search" - -/* Install bindir */ -#define BIN_PREFIX "/opt/homebrew/Cellar/unixodbc/2.3.12/bin" - -/* Use a semaphore to allow ODBCConfig to display running counts */ -/* #undef COLLECT_STATS */ - -/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP - systems. This function is required for `alloca.c' support on those systems. - */ -/* #undef CRAY_STACKSEG_END */ - -/* Define to 1 if using `alloca.c'. */ -/* #undef C_ALLOCA */ - -/* Lib directory */ -#define DEFLIB_PATH "/opt/homebrew/Cellar/unixodbc/2.3.12/lib" - -/* Using perdriver iconv */ -/* #undef ENABLE_DRIVER_ICONV */ - -/* Using ini cacheing */ -#define ENABLE_INI_CACHING /**/ - -/* Install exec_prefix */ -#define EXEC_PREFIX "/opt/homebrew/Cellar/unixodbc/2.3.12" - -/* Disable the precise but slow checking of the validity of handles */ -/* #undef FAST_HANDLE_VALIDATE */ - -/* Define to 1 if you have `alloca', as a function or macro. */ -#define HAVE_ALLOCA 1 - -/* Define to 1 if you have and it should be used (not on Ultrix). - */ -#define HAVE_ALLOCA_H 1 - -/* Define to 1 if you have the `argz_add' function. */ -/* #undef HAVE_ARGZ_ADD */ - -/* Define to 1 if you have the `argz_append' function. */ -/* #undef HAVE_ARGZ_APPEND */ - -/* Define to 1 if you have the `argz_count' function. */ -/* #undef HAVE_ARGZ_COUNT */ - -/* Define to 1 if you have the `argz_create_sep' function. */ -/* #undef HAVE_ARGZ_CREATE_SEP */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_ARGZ_H */ - -/* Define to 1 if you have the `argz_insert' function. */ -/* #undef HAVE_ARGZ_INSERT */ - -/* Define to 1 if you have the `argz_next' function. */ -/* #undef HAVE_ARGZ_NEXT */ - -/* Define to 1 if you have the `argz_stringify' function. */ -/* #undef HAVE_ARGZ_STRINGIFY */ - -/* Define to 1 if you have the `atoll' function. */ -#define HAVE_ATOLL 1 - -/* Define to 1 if you have the `closedir' function. */ -#define HAVE_CLOSEDIR 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_CRYPT_H */ - -/* Define to 1 if you have the declaration of `cygwin_conv_path', and to 0 if - you don't. */ -/* #undef HAVE_DECL_CYGWIN_CONV_PATH */ - -/* Define to 1 if you have the header file, and it defines `DIR'. - */ -#define HAVE_DIRENT_H 1 - -/* Define if you have the GNU dld library. */ -/* #undef HAVE_DLD */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_DLD_H */ - -/* Define to 1 if you have the `dlerror' function. */ -#define HAVE_DLERROR 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_DLFCN_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_DL_H */ - -/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ -/* #undef HAVE_DOPRNT */ - -/* Define if you have the _dyld_func_lookup function. */ -/* #undef HAVE_DYLD */ - -/* Add editline support */ -/* #undef HAVE_EDITLINE */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_EDITLINE_READLINE_H */ - -/* Define to 1 if you have the `endpwent' function. */ -#define HAVE_ENDPWENT 1 - -/* Define to 1 if the system has the type `error_t'. */ -/* #undef HAVE_ERROR_T */ - -/* Define to 1 if you have the `ftime' function. */ -#define HAVE_FTIME 1 - -/* Define to 1 if you have the `ftok' function. */ -/* #undef HAVE_FTOK */ - -/* Define to 1 if you have the `getpwuid' function. */ -#define HAVE_GETPWUID 1 - -/* Define to 1 if you have the `gettimeofday' function. */ -#define HAVE_GETTIMEOFDAY 1 - -/* Define to 1 if you have the `getuid' function. */ -#define HAVE_GETUID 1 - -/* Define if you have the iconv() function. */ -#define HAVE_ICONV 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_INTTYPES_H 1 - -/* Define if you have and nl_langinfo(CODESET). */ -#define HAVE_LANGINFO_CODESET 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_LANGINFO_H 1 - -/* Add -lcrypt to lib list */ -/* #undef HAVE_LIBCRYPT */ - -/* Define if you have the libdl library or equivalent. */ -#define HAVE_LIBDL 1 - -/* Define if libdlloader will be built on this platform */ -#define HAVE_LIBDLLOADER 1 - -/* Use the -lpth thread library */ -/* #undef HAVE_LIBPTH */ - -/* Use -lpthread threading lib */ -#define HAVE_LIBPTHREAD 1 - -/* Use the -lthread threading lib */ -/* #undef HAVE_LIBTHREAD */ - -/* Define to 1 if you have the header file. */ -#define HAVE_LIMITS_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_LOCALE_H 1 - -/* Use rentrant version of localtime */ -#define HAVE_LOCALTIME_R 1 - -/* Define this if a modern libltdl is already installed */ -#define HAVE_LTDL 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_MACH_O_DYLD_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_MALLOC_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_MEMORY_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_MSQL_H */ - -/* Define to 1 if you have the header file, and it defines `DIR'. */ -/* #undef HAVE_NDIR_H */ - -/* Define to 1 if you have the `nl_langinfo' function. */ -#define HAVE_NL_LANGINFO 1 - -/* Define to 1 if you have the `opendir' function. */ -#define HAVE_OPENDIR 1 - -/* Define if libtool can extract symbol lists from object files. */ -#define HAVE_PRELOADED_SYMBOLS 1 - -/* Define to 1 if the system has the type `ptrdiff_t'. */ -#define HAVE_PTRDIFF_T 1 - -/* Define to 1 if you have the `putenv' function. */ -#define HAVE_PUTENV 1 - -/* Define to 1 if you have the `readdir' function. */ -#define HAVE_READDIR 1 - -/* Add readline support */ -#define HAVE_READLINE 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_READLINE_HISTORY_H 1 - -/* Use the scandir lib */ -/* #undef HAVE_SCANDIR */ - -/* Define to 1 if you have the `semget' function. */ -/* #undef HAVE_SEMGET */ - -/* Define to 1 if you have the `semop' function. */ -/* #undef HAVE_SEMOP */ - -/* Define to 1 if you have the `setenv' function. */ -#define HAVE_SETENV 1 - -/* Define to 1 if you have the `setlocale' function. */ -#define HAVE_SETLOCALE 1 - -/* Define if you have the shl_load function. */ -/* #undef HAVE_SHL_LOAD */ - -/* Define to 1 if you have the `shmget' function. */ -/* #undef HAVE_SHMGET */ - -/* Define to 1 if you have the `snprintf' function. */ -#define HAVE_SNPRINTF 1 - -/* Define to 1 if you have the `socket' function. */ -#define HAVE_SOCKET 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDARG_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDDEF_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDINT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDLIB_H 1 - -/* Define to 1 if you have the `strcasecmp' function. */ -#define HAVE_STRCASECMP 1 - -/* Define to 1 if you have the `strchr' function. */ -#define HAVE_STRCHR 1 - -/* Define to 1 if you have the `strdup' function. */ -#define HAVE_STRDUP 1 - -/* Define to 1 if you have the `stricmp' function. */ -/* #undef HAVE_STRICMP */ - -/* Define to 1 if you have the header file. */ -#define HAVE_STRINGS_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRING_H 1 - -/* Define to 1 if you have the `strlcat' function. */ -#define HAVE_STRLCAT 1 - -/* Define to 1 if you have the `strlcpy' function. */ -#define HAVE_STRLCPY 1 - -/* Define to 1 if you have the `strncasecmp' function. */ -#define HAVE_STRNCASECMP 1 - -/* Define to 1 if you have the `strnicmp' function. */ -/* #undef HAVE_STRNICMP */ - -/* Define to 1 if you have the `strstr' function. */ -#define HAVE_STRSTR 1 - -/* Define to 1 if you have the `strtol' function. */ -#define HAVE_STRTOL 1 - -/* Define to 1 if you have the `strtoll' function. */ -#define HAVE_STRTOLL 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYNCH_H */ - -/* Define to 1 if you have the header file, and it defines `DIR'. - */ -/* #undef HAVE_SYS_DIR_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_DL_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_MALLOC_H 1 - -/* Define to 1 if you have the header file, and it defines `DIR'. - */ -/* #undef HAVE_SYS_NDIR_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_SEM_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_TIMEB_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_TIME_H 1 - -/* Define to 1 if you have the `time' function. */ -#define HAVE_TIME 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_TIME_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_VARARGS_H */ - -/* Define to 1 if you have the `vprintf' function. */ -#define HAVE_VPRINTF 1 - -/* Define to 1 if you have the `vsnprintf' function. */ -#define HAVE_VSNPRINTF 1 - -/* This value is set to 1 to indicate that the system argz facility works */ -/* #undef HAVE_WORKING_ARGZ */ - -/* Define as const if the declaration of iconv() needs const. */ -#define ICONV_CONST - -/* Install includedir */ -#define INCLUDE_PREFIX "/opt/homebrew/Cellar/unixodbc/2.3.12/include" - -/* Lib directory */ -#define LIB_PREFIX "/opt/homebrew/Cellar/unixodbc/2.3.12/lib" - -/* Define if the OS needs help to load dependent libraries for dlopen(). */ -/* #undef LTDL_DLOPEN_DEPLIBS */ - -/* Define to the system default library search path. */ -#define LT_DLSEARCH_PATH "/usr/local/lib:/lib:/usr/lib" - -/* The archive extension */ -#define LT_LIBEXT "a" - -/* The archive prefix */ -#define LT_LIBPREFIX "lib" - -/* Define to the extension used for runtime loadable modules, say, ".so". */ -#define LT_MODULE_EXT ".so" - -/* Define to the name of the environment variable that determines the run-time - module search path. */ -#define LT_MODULE_PATH_VAR "DYLD_LIBRARY_PATH" - -/* Define to the sub-directory where libtool stores uninstalled libraries. */ -#define LT_OBJDIR ".libs/" - -/* Define to the shared library suffix, say, ".dylib". */ -#define LT_SHARED_EXT ".dylib" - -/* Define to the shared archive member specification, say "(shr.o)". */ -/* #undef LT_SHARED_LIB_MEMBER */ - -/* Define if you need semundo union */ -/* #undef NEED_SEMUNDO_UNION */ - -/* Define if dlsym() requires a leading underscore in symbol names. */ -/* #undef NEED_USCORE */ - -/* Using OSX */ -#define OSXHEADER /**/ - -/* Name of package */ - -/* Define to the address where bug reports for this package should be sent. */ - -/* Define to the full name of this package. */ - -/* Define to the full name and version of this package. */ - -/* Define to the one symbol short name of this package. */ - -/* Define to the home page for this package. */ - -/* Define to the version of this package. */ - -/* Platform is 64 bit */ -#define PLATFORM64 /**/ - -/* Install prefix */ -#define PREFIX "/opt/homebrew/Cellar/unixodbc/2.3.12" - -/* Using QNX */ -/* #undef QNX_LIBLTDL */ - -/* Shared lib extension */ -#define SHLIBEXT "`test .$module = .yes && echo .so || echo .dylib`" - -/* The size of `long', as computed by sizeof. */ -#define SIZEOF_LONG 8 - -/* If using the C implementation of alloca, define if you know the - direction of stack growth for your system; otherwise it will be - automatically deduced at runtime. - STACK_DIRECTION > 0 => grows toward higher addresses - STACK_DIRECTION < 0 => grows toward lower addresses - STACK_DIRECTION = 0 => direction of growth unknown */ -/* #undef STACK_DIRECTION */ - -/* Filename to use for ftok */ -#define STATS_FTOK_NAME "odbc.ini" - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* don't include unixODBC prefix in driver error messages */ -#define STRICT_ODBC_ERROR /**/ - -/* System file path */ -#define SYSTEM_FILE_PATH "/opt/homebrew/etc" - -/* Lib path */ -#define SYSTEM_LIB_PATH "/opt/homebrew/Cellar/unixodbc/2.3.12/lib" - -/* Define to 1 if you can safely include both and . */ -#define TIME_WITH_SYS_TIME 1 - -/* Define to 1 if your declares `struct tm'. */ -/* #undef TM_IN_SYS_TIME */ - -/* Encoding to use for UNICODE */ -#define UNICODE_ENCODING "auto-search" - -/* Flag that we are not using another DM */ -#define UNIXODBC /**/ - -/* We are building inside the unixODBC source tree */ - -/* Version number of package */ - -/* Work with IBM drivers that use 32 bit handles on 64 bit platforms */ -/* #undef WITH_HANDLE_REDIRECT */ - -/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a - `char[]'. */ -#define YYTEXT_POINTER 1 - -/* Build flag for AIX */ -/* #undef _ALL_SOURCE */ - -/* Build flag for AIX */ -/* #undef _LONG_LONG */ - -/* Build flag for AIX */ -/* #undef _THREAD_SAFE */ - -/* Define so that glibc/gnulib argp.h does not typedef error_t. */ -#define __error_t_defined 1 - -/* Define to empty if `const' does not conform to ANSI C. */ -/* #undef const */ - -/* Define to a type to use for 'error_t' if it is not otherwise available. */ -#define error_t int - -/* Define to `int' if doesn't define. */ -/* #undef gid_t */ - -/* Define to `unsigned int' if does not define. */ -/* #undef size_t */ - -/* Define to `int' if doesn't define. */ -/* #undef uid_t */ diff --git a/mssql_python/libs/macos/odbc_include/unixodbc.h b/mssql_python/libs/macos/odbc_include/unixodbc.h deleted file mode 100644 index 0ebcd18b..00000000 --- a/mssql_python/libs/macos/odbc_include/unixodbc.h +++ /dev/null @@ -1,17 +0,0 @@ -/* unixodbc.h. Generated from unixodbc.h.in by configure. */ -/* Preprocessor constants for unixODBC */ - -/* Define to 1 if `long long' is available */ -#define HAVE_LONG_LONG 1 - -/* Define to 1 if the header file is present */ -#define HAVE_PWD_H 1 - -/* Define to 1 if the header file is present */ -#define HAVE_SYS_TYPES_H 1 - -/* Define to 1 if the header file is present */ -#define HAVE_UNISTD_H 1 - -/* Define to the value of sizeof(long) */ -#define SIZEOF_LONG_INT 8 diff --git a/mssql_python/libs/macos/odbc_include/uodbc_extras.h b/mssql_python/libs/macos/odbc_include/uodbc_extras.h deleted file mode 100644 index aaaef32f..00000000 --- a/mssql_python/libs/macos/odbc_include/uodbc_extras.h +++ /dev/null @@ -1,85 +0,0 @@ -/********************************************************************* - * - * This is based on code created by Peter Harvey, - * (pharvey@codebydesign.com). - * - * Modified and extended by Nick Gorham - * (nick@lurcher.org). - * - * Further modified and extend by Eric Sharkey - * (sharkey@netrics.com). - * - * Any bugs or problems should be considered the fault of Nick or - * Eric and not Peter. - * - * copyright (c) 2005 Eric Sharkey - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - ********************************************************************** - * - * $Id: uodbc_extras.h,v 1.1 2005/03/04 20:08:45 sharkey Exp $ - * - **********************************************************************/ -#ifndef UODBC__extras_h -#define UODBC__extras_h 1 - -#if defined(HAVE_STDARG_H) -# include -# define HAVE_STDARGS -#else -# if defined(HAVE_VARARGS_H) -# include -# ifdef HAVE_STDARGS -# undef HAVE_STDARGS -# endif -# endif -#endif - -#if defined(__cplusplus) - extern "C" { -#endif - -extern int uodbc_vsnprintf (char *str, size_t count, const char *fmt, va_list args); - -#ifdef HAVE_STDARGS - int uodbc_snprintf (char *str,size_t count,const char *fmt,...); -#else - int uodbc_snprintf (va_alist) va_dcl; -#endif - -#ifndef HAVE_SNPRINTF -#define snprintf uodbc_snprintf -#endif - -#ifndef HAVE_VSNPRINTF -#define vsnprintf uodbc_vsnprintf -#endif - -#ifndef HAVE_STRCASECMP -extern int strcasecmp( const char *s1, const char * s2 ); -#endif - -#ifndef HAVE_STRNCASECMP -extern int strncasecmp (const char *s1, const char *s2, int n ); -#endif - - -#if defined(__cplusplus) - } -#endif - -#endif /* UODBC__extras_h */ - diff --git a/mssql_python/libs/macos/odbc_include/uodbc_stats.h b/mssql_python/libs/macos/odbc_include/uodbc_stats.h deleted file mode 100644 index 87f4ebbc..00000000 --- a/mssql_python/libs/macos/odbc_include/uodbc_stats.h +++ /dev/null @@ -1,83 +0,0 @@ -/********************************************************************* - * - * This is based on code created by Peter Harvey, - * (pharvey@codebydesign.com). - * - * Modified and extended by Nick Gorham - * (nick@lurcher.org). - * - * Any bugs or problems should be considered the fault of Nick and not - * Peter. - * - * copyright (c) 1999 Nick Gorham - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - ********************************************************************** - * - * $Id: uodbc_stats.h,v 1.1.1.1 2001/10/17 16:40:28 lurcher Exp $ - * - * $Log: uodbc_stats.h,v $ - * Revision 1.1.1.1 2001/10/17 16:40:28 lurcher - * - * First upload to SourceForge - * - * Revision 1.2 2000/12/19 07:28:45 pharvey - * - added first pass at Stats page content - * - wrapped public stats functions for C++ - * - * Revision 1.1 2000/12/18 11:54:22 martin - * - * handle statistic API. - * - * - **********************************************************************/ -#ifndef UODBC__stats_h -#define UODBC__stats_h 1 - -#include -#include - -typedef struct uodbc_stats_retentry -{ - unsigned long type; /* type of statistic */ -# define UODBC_STAT_STRING 1 -# define UODBC_STAT_LONG 2 - union - { - char s_value[256]; /* string type */ - long l_value; /* number type */ - } value; - char name[32]; /* name of statistic */ -} uodbc_stats_retentry; - -#if defined(__cplusplus) - extern "C" { -#endif - -int uodbc_open_stats(void **rh, unsigned int mode); -#define UODBC_STATS_READ 0x1 -#define UODBC_STATS_WRITE 0x2 -int uodbc_close_stats(void *rh); -int uodbc_get_stats(void *h, pid_t request_pid, - uodbc_stats_retentry *s, int n_stats); -char *uodbc_stats_error(char *buf, size_t buflen); - -#if defined(__cplusplus) - } -#endif - -#endif /* UODBC__stats_h */ - diff --git a/mssql_python/pybind/CMakeLists.txt b/mssql_python/pybind/CMakeLists.txt index 94d81a89..99dd0d55 100644 --- a/mssql_python/pybind/CMakeLists.txt +++ b/mssql_python/pybind/CMakeLists.txt @@ -237,7 +237,7 @@ if(APPLE) ) else() # For other platforms, use standard include and link setup - target_include_directories(ddbc_bindings PRIVATE ${ODBC_INCLUDE_DIR}) + # target_include_directories(ddbc_bindings PRIVATE ${ODBC_INCLUDE_DIR}) if(WIN32 AND DEFINED PYTHON_LIB_DIR) # On Windows, link with the Python lib diff --git a/mssql_python/pybind/README.md b/mssql_python/pybind/README.md index 26e6708e..dcd67f9b 100644 --- a/mssql_python/pybind/README.md +++ b/mssql_python/pybind/README.md @@ -2,7 +2,7 @@ This README provides instructions to build the DDBC Bindings PYD for your system (supports Windows x64 and arm64). -## Prerequisites +## Building on Windows 1. **PyBind11**: Install PyBind11 using pip. ```sh @@ -12,11 +12,9 @@ This README provides instructions to build the DDBC Bindings PYD for your system - Download Visual Studio Build Tools from https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022 - During installation, select the **`Desktop development with C++`** workload, this should also install **CMake**. -## Build Steps +3. Start **Developer Command Prompt for VS 2022**. -1. Start **Developer Command Prompt for VS 2022**. - -2. Inside the Developer Command Prompt window, navigate to the pybind folder and run: +4. Inside the Developer Command Prompt window, navigate to the pybind folder and run: ```sh build.bat ``` @@ -29,4 +27,36 @@ This README provides instructions to build the DDBC Bindings PYD for your system - Compile `ddbc_bindings.cpp` using CMake and create properly versioned PYD file (`ddbc_bindings.cp313-amd64.pyd`) - Move the built PYD file to the parent `mssql_python` directory -- Finally, you can now run **main.py** to test \ No newline at end of file +## Building on MacOS + +1. **Install CMake & PyBind11** + ```bash + brew install cmake + pip install pybind11 + ``` + +2. **Install Microsoft ODBC Driver (msodbcsql18)** + - Visit the official Microsoft documentation: + [Download ODBC Driver for SQL Server](https://learn.microsoft.com/sql/connect/odbc/download-odbc-driver-for-sql-server) + - Install via Homebrew: + ```bash + brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release + ACCEPT_EULA=Y brew install msodbcsql18 + ``` + + > ✅ **Why this step is important**: This package provides development headers (`sql.h`, `sqlext.h`) and the dynamic library (`libmsodbcsql.18.dylib`) required for building `ddbc_bindings`. + > In future versions, we plan to bundle these headers as a developer SDK inside the `mssql-python` package itself. This will allow full cross-platform compatibility and remove the need for system-level ODBC driver installations during development builds. + +3. Navigate to the `pybind` directory & run the build script: + ```bash + ./build.sh + ``` +### What happens inside the build script? + +- The script will: + - Clean any existing build artifacts + - Detect system architecture (only `arm64` is supported for MacOS) + - Configure CMake with appropriate include/library paths + - Compile `ddbc_bindings_mac.cpp` using CMake + - Generate the `.so` file (e.g., `ddbc_bindings.cp313-arm64.so`) + - Copy the output SO file to the parent `mssql_python` directory diff --git a/mssql_python/pybind/build.sh b/mssql_python/pybind/build.sh index 6154a970..f7cb924d 100755 --- a/mssql_python/pybind/build.sh +++ b/mssql_python/pybind/build.sh @@ -1,5 +1,8 @@ #!/bin/bash # Build script for macOS to compile the ddbc_bindings C++ code +# This script is designed to be run from the mssql_python/pybind directory +# Running this script will require CMake and a C++ compiler installed on your MacOS system +# It will also require Python 3.x, pybind11 and msodbcsql18 and unixODBC to be installed # Usage: build.sh [ARCH], If ARCH is not specified, it defaults to the current architecture ARCH=${1:-$(uname -m)} @@ -46,16 +49,6 @@ echo "[DIAGNOSTIC] Source directory: ${SOURCE_DIR}" # Special handling for macOS ODBC headers and string conversion issues if [ "$(uname)" = "Darwin" ]; then - # Use project's odbc_include directory instead of Homebrew headers - ODBC_INCLUDE_DIR="${SOURCE_DIR}/../libs/macos/odbc_include" - - if [ ! -f "${ODBC_INCLUDE_DIR}/sql.h" ]; then - echo "[ERROR] Could not find ODBC headers in project directory at ${ODBC_INCLUDE_DIR}" - exit 1 - fi - - echo "[DIAGNOSTIC] Using ODBC headers from project directory: ${ODBC_INCLUDE_DIR}" - # Check if macOS-specific source file exists if [ -f "${SOURCE_DIR}/ddbc_bindings_mac.cpp" ]; then echo "[DIAGNOSTIC] Using macOS-specific source file: ddbc_bindings_mac.cpp" @@ -64,17 +57,11 @@ if [ "$(uname)" = "Darwin" ]; then echo "[WARNING] Falling back to standard source file ddbc_bindings.cpp" fi - # Set compiler flags directly to ensure headers are found - export CXXFLAGS="-I${ODBC_INCLUDE_DIR}" - export CFLAGS="-I${ODBC_INCLUDE_DIR}" - # Configure CMake with macOS-specific flags echo "[DIAGNOSTIC] Running CMake configure with macOS-specific settings" cmake -DCMAKE_OSX_ARCHITECTURES=${CMAKE_ARCH} \ -DARCHITECTURE=${ARCH} \ -DMACOS_STRING_FIX=ON \ - -DODBC_INCLUDE_DIR=${ODBC_INCLUDE_DIR} \ - -DCMAKE_CXX_FLAGS="-I${ODBC_INCLUDE_DIR}" \ "${SOURCE_DIR}" else # Configure CMake for other platforms diff --git a/mssql_python/pybind/ddbc_bindings_mac.cpp b/mssql_python/pybind/ddbc_bindings_mac.cpp index 1bf29a40..92634366 100644 --- a/mssql_python/pybind/ddbc_bindings_mac.cpp +++ b/mssql_python/pybind/ddbc_bindings_mac.cpp @@ -1,8 +1,8 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. -// INFO|TODO - Note that is file is Windows specific right now. Making it arch agnostic will be -// taken up in beta release +// INFO|TODO - Note that is file is MacOS specific right now. Making it arch agnostic will be +// taken up in upcoming releases #include // pybind11.h must be the first include - https://pybind11.readthedocs.io/en/latest/basics.html#header-and-namespace-conventions diff --git a/setup.py b/setup.py index 4f4a8659..8a160703 100644 --- a/setup.py +++ b/setup.py @@ -2,6 +2,7 @@ import sys from setuptools import setup, find_packages from setuptools.dist import Distribution +from setuptools.command.bdist_wheel import bdist_wheel # Custom distribution to force platform-specific wheel class BinaryDistribution(Distribution): @@ -79,15 +80,13 @@ def finalize_options(self): if arch is None: if platform.machine() == 'arm64': arch = 'arm64' - platform_tag = 'macosx_11_0_arm64' + platform_tag = 'macosx_15_0_arm64' else: - arch = 'x64' - platform_tag = 'macosx_10_9_x86_64' - + raise Exception("Unsupported architecture for macOS. Please set the ARCHITECTURE environment variable to 'arm64'.") + # Add architecture-specific packages for macOS packages.extend([ - f'mssql_python.libs.{arch}', - f'mssql_python.libs.{arch}.macos' + f'mssql_python.libs.macos', ]) else: platform_tag = 'any' # Fallback From 59f59d69e18b070442fda6f91e0e056e2c89e245 Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Thu, 29 May 2025 14:59:54 +0530 Subject: [PATCH 08/32] restored connection and created a new for MacOS --- mssql_python/connection.py | 199 +++++++++++++++----- mssql_python/connection_mac.py | 325 +++++++++++++++++++++++++++++++++ 2 files changed, 474 insertions(+), 50 deletions(-) create mode 100644 mssql_python/connection_mac.py diff --git a/mssql_python/connection.py b/mssql_python/connection.py index 4bceadf2..8031a26a 100644 --- a/mssql_python/connection.py +++ b/mssql_python/connection.py @@ -33,7 +33,7 @@ class Connection: close() -> None: """ - def __init__(self, connection_str: str, autocommit: bool = False, **kwargs) -> None: + def __init__(self, connection_str: str = "", autocommit: bool = False, attrs_before: dict = None, **kwargs) -> None: """ Initialize the connection object with the specified connection string and parameters. @@ -53,16 +53,17 @@ def __init__(self, connection_str: str, autocommit: bool = False, **kwargs) -> N preparing it for further operations such as connecting to the database, executing queries, etc. """ - self.henv = ctypes.c_void_p() - self.hdbc = ctypes.c_void_p() + self.henv = None + self.hdbc = None self.connection_str = self._construct_connection_string( connection_str, **kwargs ) + self._attrs_before = attrs_before + self._autocommit = autocommit # Initialize _autocommit before calling _initializer self._initializer() - self._autocommit = autocommit self.setautocommit(autocommit) - def _construct_connection_string(self, connection_str: str, **kwargs) -> str: + def _construct_connection_string(self, connection_str: str = "", **kwargs) -> str: """ Construct the connection string by concatenating the connection string with key/value pairs from kwargs. @@ -76,13 +77,14 @@ def _construct_connection_string(self, connection_str: str, **kwargs) -> str: """ # Add the driver attribute to the connection string conn_str = add_driver_to_connection_str(connection_str) + # Add additional key-value pairs to the connection string for key, value in kwargs.items(): - if key.lower() == "host": + if key.lower() == "host" or key.lower() == "server": key = "Server" - elif key.lower() == "user": + elif key.lower() == "user" or key.lower() == "uid": key = "Uid" - elif key.lower() == "password": + elif key.lower() == "password" or key.lower() == "pwd": key = "Pwd" elif key.lower() == "database": key = "Database" @@ -93,8 +95,21 @@ def _construct_connection_string(self, connection_str: str, **kwargs) -> str: else: continue conn_str += f"{key}={value};" + + if ENABLE_LOGGING: + logger.info("Final connection string: %s", conn_str) + return conn_str + def _is_closed(self) -> bool: + """ + Check if the connection is closed. + + Returns: + bool: True if the connection is closed, False otherwise. + """ + return self.hdbc is None + def _initializer(self) -> None: """ Initialize the environment and connection handles. @@ -106,59 +121,132 @@ def _initializer(self) -> None: self._allocate_environment_handle() self._set_environment_attributes() self._allocate_connection_handle() - self._set_connection_attributes() + if self._attrs_before != {}: + self._apply_attrs_before() # Apply pre-connection attributes + if self._autocommit: + self._set_connection_attributes( + ddbc_sql_const.SQL_ATTR_AUTOCOMMIT.value, + ddbc_sql_const.SQL_AUTOCOMMIT_ON.value, + ) self._connect_to_db() + def _apply_attrs_before(self): + """ + Apply specific pre-connection attributes. + Currently, this method only processes an attribute with key 1256 (e.g., SQL_COPT_SS_ACCESS_TOKEN) + if present in `self._attrs_before`. Other attributes are ignored. + + Returns: + bool: True. + """ + + if ENABLE_LOGGING: + logger.info("Attempting to apply pre-connection attributes (attrs_before): %s", self._attrs_before) + + if not isinstance(self._attrs_before, dict): + if self._attrs_before is not None and ENABLE_LOGGING: + logger.warning( + f"_attrs_before is of type {type(self._attrs_before).__name__}, " + f"expected dict. Skipping attribute application." + ) + elif self._attrs_before is None and ENABLE_LOGGING: + logger.debug("_attrs_before is None. No pre-connection attributes to apply.") + return True # Exit if _attrs_before is not a dictionary or is None + + for key, value in self._attrs_before.items(): + ikey = None + if isinstance(key, int): + ikey = key + elif isinstance(key, str) and key.isdigit(): + try: + ikey = int(key) + except ValueError: + if ENABLE_LOGGING: + logger.debug( + f"Skipping attribute with key '{key}' in attrs_before: " + f"could not convert string to int." + ) + continue # Skip if string key is not a valid integer + else: + if ENABLE_LOGGING: + logger.debug( + f"Skipping attribute with key '{key}' in attrs_before due to " + f"unsupported key type: {type(key).__name__}. Expected int or string representation of an int." + ) + continue # Skip keys that are not int or string representation of an int + + if ikey == ddbc_sql_const.SQL_COPT_SS_ACCESS_TOKEN.value: + if ENABLE_LOGGING: + logger.info( + f"Found attribute {ddbc_sql_const.SQL_COPT_SS_ACCESS_TOKEN.value}. Attempting to set it." + ) + self._set_connection_attributes(ikey, value) + if ENABLE_LOGGING: + logger.info( + f"Call to set attribute {ddbc_sql_const.SQL_COPT_SS_ACCESS_TOKEN.value} with value '{value}' completed." + ) + # If you expect only one such key, you could add 'break' here. + else: + if ENABLE_LOGGING: + logger.debug( + f"Ignoring attribute with key '{key}' (resolved to {ikey}) in attrs_before " + f"as it is not the target attribute ({ddbc_sql_const.SQL_COPT_SS_ACCESS_TOKEN.value})." + ) + return True + def _allocate_environment_handle(self): """ Allocate the environment handle. """ - ret = ddbc_bindings.DDBCSQLAllocHandle( + ret, handle = ddbc_bindings.DDBCSQLAllocHandle( ddbc_sql_const.SQL_HANDLE_ENV.value, # SQL environment handle type - 0, # SQL input handle - ctypes.cast( - ctypes.pointer(self.henv), ctypes.c_void_p - ).value, # SQL output handle pointer + None ) - check_error(ddbc_sql_const.SQL_HANDLE_ENV.value, self.henv.value, ret) + check_error(ddbc_sql_const.SQL_HANDLE_ENV.value, handle, ret) + self.henv = handle def _set_environment_attributes(self): """ Set the environment attributes. """ ret = ddbc_bindings.DDBCSQLSetEnvAttr( - self.henv.value, # Environment handle + self.henv, # Use the wrapper class ddbc_sql_const.SQL_ATTR_DDBC_VERSION.value, # Attribute ddbc_sql_const.SQL_OV_DDBC3_80.value, # String Length 0, # Null-terminated string ) - check_error(ddbc_sql_const.SQL_HANDLE_ENV.value, self.henv.value, ret) + check_error(ddbc_sql_const.SQL_HANDLE_ENV.value, self.henv, ret) def _allocate_connection_handle(self): """ Allocate the connection handle. """ - ret = ddbc_bindings.DDBCSQLAllocHandle( + ret, handle = ddbc_bindings.DDBCSQLAllocHandle( ddbc_sql_const.SQL_HANDLE_DBC.value, # SQL connection handle type - self.henv.value, # SQL environment handle - ctypes.cast( - ctypes.pointer(self.hdbc), ctypes.c_void_p - ).value, # SQL output handle pointer + self.henv ) - check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) + check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, handle, ret) + self.hdbc = handle - def _set_connection_attributes(self): + def _set_connection_attributes(self, ikey: int, ivalue: any) -> None: """ Set the connection attributes before connecting. + + Args: + ikey (int): The attribute key to set. + ivalue (Any): The value to set for the attribute. Can be bytes, bytearray, int, or unicode. + vallen (int): The length of the value. + + Raises: + DatabaseError: If there is an error while setting the connection attribute. """ - if self.autocommit: - ret = ddbc_bindings.DDBCSQLSetConnectAttr( - self.hdbc.value, - ddbc_sql_const.SQL_ATTR_AUTOCOMMIT.value, - ddbc_sql_const.SQL_AUTOCOMMIT_ON.value, - 0, - ) - check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) + + ret = ddbc_bindings.DDBCSQLSetConnectAttr( + self.hdbc, # Connection handle + ikey, # Attribute + ivalue, # Value + ) + check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc, ret) def _connect_to_db(self) -> None: """ @@ -176,11 +264,11 @@ def _connect_to_db(self) -> None: if ENABLE_LOGGING: logger.info("Connecting to the database") ret = ddbc_bindings.DDBCSQLDriverConnect( - self.hdbc.value, # Connection handle + self.hdbc, # Connection handle (wrapper) 0, # Window handle self.connection_str, # Connection string ) - check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) + check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc, ret) if ENABLE_LOGGING: logger.info("Connection established successfully.") @@ -192,11 +280,11 @@ def autocommit(self) -> bool: bool: True if autocommit is enabled, False otherwise. """ autocommit_mode = ddbc_bindings.DDBCSQLGetConnectionAttr( - self.hdbc.value, # Connection handle + self.hdbc, # Connection handle (wrapper) ddbc_sql_const.SQL_ATTR_AUTOCOMMIT.value, # Attribute ) check_error( - ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, autocommit_mode + ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc, autocommit_mode ) return autocommit_mode == ddbc_sql_const.SQL_AUTOCOMMIT_ON.value @@ -212,16 +300,15 @@ def autocommit(self, value: bool) -> None: DatabaseError: If there is an error while setting the autocommit mode. """ ret = ddbc_bindings.DDBCSQLSetConnectAttr( - self.hdbc.value, # Connection handle + self.hdbc, # Connection handle ddbc_sql_const.SQL_ATTR_AUTOCOMMIT.value, # Attribute ( ddbc_sql_const.SQL_AUTOCOMMIT_ON.value if value else ddbc_sql_const.SQL_AUTOCOMMIT_OFF.value ), # Value - 0, # String length ) - check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) + check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc, ret) self._autocommit = value if ENABLE_LOGGING: logger.info("Autocommit mode set to %s.", value) @@ -253,6 +340,9 @@ def cursor(self) -> Cursor: DatabaseError: If there is an error while creating the cursor. InterfaceError: If there is an error related to the database interface. """ + if self._is_closed(): + # Cannot create a cursor if the connection is closed + raise Exception("Connection is closed. Cannot create cursor.") return Cursor(self) def commit(self) -> None: @@ -267,13 +357,17 @@ def commit(self) -> None: Raises: DatabaseError: If there is an error while committing the transaction. """ + if self._is_closed(): + # Cannot commit if the connection is closed + raise Exception("Connection is closed. Cannot commit.") + # Commit the current transaction ret = ddbc_bindings.DDBCSQLEndTran( ddbc_sql_const.SQL_HANDLE_DBC.value, # Handle type - self.hdbc.value, # Connection handle + self.hdbc, # Connection handle (wrapper) ddbc_sql_const.SQL_COMMIT.value, # Commit the transaction ) - check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) + check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc, ret) if ENABLE_LOGGING: logger.info("Transaction committed successfully.") @@ -288,13 +382,17 @@ def rollback(self) -> None: Raises: DatabaseError: If there is an error while rolling back the transaction. """ + if self._is_closed(): + # Cannot roll back if the connection is closed + raise Exception("Connection is closed. Cannot roll back.") + # Roll back the current transaction ret = ddbc_bindings.DDBCSQLEndTran( ddbc_sql_const.SQL_HANDLE_DBC.value, # Handle type - self.hdbc.value, # Connection handle + self.hdbc, # Connection handle (wrapper) ddbc_sql_const.SQL_ROLLBACK.value, # Roll back the transaction ) - check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) + check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc, ret) if ENABLE_LOGGING: logger.info("Transaction rolled back successfully.") @@ -311,15 +409,16 @@ def close(self) -> None: Raises: DatabaseError: If there is an error while closing the connection. """ + if self._is_closed(): + # Connection is already closed + return # Disconnect from the database - ret = ddbc_bindings.DDBCSQLDisconnect(self.hdbc.value) - check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) + ret = ddbc_bindings.DDBCSQLDisconnect(self.hdbc) + check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc, ret) - # Free the connection handle - ret = ddbc_bindings.DDBCSQLFreeHandle( - ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value - ) - check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) + # Set the reference to None to trigger destructor + self.hdbc.free() + self.hdbc = None if ENABLE_LOGGING: logger.info("Connection closed successfully.") diff --git a/mssql_python/connection_mac.py b/mssql_python/connection_mac.py new file mode 100644 index 00000000..4bceadf2 --- /dev/null +++ b/mssql_python/connection_mac.py @@ -0,0 +1,325 @@ +""" +Copyright (c) Microsoft Corporation. +Licensed under the MIT license. +This module defines the Connection class, which is used to manage a connection to a database. +The class provides methods to establish a connection, create cursors, commit transactions, +roll back transactions, and close the connection. +""" +import ctypes +from mssql_python.cursor import Cursor +from mssql_python.logging_config import get_logger, ENABLE_LOGGING +from mssql_python.constants import ConstantsDDBC as ddbc_sql_const +from mssql_python.helpers import add_driver_to_connection_str, check_error +from mssql_python import ddbc_bindings + +logger = get_logger() + + +class Connection: + """ + A class to manage a connection to a database, compliant with DB-API 2.0 specifications. + + This class provides methods to establish a connection to a database, create cursors, + commit transactions, roll back transactions, and close the connection. It is designed + to be used in a context where database operations are required, such as executing queries + and fetching results. + + Methods: + __init__(database: str) -> None: + connect_to_db() -> None: + cursor() -> Cursor: + commit() -> None: + rollback() -> None: + close() -> None: + """ + + def __init__(self, connection_str: str, autocommit: bool = False, **kwargs) -> None: + """ + Initialize the connection object with the specified connection string and parameters. + + Args: + - connection_str (str): The connection string to connect to. + - autocommit (bool): If True, causes a commit to be performed after each SQL statement. + **kwargs: Additional key/value pairs for the connection string. + Not including below properties since we are driver doesn't support this: + + Returns: + None + + Raises: + ValueError: If the connection string is invalid or connection fails. + + This method sets up the initial state for the connection object, + preparing it for further operations such as connecting to the + database, executing queries, etc. + """ + self.henv = ctypes.c_void_p() + self.hdbc = ctypes.c_void_p() + self.connection_str = self._construct_connection_string( + connection_str, **kwargs + ) + self._initializer() + self._autocommit = autocommit + self.setautocommit(autocommit) + + def _construct_connection_string(self, connection_str: str, **kwargs) -> str: + """ + Construct the connection string by concatenating the connection string + with key/value pairs from kwargs. + + Args: + connection_str (str): The base connection string. + **kwargs: Additional key/value pairs for the connection string. + + Returns: + str: The constructed connection string. + """ + # Add the driver attribute to the connection string + conn_str = add_driver_to_connection_str(connection_str) + # Add additional key-value pairs to the connection string + for key, value in kwargs.items(): + if key.lower() == "host": + key = "Server" + elif key.lower() == "user": + key = "Uid" + elif key.lower() == "password": + key = "Pwd" + elif key.lower() == "database": + key = "Database" + elif key.lower() == "encrypt": + key = "Encrypt" + elif key.lower() == "trust_server_certificate": + key = "TrustServerCertificate" + else: + continue + conn_str += f"{key}={value};" + return conn_str + + def _initializer(self) -> None: + """ + Initialize the environment and connection handles. + + This method is responsible for setting up the environment and connection + handles, allocating memory for them, and setting the necessary attributes. + It should be called before establishing a connection to the database. + """ + self._allocate_environment_handle() + self._set_environment_attributes() + self._allocate_connection_handle() + self._set_connection_attributes() + self._connect_to_db() + + def _allocate_environment_handle(self): + """ + Allocate the environment handle. + """ + ret = ddbc_bindings.DDBCSQLAllocHandle( + ddbc_sql_const.SQL_HANDLE_ENV.value, # SQL environment handle type + 0, # SQL input handle + ctypes.cast( + ctypes.pointer(self.henv), ctypes.c_void_p + ).value, # SQL output handle pointer + ) + check_error(ddbc_sql_const.SQL_HANDLE_ENV.value, self.henv.value, ret) + + def _set_environment_attributes(self): + """ + Set the environment attributes. + """ + ret = ddbc_bindings.DDBCSQLSetEnvAttr( + self.henv.value, # Environment handle + ddbc_sql_const.SQL_ATTR_DDBC_VERSION.value, # Attribute + ddbc_sql_const.SQL_OV_DDBC3_80.value, # String Length + 0, # Null-terminated string + ) + check_error(ddbc_sql_const.SQL_HANDLE_ENV.value, self.henv.value, ret) + + def _allocate_connection_handle(self): + """ + Allocate the connection handle. + """ + ret = ddbc_bindings.DDBCSQLAllocHandle( + ddbc_sql_const.SQL_HANDLE_DBC.value, # SQL connection handle type + self.henv.value, # SQL environment handle + ctypes.cast( + ctypes.pointer(self.hdbc), ctypes.c_void_p + ).value, # SQL output handle pointer + ) + check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) + + def _set_connection_attributes(self): + """ + Set the connection attributes before connecting. + """ + if self.autocommit: + ret = ddbc_bindings.DDBCSQLSetConnectAttr( + self.hdbc.value, + ddbc_sql_const.SQL_ATTR_AUTOCOMMIT.value, + ddbc_sql_const.SQL_AUTOCOMMIT_ON.value, + 0, + ) + check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) + + def _connect_to_db(self) -> None: + """ + Establish a connection to the database. + + This method is responsible for creating a connection to the specified database. + It does not take any arguments and does not return any value. The connection + details such as database name, user credentials, host, and port should be + configured within the class or passed during the class instantiation. + + Raises: + DatabaseError: If there is an error while trying to connect to the database. + InterfaceError: If there is an error related to the database interface. + """ + if ENABLE_LOGGING: + logger.info("Connecting to the database") + ret = ddbc_bindings.DDBCSQLDriverConnect( + self.hdbc.value, # Connection handle + 0, # Window handle + self.connection_str, # Connection string + ) + check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) + if ENABLE_LOGGING: + logger.info("Connection established successfully.") + + @property + def autocommit(self) -> bool: + """ + Return the current autocommit mode of the connection. + Returns: + bool: True if autocommit is enabled, False otherwise. + """ + autocommit_mode = ddbc_bindings.DDBCSQLGetConnectionAttr( + self.hdbc.value, # Connection handle + ddbc_sql_const.SQL_ATTR_AUTOCOMMIT.value, # Attribute + ) + check_error( + ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, autocommit_mode + ) + return autocommit_mode == ddbc_sql_const.SQL_AUTOCOMMIT_ON.value + + @autocommit.setter + def autocommit(self, value: bool) -> None: + """ + Set the autocommit mode of the connection. + Args: + value (bool): True to enable autocommit, False to disable it. + Returns: + None + Raises: + DatabaseError: If there is an error while setting the autocommit mode. + """ + ret = ddbc_bindings.DDBCSQLSetConnectAttr( + self.hdbc.value, # Connection handle + ddbc_sql_const.SQL_ATTR_AUTOCOMMIT.value, # Attribute + ( + ddbc_sql_const.SQL_AUTOCOMMIT_ON.value + if value + else ddbc_sql_const.SQL_AUTOCOMMIT_OFF.value + ), # Value + 0, # String length + ) + check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) + self._autocommit = value + if ENABLE_LOGGING: + logger.info("Autocommit mode set to %s.", value) + + def setautocommit(self, value: bool = True) -> None: + """ + Set the autocommit mode of the connection. + Args: + value (bool): True to enable autocommit, False to disable it. + Returns: + None + Raises: + DatabaseError: If there is an error while setting the autocommit mode. + """ + self.autocommit = value + + def cursor(self) -> Cursor: + """ + Return a new Cursor object using the connection. + + This method creates and returns a new cursor object that can be used to + execute SQL queries and fetch results. The cursor is associated with the + current connection and allows interaction with the database. + + Returns: + Cursor: A new cursor object for executing SQL queries. + + Raises: + DatabaseError: If there is an error while creating the cursor. + InterfaceError: If there is an error related to the database interface. + """ + return Cursor(self) + + def commit(self) -> None: + """ + Commit the current transaction. + + This method commits the current transaction to the database, making all + changes made during the transaction permanent. It should be called after + executing a series of SQL statements that modify the database to ensure + that the changes are saved. + + Raises: + DatabaseError: If there is an error while committing the transaction. + """ + # Commit the current transaction + ret = ddbc_bindings.DDBCSQLEndTran( + ddbc_sql_const.SQL_HANDLE_DBC.value, # Handle type + self.hdbc.value, # Connection handle + ddbc_sql_const.SQL_COMMIT.value, # Commit the transaction + ) + check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) + if ENABLE_LOGGING: + logger.info("Transaction committed successfully.") + + def rollback(self) -> None: + """ + Roll back the current transaction. + + This method rolls back the current transaction, undoing all changes made + during the transaction. It should be called if an error occurs during the + transaction or if the changes should not be saved. + + Raises: + DatabaseError: If there is an error while rolling back the transaction. + """ + # Roll back the current transaction + ret = ddbc_bindings.DDBCSQLEndTran( + ddbc_sql_const.SQL_HANDLE_DBC.value, # Handle type + self.hdbc.value, # Connection handle + ddbc_sql_const.SQL_ROLLBACK.value, # Roll back the transaction + ) + check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) + if ENABLE_LOGGING: + logger.info("Transaction rolled back successfully.") + + def close(self) -> None: + """ + Close the connection now (rather than whenever .__del__() is called). + + This method closes the connection to the database, releasing any resources + associated with it. After calling this method, the connection object should + not be used for any further operations. The same applies to all cursor objects + trying to use the connection. Note that closing a connection without committing + the changes first will cause an implicit rollback to be performed. + + Raises: + DatabaseError: If there is an error while closing the connection. + """ + # Disconnect from the database + ret = ddbc_bindings.DDBCSQLDisconnect(self.hdbc.value) + check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) + + # Free the connection handle + ret = ddbc_bindings.DDBCSQLFreeHandle( + ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value + ) + check_error(ddbc_sql_const.SQL_HANDLE_DBC.value, self.hdbc.value, ret) + + if ENABLE_LOGGING: + logger.info("Connection closed successfully.") From 20577b7d7a44ef030273658fe27c514184a037ab Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Thu, 29 May 2025 16:29:11 +0530 Subject: [PATCH 09/32] separate windows and mac connections --- mssql_python/__init__.py | 3 +-- mssql_python/connection_mac.py | 13 +++++++++---- mssql_python/db_connection.py | 7 +++++-- mssql_python/exceptions.py | 4 ++-- tests/test_005_exceptions.py | 4 ++-- 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/mssql_python/__init__.py b/mssql_python/__init__.py index dda59176..abd2af9a 100644 --- a/mssql_python/__init__.py +++ b/mssql_python/__init__.py @@ -36,8 +36,7 @@ ) # Connection Objects -from .connection import Connection -from .db_connection import connect +from .db_connection import connect, Connection # Cursor Objects from .cursor import Cursor diff --git a/mssql_python/connection_mac.py b/mssql_python/connection_mac.py index 4bceadf2..1231f262 100644 --- a/mssql_python/connection_mac.py +++ b/mssql_python/connection_mac.py @@ -62,7 +62,7 @@ def __init__(self, connection_str: str, autocommit: bool = False, **kwargs) -> N self._autocommit = autocommit self.setautocommit(autocommit) - def _construct_connection_string(self, connection_str: str, **kwargs) -> str: + def _construct_connection_string(self, connection_str: str = "", **kwargs) -> str: """ Construct the connection string by concatenating the connection string with key/value pairs from kwargs. @@ -76,13 +76,14 @@ def _construct_connection_string(self, connection_str: str, **kwargs) -> str: """ # Add the driver attribute to the connection string conn_str = add_driver_to_connection_str(connection_str) + # Add additional key-value pairs to the connection string for key, value in kwargs.items(): - if key.lower() == "host": + if key.lower() == "host" or key.lower() == "server": key = "Server" - elif key.lower() == "user": + elif key.lower() == "user" or key.lower() == "uid": key = "Uid" - elif key.lower() == "password": + elif key.lower() == "password" or key.lower() == "pwd": key = "Pwd" elif key.lower() == "database": key = "Database" @@ -93,6 +94,10 @@ def _construct_connection_string(self, connection_str: str, **kwargs) -> str: else: continue conn_str += f"{key}={value};" + + if ENABLE_LOGGING: + logger.info("Final connection string: %s", conn_str) + return conn_str def _initializer(self) -> None: diff --git a/mssql_python/db_connection.py b/mssql_python/db_connection.py index e02bafce..eb846f3d 100644 --- a/mssql_python/db_connection.py +++ b/mssql_python/db_connection.py @@ -3,8 +3,11 @@ Licensed under the MIT license. This module provides a way to create a new connection object to interact with the database. """ -from mssql_python.connection import Connection - +import platform +if platform.system() == 'Windows': + from mssql_python.connection import Connection +else: + from mssql_python.connection_mac import Connection def connect(connection_str: str, autocommit: bool = True, **kwargs) -> Connection: """ diff --git a/mssql_python/exceptions.py b/mssql_python/exceptions.py index b761bb89..c2307a5f 100644 --- a/mssql_python/exceptions.py +++ b/mssql_python/exceptions.py @@ -645,6 +645,6 @@ def raise_exception(sqlstate: str, ddbc_error: str) -> None: logger.error(exception_class) raise exception_class raise DatabaseError( - driver_error="An error occurred with SQLSTATE code", - ddbc_error=f"Unknown DDBC error: {sqlstate}", + driver_error=f"An error occurred with SQLSTATE code: {sqlstate}", + ddbc_error=f"{ddbc_error}" if ddbc_error else f"Unknown DDBC error", ) diff --git a/tests/test_005_exceptions.py b/tests/test_005_exceptions.py index 030c4f16..6995ee48 100644 --- a/tests/test_005_exceptions.py +++ b/tests/test_005_exceptions.py @@ -87,7 +87,7 @@ def test_data_truncation_error(cursor, db_connection): try: cursor.execute("CREATE TABLE pytest_test_truncation (id INT, name NVARCHAR(5))") cursor.execute("INSERT INTO pytest_test_truncation (id, name) VALUES (?, ?)", [1, 'TooLongName']) - except ProgrammingError as excinfo: + except DataError as excinfo: assert "String or binary data would be truncated" in str(excinfo) finally: drop_table_if_exists(cursor, "pytest_test_truncation") @@ -126,5 +126,5 @@ def test_foreign_key_constraint_error(cursor, db_connection): def test_connection_error(db_connection): with pytest.raises(OperationalError) as excinfo: - Connection("InvalidConnectionString") + connect("InvalidConnectionString") assert "Client unable to establish connection" in str(excinfo.value) From 213ba41ad00d77c7b2790b28dc50b170f749c395 Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Thu, 29 May 2025 19:46:22 +0530 Subject: [PATCH 10/32] db_connection attrs --- mssql_python/db_connection.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mssql_python/db_connection.py b/mssql_python/db_connection.py index eb846f3d..6668f2b9 100644 --- a/mssql_python/db_connection.py +++ b/mssql_python/db_connection.py @@ -9,7 +9,7 @@ else: from mssql_python.connection_mac import Connection -def connect(connection_str: str, autocommit: bool = True, **kwargs) -> Connection: +def connect(connection_str: str = "", autocommit: bool = True, attrs_before: dict = None, **kwargs) -> Connection: """ Constructor for creating a connection to the database. @@ -37,5 +37,5 @@ def connect(connection_str: str, autocommit: bool = True, **kwargs) -> Connectio be used to perform database operations such as executing queries, committing transactions, and closing the connection. """ - conn = Connection(connection_str, autocommit=autocommit, **kwargs) + conn = Connection(connection_str, autocommit=autocommit, attrs_before=attrs_before, **kwargs) return conn From 3cbf54ec67d2e69159f0cca8f58421a7507427a0 Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Thu, 29 May 2025 19:47:37 +0530 Subject: [PATCH 11/32] helpers restored --- mssql_python/helpers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mssql_python/helpers.py b/mssql_python/helpers.py index cb0fdb55..e8e03a4d 100644 --- a/mssql_python/helpers.py +++ b/mssql_python/helpers.py @@ -46,6 +46,7 @@ def add_driver_to_connection_str(connection_str): # Insert the driver attribute at the beginning of the connection string final_connection_attributes.insert(0, driver_name) connection_str = ";".join(final_connection_attributes) + except Exception as e: raise Exception( "Invalid connection string, Please follow the format: " @@ -61,7 +62,7 @@ def check_error(handle_type, handle, ret): Args: handle_type: The type of the handle (e.g., SQL_HANDLE_ENV, SQL_HANDLE_DBC). - handle: The handle to check for errors. + handle: The SqlHandle object associated with the operation. ret: The return code from the DDBC function call. Raises: From a85224237ecef08e2aa3b363e4b1e5a0ccbed7c6 Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Thu, 29 May 2025 20:25:40 +0530 Subject: [PATCH 12/32] separated cursor --- mssql_python/connection_mac.py | 2 +- mssql_python/cursor.py | 64 +-- mssql_python/cursor_mac.py | 736 +++++++++++++++++++++++++++++++++ 3 files changed, 769 insertions(+), 33 deletions(-) create mode 100644 mssql_python/cursor_mac.py diff --git a/mssql_python/connection_mac.py b/mssql_python/connection_mac.py index 1231f262..66f94516 100644 --- a/mssql_python/connection_mac.py +++ b/mssql_python/connection_mac.py @@ -6,7 +6,7 @@ roll back transactions, and close the connection. """ import ctypes -from mssql_python.cursor import Cursor +from mssql_python.cursor_mac import Cursor from mssql_python.logging_config import get_logger, ENABLE_LOGGING from mssql_python.constants import ConstantsDDBC as ddbc_sql_const from mssql_python.helpers import add_driver_to_connection_str, check_error diff --git a/mssql_python/cursor.py b/mssql_python/cursor.py index 023bd601..c038ea7e 100644 --- a/mssql_python/cursor.py +++ b/mssql_python/cursor.py @@ -48,9 +48,11 @@ def __init__(self, connection) -> None: Args: connection: Database connection object. """ + if connection.hdbc is None: + raise Exception("Connection is closed. Cannot create a cursor.") self.connection = connection # self.connection.autocommit = False - self.hstmt = ctypes.c_void_p() + self.hstmt = None self._initialize_cursor() self.description = None self.rowcount = -1 @@ -415,22 +417,22 @@ def _allocate_statement_handle(self): """ Allocate the DDBC statement handle. """ - ret = ddbc_bindings.DDBCSQLAllocHandle( + ret, handle = ddbc_bindings.DDBCSQLAllocHandle( ddbc_sql_const.SQL_HANDLE_STMT.value, - self.connection.hdbc.value, - ctypes.cast(ctypes.pointer(self.hstmt), ctypes.c_void_p).value, + self.connection.hdbc ) - check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) + check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, handle, ret) + self.hstmt = handle def _reset_cursor(self) -> None: """ Reset the DDBC statement handle. """ - # Free the existing statement handle - if self.hstmt.value: - ddbc_bindings.DDBCSQLFreeHandle( - ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value - ) + if self.hstmt: + self.hstmt.free() # Free the existing statement handle + self.hstmt = None + if ENABLE_LOGGING: + logger.debug("SQLFreeHandle succeeded") # Reinitialize the statement handle self._initialize_cursor() @@ -442,15 +444,13 @@ def close(self) -> None: Error: If any operation is attempted with the cursor after it is closed. """ if self.closed: - raise RuntimeError("Cursor is already closed.") - - if self.hstmt.value: - ret = ddbc_bindings.DDBCSQLFreeHandle( - ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value - ) - check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) - self.hstmt.value = None + raise Exception("Cursor is already closed.") + if self.hstmt: + self.hstmt.free() + self.hstmt = None + if ENABLE_LOGGING: + logger.debug("SQLFreeHandle succeeded") self.closed = True def _check_closed(self): @@ -461,7 +461,7 @@ def _check_closed(self): Error: If the cursor is closed. """ if self.closed: - raise RuntimeError("Operation cannot be performed: the cursor is closed.") + raise Exception("Operation cannot be performed: the cursor is closed.") def _create_parameter_types_list(self, parameter, param_info, parameters_list, i): """ @@ -489,8 +489,8 @@ def _initialize_description(self): Initialize the description attribute using SQLDescribeCol. """ col_metadata = [] - ret = ddbc_bindings.DDBCSQLDescribeCol(self.hstmt.value, col_metadata) - check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) + ret = ddbc_bindings.DDBCSQLDescribeCol(self.hstmt, col_metadata) + check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt, ret) self.description = [ ( @@ -602,19 +602,19 @@ def execute( ) ret = ddbc_bindings.DDBCSQLExecute( - self.hstmt.value, + self.hstmt, operation, parameters, parameters_type, self.is_stmt_prepared, use_prepare, ) - check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) + check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt, ret) self.last_executed_stmt = operation # Update rowcount after execution # TODO: rowcount return code from SQL needs to be handled - self.rowcount = ddbc_bindings.DDBCSQLRowCount(self.hstmt.value) + self.rowcount = ddbc_bindings.DDBCSQLRowCount(self.hstmt) # Initialize description after execution self._initialize_description() @@ -664,8 +664,8 @@ def fetchone(self) -> Union[None, tuple]: self._check_closed() # Check if the cursor is closed row = [] - ret = ddbc_bindings.DDBCSQLFetchOne(self.hstmt.value, row) - check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) + ret = ddbc_bindings.DDBCSQLFetchOne(self.hstmt, row) + check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt, ret) if ret == ddbc_sql_const.SQL_NO_DATA.value: return None return list(row) @@ -690,8 +690,8 @@ def fetchmany(self, size: int = None) -> List[tuple]: # Fetch the next set of rows rows = [] - ret = ddbc_bindings.DDBCSQLFetchMany(self.hstmt.value, rows, size) - check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) + ret = ddbc_bindings.DDBCSQLFetchMany(self.hstmt, rows, size) + check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt, ret) if ret == ddbc_sql_const.SQL_NO_DATA.value: return [] return rows @@ -710,8 +710,8 @@ def fetchall(self) -> List[tuple]: # Fetch all remaining rows rows = [] - ret = ddbc_bindings.DDBCSQLFetchAll(self.hstmt.value, rows) - check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) + ret = ddbc_bindings.DDBCSQLFetchAll(self.hstmt, rows) + check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt, ret) if ret != ddbc_sql_const.SQL_NO_DATA.value: return [] return list(rows) @@ -729,8 +729,8 @@ def nextset(self) -> Union[bool, None]: self._check_closed() # Check if the cursor is closed # Skip to the next result set - ret = ddbc_bindings.DDBCSQLMoreResults(self.hstmt.value) - check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) + ret = ddbc_bindings.DDBCSQLMoreResults(self.hstmt) + check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt, ret) if ret == ddbc_sql_const.SQL_NO_DATA.value: return False return True diff --git a/mssql_python/cursor_mac.py b/mssql_python/cursor_mac.py new file mode 100644 index 00000000..023bd601 --- /dev/null +++ b/mssql_python/cursor_mac.py @@ -0,0 +1,736 @@ +""" +Copyright (c) Microsoft Corporation. +Licensed under the MIT license. +This module contains the Cursor class, which represents a database cursor. +""" +import ctypes +import decimal +import uuid +import datetime +from typing import List, Union +from mssql_python.constants import ConstantsDDBC as ddbc_sql_const +from mssql_python.helpers import check_error +from mssql_python.logging_config import get_logger, ENABLE_LOGGING +from mssql_python import ddbc_bindings + +logger = get_logger() + + +class Cursor: + """ + Represents a database cursor, which is used to manage the context of a fetch operation. + + Attributes: + connection: Database connection object. + description: Sequence of 7-item sequences describing one result column. + rowcount: Number of rows produced or affected by the last execute operation. + arraysize: Number of rows to fetch at a time with fetchmany(). + + Methods: + __init__(connection_str) -> None. + callproc(procname, parameters=None) -> + Modified copy of the input sequence with output parameters. + close() -> None. + execute(operation, parameters=None) -> None. + executemany(operation, seq_of_parameters) -> None. + fetchone() -> Single sequence or None if no more data is available. + fetchmany(size=None) -> Sequence of sequences (e.g. list of tuples). + fetchall() -> Sequence of sequences (e.g. list of tuples). + nextset() -> True if there is another result set, None otherwise. + setinputsizes(sizes) -> None. + setoutputsize(size, column=None) -> None. + """ + + def __init__(self, connection) -> None: + """ + Initialize the cursor with a database connection. + + Args: + connection: Database connection object. + """ + self.connection = connection + # self.connection.autocommit = False + self.hstmt = ctypes.c_void_p() + self._initialize_cursor() + self.description = None + self.rowcount = -1 + self.arraysize = ( + 1 # Default number of rows to fetch at a time is 1, user can change it + ) + self.buffer_length = 1024 # Default buffer length for string data + self.closed = False # Flag to indicate if the cursor is closed + self.last_executed_stmt = ( + "" # Stores the last statement executed by this cursor + ) + self.is_stmt_prepared = [ + False + ] # Indicates if last_executed_stmt was prepared by ddbc shim. + # Is a list instead of a bool coz bools in Python are immutable. + # Hence, we can't pass around bools by reference & modify them. + # Therefore, it must be a list with exactly one bool element. + + def _is_unicode_string(self, param): + """ + Check if a string contains non-ASCII characters. + + Args: + param: The string to check. + + Returns: + True if the string contains non-ASCII characters, False otherwise. + """ + try: + param.encode("ascii") + return False # Can be encoded to ASCII, so not Unicode + except UnicodeEncodeError: + return True # Contains non-ASCII characters, so treat as Unicode + + def _parse_date(self, param): + """ + Attempt to parse a string as a date. + + Args: + param: The string to parse. + + Returns: + A datetime.date object if parsing is successful, else None. + """ + formats = ["%Y-%m-%d"] + for fmt in formats: + try: + return datetime.datetime.strptime(param, fmt).date() + except ValueError: + continue + return None + + def _parse_datetime(self, param): + """ + Attempt to parse a string as a datetime, smalldatetime, datetime2, timestamp. + + Args: + param: The string to parse. + + Returns: + A datetime.datetime object if parsing is successful, else None. + """ + formats = [ + "%Y-%m-%dT%H:%M:%S.%f", # ISO 8601 datetime with fractional seconds + "%Y-%m-%dT%H:%M:%S", # ISO 8601 datetime + "%Y-%m-%d %H:%M:%S.%f", # Datetime with fractional seconds + "%Y-%m-%d %H:%M:%S", # Datetime without fractional seconds + ] + for fmt in formats: + try: + return datetime.datetime.strptime(param, fmt) # Valid datetime + except ValueError: + continue # Try next format + + return None # If all formats fail, return None + + def _parse_time(self, param): + """ + Attempt to parse a string as a time. + + Args: + param: The string to parse. + + Returns: + A datetime.time object if parsing is successful, else None. + """ + formats = [ + "%H:%M:%S", # Time only + "%H:%M:%S.%f", # Time with fractional seconds + ] + for fmt in formats: + try: + return datetime.datetime.strptime(param, fmt).time() + except ValueError: + continue + return None + + def _get_numeric_data(self, param): + """ + Get the data for a numeric parameter. + + Args: + param: The numeric parameter. + + Returns: + numeric_data: A NumericData struct containing + the numeric data. + """ + decimal_as_tuple = param.as_tuple() + num_digits = len(decimal_as_tuple.digits) + exponent = decimal_as_tuple.exponent + + # Calculate the SQL precision & scale + # precision = no. of significant digits + # scale = no. digits after decimal point + if exponent >= 0: + # digits=314, exp=2 ---> '31400' --> precision=5, scale=0 + precision = num_digits + exponent + scale = 0 + elif (-1 * exponent) <= num_digits: + # digits=3140, exp=-3 ---> '3.140' --> precision=4, scale=3 + precision = num_digits + scale = exponent * -1 + else: + # digits=3140, exp=-5 ---> '0.03140' --> precision=5, scale=5 + # TODO: double check the precision calculation here with SQL documentation + precision = exponent * -1 + scale = exponent * -1 + + # TODO: Revisit this check, do we want this restriction? + if precision > 15: + raise ValueError( + "Precision of the numeric value is too high - " + + str(param) + + ". Should be less than or equal to 15" + ) + Numeric_Data = ddbc_bindings.NumericData + numeric_data = Numeric_Data() + numeric_data.scale = scale + numeric_data.precision = precision + numeric_data.sign = 1 if decimal_as_tuple.sign == 0 else 0 + # strip decimal point from param & convert the significant digits to integer + # Ex: 12.34 ---> 1234 + val = str(param) + if "." in val or "-" in val: + val = val.replace(".", "") + val = val.replace("-", "") + val = int(val) + numeric_data.val = val + return numeric_data + + def _map_sql_type(self, param, parameters_list, i): + """ + Map a Python data type to the corresponding SQL type, + C type, Column size, and Decimal digits. + Takes: + - param: The parameter to map. + - parameters_list: The list of parameters to bind. + - i: The index of the parameter in the list. + Returns: + - A tuple containing the SQL type, C type, column size, and decimal digits. + """ + if param is None: + return ( + ddbc_sql_const.SQL_VARCHAR.value, # TODO: Add SQLDescribeParam to get correct type + ddbc_sql_const.SQL_C_DEFAULT.value, + 1, + 0, + ) + + if isinstance(param, bool): + return ddbc_sql_const.SQL_BIT.value, ddbc_sql_const.SQL_C_BIT.value, 1, 0 + + if isinstance(param, int): + if 0 <= param <= 255: + return ( + ddbc_sql_const.SQL_TINYINT.value, + ddbc_sql_const.SQL_C_TINYINT.value, + 3, + 0, + ) + if -32768 <= param <= 32767: + return ( + ddbc_sql_const.SQL_SMALLINT.value, + ddbc_sql_const.SQL_C_SHORT.value, + 5, + 0, + ) + if -2147483648 <= param <= 2147483647: + return ( + ddbc_sql_const.SQL_INTEGER.value, + ddbc_sql_const.SQL_C_LONG.value, + 10, + 0, + ) + return ( + ddbc_sql_const.SQL_BIGINT.value, + ddbc_sql_const.SQL_C_SBIGINT.value, + 19, + 0, + ) + + if isinstance(param, float): + return ( + ddbc_sql_const.SQL_DOUBLE.value, + ddbc_sql_const.SQL_C_DOUBLE.value, + 15, + 0, + ) + + if isinstance(param, decimal.Decimal): + parameters_list[i] = self._get_numeric_data( + param + ) # Replace the parameter with the dictionary + return ( + ddbc_sql_const.SQL_NUMERIC.value, + ddbc_sql_const.SQL_C_NUMERIC.value, + parameters_list[i].precision, + parameters_list[i].scale, + ) + + if isinstance(param, str): + if ( + param.startswith("POINT") + or param.startswith("LINESTRING") + or param.startswith("POLYGON") + ): + return ( + ddbc_sql_const.SQL_WVARCHAR.value, + ddbc_sql_const.SQL_C_WCHAR.value, + len(param), + 0, + ) + + # Attempt to parse as date, datetime, datetime2, timestamp, smalldatetime or time + if self._parse_date(param): + parameters_list[i] = self._parse_date( + param + ) # Replace the parameter with the date object + return ( + ddbc_sql_const.SQL_DATE.value, + ddbc_sql_const.SQL_C_TYPE_DATE.value, + 10, + 0, + ) + if self._parse_datetime(param): + parameters_list[i] = self._parse_datetime(param) + return ( + ddbc_sql_const.SQL_TIMESTAMP.value, + ddbc_sql_const.SQL_C_TYPE_TIMESTAMP.value, + 26, + 6, + ) + if self._parse_time(param): + parameters_list[i] = self._parse_time(param) + return ( + ddbc_sql_const.SQL_TIME.value, + ddbc_sql_const.SQL_C_TYPE_TIME.value, + 8, + 0, + ) + + # String mapping logic here + is_unicode = self._is_unicode_string(param) + # TODO: revisit + if len(param) > 4000: # Long strings + if is_unicode: + return ( + ddbc_sql_const.SQL_WLONGVARCHAR.value, + ddbc_sql_const.SQL_C_WCHAR.value, + len(param), + 0, + ) + return ( + ddbc_sql_const.SQL_LONGVARCHAR.value, + ddbc_sql_const.SQL_C_CHAR.value, + len(param), + 0, + ) + if is_unicode: # Short Unicode strings + return ( + ddbc_sql_const.SQL_WVARCHAR.value, + ddbc_sql_const.SQL_C_WCHAR.value, + len(param), + 0, + ) + return ( + ddbc_sql_const.SQL_VARCHAR.value, + ddbc_sql_const.SQL_C_CHAR.value, + len(param), + 0, + ) + + if isinstance(param, bytes): + if len(param) > 8000: # Assuming VARBINARY(MAX) for long byte arrays + return ( + ddbc_sql_const.SQL_VARBINARY.value, + ddbc_sql_const.SQL_C_BINARY.value, + len(param), + 0, + ) + return ( + ddbc_sql_const.SQL_BINARY.value, + ddbc_sql_const.SQL_C_BINARY.value, + len(param), + 0, + ) + + if isinstance(param, bytearray): + if len(param) > 8000: # Assuming VARBINARY(MAX) for long byte arrays + return ( + ddbc_sql_const.SQL_VARBINARY.value, + ddbc_sql_const.SQL_C_BINARY.value, + len(param), + 0, + ) + return ( + ddbc_sql_const.SQL_BINARY.value, + ddbc_sql_const.SQL_C_BINARY.value, + len(param), + 0, + ) + + if isinstance(param, datetime.datetime): + return ( + ddbc_sql_const.SQL_TIMESTAMP.value, + ddbc_sql_const.SQL_C_TYPE_TIMESTAMP.value, + 26, + 6, + ) + + if isinstance(param, datetime.date): + return ( + ddbc_sql_const.SQL_DATE.value, + ddbc_sql_const.SQL_C_TYPE_DATE.value, + 10, + 0, + ) + + if isinstance(param, datetime.time): + return ( + ddbc_sql_const.SQL_TIME.value, + ddbc_sql_const.SQL_C_TYPE_TIME.value, + 8, + 0, + ) + + return ( + ddbc_sql_const.SQL_VARCHAR.value, + ddbc_sql_const.SQL_C_CHAR.value, + len(str(param)), + 0, + ) + + def _initialize_cursor(self) -> None: + """ + Initialize the DDBC statement handle. + """ + self._allocate_statement_handle() + + def _allocate_statement_handle(self): + """ + Allocate the DDBC statement handle. + """ + ret = ddbc_bindings.DDBCSQLAllocHandle( + ddbc_sql_const.SQL_HANDLE_STMT.value, + self.connection.hdbc.value, + ctypes.cast(ctypes.pointer(self.hstmt), ctypes.c_void_p).value, + ) + check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) + + def _reset_cursor(self) -> None: + """ + Reset the DDBC statement handle. + """ + # Free the existing statement handle + if self.hstmt.value: + ddbc_bindings.DDBCSQLFreeHandle( + ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value + ) + # Reinitialize the statement handle + self._initialize_cursor() + + def close(self) -> None: + """ + Close the cursor now (rather than whenever __del__ is called). + + Raises: + Error: If any operation is attempted with the cursor after it is closed. + """ + if self.closed: + raise RuntimeError("Cursor is already closed.") + + if self.hstmt.value: + ret = ddbc_bindings.DDBCSQLFreeHandle( + ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value + ) + check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) + self.hstmt.value = None + + self.closed = True + + def _check_closed(self): + """ + Check if the cursor is closed and raise an exception if it is. + + Raises: + Error: If the cursor is closed. + """ + if self.closed: + raise RuntimeError("Operation cannot be performed: the cursor is closed.") + + def _create_parameter_types_list(self, parameter, param_info, parameters_list, i): + """ + Maps parameter types for the given parameter. + + Args: + parameter: parameter to bind. + + Returns: + paraminfo. + """ + paraminfo = param_info() + sql_type, c_type, column_size, decimal_digits = self._map_sql_type( + parameter, parameters_list, i + ) + paraminfo.paramCType = c_type + paraminfo.paramSQLType = sql_type + paraminfo.inputOutputType = ddbc_sql_const.SQL_PARAM_INPUT.value + paraminfo.columnSize = column_size + paraminfo.decimalDigits = decimal_digits + return paraminfo + + def _initialize_description(self): + """ + Initialize the description attribute using SQLDescribeCol. + """ + col_metadata = [] + ret = ddbc_bindings.DDBCSQLDescribeCol(self.hstmt.value, col_metadata) + check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) + + self.description = [ + ( + col["ColumnName"], + self._map_data_type(col["DataType"]), + None, + col["ColumnSize"], + col["ColumnSize"], + col["DecimalDigits"], + col["Nullable"] == ddbc_sql_const.SQL_NULLABLE.value, + ) + for col in col_metadata + ] + + def _map_data_type(self, sql_type): + """ + Map SQL data type to Python data type. + + Args: + sql_type: SQL data type. + + Returns: + Corresponding Python data type. + """ + sql_to_python_type = { + ddbc_sql_const.SQL_INTEGER.value: int, + ddbc_sql_const.SQL_VARCHAR.value: str, + ddbc_sql_const.SQL_WVARCHAR.value: str, + ddbc_sql_const.SQL_CHAR.value: str, + ddbc_sql_const.SQL_WCHAR.value: str, + ddbc_sql_const.SQL_FLOAT.value: float, + ddbc_sql_const.SQL_DOUBLE.value: float, + ddbc_sql_const.SQL_DECIMAL.value: decimal.Decimal, + ddbc_sql_const.SQL_NUMERIC.value: decimal.Decimal, + ddbc_sql_const.SQL_DATE.value: datetime.date, + ddbc_sql_const.SQL_TIMESTAMP.value: datetime.datetime, + ddbc_sql_const.SQL_TIME.value: datetime.time, + ddbc_sql_const.SQL_BIT.value: bool, + ddbc_sql_const.SQL_TINYINT.value: int, + ddbc_sql_const.SQL_SMALLINT.value: int, + ddbc_sql_const.SQL_BIGINT.value: int, + ddbc_sql_const.SQL_BINARY.value: bytes, + ddbc_sql_const.SQL_VARBINARY.value: bytes, + ddbc_sql_const.SQL_LONGVARBINARY.value: bytes, + ddbc_sql_const.SQL_GUID.value: uuid.UUID, + # Add more mappings as needed + } + return sql_to_python_type.get(sql_type, str) + + def execute( + self, + operation: str, + *parameters, + use_prepare: bool = True, + reset_cursor: bool = True + ) -> None: + """ + Prepare and execute a database operation (query or command). + + Args: + operation: SQL query or command. + parameters: Sequence of parameters to bind. + use_prepare: Whether to use SQLPrepareW (default) or SQLExecDirectW. + reset_cursor: Whether to reset the cursor before execution. + """ + self._check_closed() # Check if the cursor is closed + + if reset_cursor: + self._reset_cursor() + + param_info = ddbc_bindings.ParamInfo + parameters_type = [] + + # Flatten parameters if a single tuple or list is passed + if len(parameters) == 1 and isinstance(parameters[0], (tuple, list)): + parameters = parameters[0] + + parameters = list(parameters) + + if parameters: + for i, param in enumerate(parameters): + paraminfo = self._create_parameter_types_list( + param, param_info, parameters, i + ) + parameters_type.append(paraminfo) + + # TODO: Use a more sophisticated string compare that handles redundant spaces etc. + # Also consider storing last query's hash instead of full query string. This will help + # in low-memory conditions + # (Ex: huge number of parallel queries with huge query string sizes) + if operation != self.last_executed_stmt: +# Executing a new statement. Reset is_stmt_prepared to false + self.is_stmt_prepared = [False] + + if ENABLE_LOGGING: + logger.debug("Executing query: %s", operation) + for i, param in enumerate(parameters): + logger.debug( + """Parameter number: %s, Parameter: %s, + Param Python Type: %s, ParamInfo: %s, %s, %s, %s, %s""", + i + 1, + param, + str(type(param)), + parameters_type[i].paramSQLType, + parameters_type[i].paramCType, + parameters_type[i].columnSize, + parameters_type[i].decimalDigits, + parameters_type[i].inputOutputType, + ) + + ret = ddbc_bindings.DDBCSQLExecute( + self.hstmt.value, + operation, + parameters, + parameters_type, + self.is_stmt_prepared, + use_prepare, + ) + check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) + self.last_executed_stmt = operation + + # Update rowcount after execution + # TODO: rowcount return code from SQL needs to be handled + self.rowcount = ddbc_bindings.DDBCSQLRowCount(self.hstmt.value) + + # Initialize description after execution + self._initialize_description() + + def executemany(self, operation: str, seq_of_parameters: list) -> None: + """ + Prepare a database operation and execute it against all parameter sequences. + + Args: + operation: SQL query or command. + seq_of_parameters: Sequence of sequences or mappings of parameters. + + Raises: + Error: If the operation fails. + """ + self._check_closed() # Check if the cursor is closed + + self._reset_cursor() + + first_execution = True + total_rowcount = 0 + for parameters in seq_of_parameters: + parameters = list(parameters) + if ENABLE_LOGGING: + logger.info("Executing query with parameters: %s", parameters) + prepare_stmt = first_execution + first_execution = False + self.execute( + operation, parameters, use_prepare=prepare_stmt, reset_cursor=False + ) + if self.rowcount != -1: + total_rowcount += self.rowcount + else: + total_rowcount = -1 + self.rowcount = total_rowcount + + def fetchone(self) -> Union[None, tuple]: + """ + Fetch the next row of a query result set. + + Returns: + Single sequence or None if no more data is available. + + Raises: + Error: If the previous call to execute did not produce any result set. + """ + self._check_closed() # Check if the cursor is closed + + row = [] + ret = ddbc_bindings.DDBCSQLFetchOne(self.hstmt.value, row) + check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) + if ret == ddbc_sql_const.SQL_NO_DATA.value: + return None + return list(row) + + def fetchmany(self, size: int = None) -> List[tuple]: + """ + Fetch the next set of rows of a query result. + + Args: + size: Number of rows to fetch at a time. + + Returns: + Sequence of sequences (e.g. list of tuples). + + Raises: + Error: If the previous call to execute did not produce any result set. + """ + self._check_closed() # Check if the cursor is closed + + if size is None: + size = self.arraysize + + # Fetch the next set of rows + rows = [] + ret = ddbc_bindings.DDBCSQLFetchMany(self.hstmt.value, rows, size) + check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) + if ret == ddbc_sql_const.SQL_NO_DATA.value: + return [] + return rows + + def fetchall(self) -> List[tuple]: + """ + Fetch all (remaining) rows of a query result. + + Returns: + Sequence of sequences (e.g. list of tuples). + + Raises: + Error: If the previous call to execute did not produce any result set. + """ + self._check_closed() # Check if the cursor is closed + + # Fetch all remaining rows + rows = [] + ret = ddbc_bindings.DDBCSQLFetchAll(self.hstmt.value, rows) + check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) + if ret != ddbc_sql_const.SQL_NO_DATA.value: + return [] + return list(rows) + + def nextset(self) -> Union[bool, None]: + """ + Skip to the next available result set. + + Returns: + True if there is another result set, None otherwise. + + Raises: + Error: If the previous call to execute did not produce any result set. + """ + self._check_closed() # Check if the cursor is closed + + # Skip to the next result set + ret = ddbc_bindings.DDBCSQLMoreResults(self.hstmt.value) + check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) + if ret == ddbc_sql_const.SQL_NO_DATA.value: + return False + return True From c936eec57da4edbd435076051597adee674af356 Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Thu, 29 May 2025 20:28:31 +0530 Subject: [PATCH 13/32] odbc decoding from utf-16 to utf-16-le --- mssql_python/pybind/mac_buffers.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mssql_python/pybind/mac_buffers.h b/mssql_python/pybind/mac_buffers.h index abd67c27..c768f233 100644 --- a/mssql_python/pybind/mac_buffers.h +++ b/mssql_python/pybind/mac_buffers.h @@ -18,7 +18,7 @@ namespace mac_buffers { // Constants for Unicode character encoding -constexpr const char* ODBC_DECODING = "utf-16"; +constexpr const char* ODBC_DECODING = "utf-16-le"; constexpr size_t UCS_LENGTH = 2; /** From 2a8adc40768ce6f229420deacb8a3ddb3db9e416 Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Thu, 29 May 2025 20:42:21 +0530 Subject: [PATCH 14/32] reverted test_exceptions --- tests/test_005_exceptions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_005_exceptions.py b/tests/test_005_exceptions.py index 6995ee48..40791fb6 100644 --- a/tests/test_005_exceptions.py +++ b/tests/test_005_exceptions.py @@ -87,7 +87,7 @@ def test_data_truncation_error(cursor, db_connection): try: cursor.execute("CREATE TABLE pytest_test_truncation (id INT, name NVARCHAR(5))") cursor.execute("INSERT INTO pytest_test_truncation (id, name) VALUES (?, ?)", [1, 'TooLongName']) - except DataError as excinfo: + except ProgrammingError as excinfo: assert "String or binary data would be truncated" in str(excinfo) finally: drop_table_if_exists(cursor, "pytest_test_truncation") From 3650a46bb7a170fb8e5331fa2272242732c9962a Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Thu, 29 May 2025 21:04:43 +0530 Subject: [PATCH 15/32] use both Data/ProgrammingError in one exception testcase --- tests/test_005_exceptions.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/test_005_exceptions.py b/tests/test_005_exceptions.py index 40791fb6..2fa0cdcf 100644 --- a/tests/test_005_exceptions.py +++ b/tests/test_005_exceptions.py @@ -87,7 +87,9 @@ def test_data_truncation_error(cursor, db_connection): try: cursor.execute("CREATE TABLE pytest_test_truncation (id INT, name NVARCHAR(5))") cursor.execute("INSERT INTO pytest_test_truncation (id, name) VALUES (?, ?)", [1, 'TooLongName']) - except ProgrammingError as excinfo: + except (ProgrammingError, DataError) as excinfo: + # Catching specific exceptions for SQL Server truncation error + # A DataError is raised on Windows but ProgrammingError on MacOS assert "String or binary data would be truncated" in str(excinfo) finally: drop_table_if_exists(cursor, "pytest_test_truncation") From 350e1a647ce5cfecd628d35caea1d8e4a60d0cda Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Fri, 30 May 2025 10:44:40 +0530 Subject: [PATCH 16/32] not using separate connection module for macOS --- mssql_python/pybind/CMakeLists.txt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mssql_python/pybind/CMakeLists.txt b/mssql_python/pybind/CMakeLists.txt index 99dd0d55..45c6aceb 100644 --- a/mssql_python/pybind/CMakeLists.txt +++ b/mssql_python/pybind/CMakeLists.txt @@ -160,13 +160,17 @@ endif() if(APPLE) set(DDBC_SOURCE "ddbc_bindings_mac.cpp") message(STATUS "Using macOS-specific source file: ${DDBC_SOURCE}") + # Only ddbc_bindings_mac.cpp is used on macOS + # TODO: Implement smart pointer in macOS + add_library(ddbc_bindings MODULE ${DDBC_SOURCE}) else() + # This is just windows block set(DDBC_SOURCE "ddbc_bindings.cpp") message(STATUS "Using standard source file: ${DDBC_SOURCE}") + # Include connection module for Windows + add_library(ddbc_bindings MODULE ${DDBC_SOURCE} connection/connection.cpp) endif() -# Add module library -add_library(ddbc_bindings MODULE ${DDBC_SOURCE}) # Set the output name to include Python version and architecture # Use appropriate file extension based on platform From 323dbae6ff5fd3e1c7c88322e54335ea4e450059 Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Fri, 30 May 2025 10:50:21 +0530 Subject: [PATCH 17/32] include cmake_current_source_dir --- mssql_python/pybind/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mssql_python/pybind/CMakeLists.txt b/mssql_python/pybind/CMakeLists.txt index 45c6aceb..f32e977a 100644 --- a/mssql_python/pybind/CMakeLists.txt +++ b/mssql_python/pybind/CMakeLists.txt @@ -200,6 +200,8 @@ message(STATUS "Using ODBC include directory: ${ODBC_INCLUDE_DIR}") # Configure target include directories and link libraries target_include_directories(ddbc_bindings PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} # Root directory (for ddbc_bindings.h) + ${CMAKE_CURRENT_SOURCE_DIR}/connection # connection directory (for connection.h) ${PYTHON_INCLUDE_DIR} ${PYBIND11_INCLUDE_DIR} ) From 81a8529fb54b17179297cc3b9fcf8b1462a0ec7a Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Fri, 30 May 2025 11:10:29 +0530 Subject: [PATCH 18/32] connection error diff in mac and windows --- tests/test_005_exceptions.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/test_005_exceptions.py b/tests/test_005_exceptions.py index 2fa0cdcf..d2e81a59 100644 --- a/tests/test_005_exceptions.py +++ b/tests/test_005_exceptions.py @@ -126,7 +126,10 @@ def test_foreign_key_constraint_error(cursor, db_connection): drop_table_if_exists(cursor, "pytest_parent_table") db_connection.commit() -def test_connection_error(db_connection): - with pytest.raises(OperationalError) as excinfo: +def test_connection_error(): + # RuntimeError is raised on Windows, while on MacOS it raises OperationalError + # In MacOS the error goes by "Client unable to establish connection" + # and on Windows it goes by "Neither DSN nor SERVER keyword supplied" + with pytest.raises((RuntimeError, OperationalError)) as excinfo: connect("InvalidConnectionString") - assert "Client unable to establish connection" in str(excinfo.value) + assert "Client unable to establish connection" in str(excinfo.value) or "Neither DSN nor SERVER keyword supplied" in str(excinfo.value) \ No newline at end of file From c88299bdc0320594d96646b64b8849accb9c26c4 Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Fri, 30 May 2025 11:12:04 +0530 Subject: [PATCH 19/32] added TODO in code --- tests/test_005_exceptions.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/test_005_exceptions.py b/tests/test_005_exceptions.py index d2e81a59..0380e9b9 100644 --- a/tests/test_005_exceptions.py +++ b/tests/test_005_exceptions.py @@ -88,8 +88,9 @@ def test_data_truncation_error(cursor, db_connection): cursor.execute("CREATE TABLE pytest_test_truncation (id INT, name NVARCHAR(5))") cursor.execute("INSERT INTO pytest_test_truncation (id, name) VALUES (?, ?)", [1, 'TooLongName']) except (ProgrammingError, DataError) as excinfo: - # Catching specific exceptions for SQL Server truncation error - # A DataError is raised on Windows but ProgrammingError on MacOS + # DataError is raised on Windows but ProgrammingError on MacOS + # Included catching both ProgrammingError and DataError in this test + # TODO: Make this test platform independent assert "String or binary data would be truncated" in str(excinfo) finally: drop_table_if_exists(cursor, "pytest_test_truncation") @@ -129,7 +130,8 @@ def test_foreign_key_constraint_error(cursor, db_connection): def test_connection_error(): # RuntimeError is raised on Windows, while on MacOS it raises OperationalError # In MacOS the error goes by "Client unable to establish connection" - # and on Windows it goes by "Neither DSN nor SERVER keyword supplied" + # In Windows it goes by "Neither DSN nor SERVER keyword supplied" + # TODO: Make this test platform independent with pytest.raises((RuntimeError, OperationalError)) as excinfo: connect("InvalidConnectionString") assert "Client unable to establish connection" in str(excinfo.value) or "Neither DSN nor SERVER keyword supplied" in str(excinfo.value) \ No newline at end of file From 5edeb64346580465fe970a8ddcbe82d32b1ec971 Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Mon, 2 Jun 2025 16:14:40 +0530 Subject: [PATCH 20/32] removed cursor no_data redundant case --- mssql_python/cursor_mac.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/mssql_python/cursor_mac.py b/mssql_python/cursor_mac.py index 023bd601..63351bd4 100644 --- a/mssql_python/cursor_mac.py +++ b/mssql_python/cursor_mac.py @@ -666,8 +666,6 @@ def fetchone(self) -> Union[None, tuple]: row = [] ret = ddbc_bindings.DDBCSQLFetchOne(self.hstmt.value, row) check_error(ddbc_sql_const.SQL_HANDLE_STMT.value, self.hstmt.value, ret) - if ret == ddbc_sql_const.SQL_NO_DATA.value: - return None return list(row) def fetchmany(self, size: int = None) -> List[tuple]: From f406e4f1df7e5394084e98aae6ce04e381d68834 Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Mon, 2 Jun 2025 19:03:20 +0530 Subject: [PATCH 21/32] Sanitization of connection string before logging --- mssql_python/pybind/ddbc_bindings_mac.cpp | 36 ++++++++++++++++++----- mssql_python/pybind/mac_fix.cpp | 24 +++++++++++++++ 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/mssql_python/pybind/ddbc_bindings_mac.cpp b/mssql_python/pybind/ddbc_bindings_mac.cpp index 92634366..094c6206 100644 --- a/mssql_python/pybind/ddbc_bindings_mac.cpp +++ b/mssql_python/pybind/ddbc_bindings_mac.cpp @@ -285,8 +285,6 @@ std::string GetModuleDirectory() { py::object module_path = module.attr("__file__"); std::string module_file = module_path.cast(); - std::cerr << "DEBUG: Module file path: " << module_file << std::endl; - #ifdef _WIN32 // Windows-specific path handling char path[MAX_PATH]; @@ -298,7 +296,6 @@ std::string GetModuleDirectory() { std::string::size_type pos = module_file.find_last_of('/'); if (pos != std::string::npos) { std::string dir = module_file.substr(0, pos); - std::cerr << "DEBUG: Module directory: " << dir << std::endl; return dir; } std::cerr << "DEBUG: Could not extract directory from path: " << module_file << std::endl; @@ -1081,6 +1078,33 @@ ErrorInfo SQLCheckError_Wrap(SQLSMALLINT handleType, intptr_t handle, SQLRETURN return errorInfo; } + +// Sanitize connection string to remove sensitive information +std::wstring SanitizeConnectionString(const std::wstring& connectionString) { + // This function will remove the UID and Pwd parameters for security reasons + std::wstring sanitizedString = connectionString; + // Remove UID and Pwd parameters + size_t uidPos = sanitizedString.find(L"UID="); + if (uidPos != std::wstring::npos) { + size_t endPos = sanitizedString.find(L';', uidPos); + if (endPos != std::wstring::npos) { + sanitizedString.erase(uidPos, endPos - uidPos + 1); + } else { + sanitizedString.erase(uidPos); + } + } + size_t pwdPos = sanitizedString.find(L"Pwd="); + if (pwdPos != std::wstring::npos) { + size_t endPos = sanitizedString.find(L';', pwdPos); + if (endPos != std::wstring::npos) { + sanitizedString.erase(pwdPos, endPos - pwdPos + 1); + } else { + sanitizedString.erase(pwdPos); + } + } + return sanitizedString; +} + // Wrap SQLDriverConnect SQLRETURN SQLDriverConnect_wrap(intptr_t ConnectionHandle, intptr_t WindowHandle, const std::wstring& ConnectionString) { @@ -1100,10 +1124,8 @@ SQLRETURN SQLDriverConnect_wrap(intptr_t ConnectionHandle, intptr_t WindowHandle #else connStrPtr = const_cast(ConnectionString.c_str()); #endif - - // Log the actual connection string, not the pointer value - LOG("Connection string - {}", ConnectionString); - + // Log the sanitized connection string + LOG("Connection string - {}", SanitizeConnectionString(ConnectionString).c_str()); return SQLDriverConnect_ptr(reinterpret_cast(ConnectionHandle), reinterpret_cast(WindowHandle), connStrPtr, SQL_NTS, nullptr, diff --git a/mssql_python/pybind/mac_fix.cpp b/mssql_python/pybind/mac_fix.cpp index 9ef65f4f..06ebb253 100644 --- a/mssql_python/pybind/mac_fix.cpp +++ b/mssql_python/pybind/mac_fix.cpp @@ -6,6 +6,24 @@ const char* kOdbcEncoding = "utf-16-le"; // ODBC uses UTF-16LE for SQLWCHAR const size_t kUcsLength = 2; // SQLWCHAR is 2 bytes on all platforms +// TODO: Make Logger a separate module and import it across the project +template +void LOG(const std::string& formatString, Args&&... args) { + // Get the logger each time instead of caching it to ensure we get the latest state + py::object logging_module = py::module_::import("mssql_python.logging_config"); + py::object logger = logging_module.attr("get_logger")(); + + // If logger is None, don't try to log + if (py::isinstance(logger)) { + return; + } + + // Format the message and log it + std::string ddbcFormatString = "[DDBC Bindings log] " + formatString; + py::str message = py::str(ddbcFormatString).format(std::forward(args)...); + logger.attr("debug")(message); +} + // Function to convert SQLWCHAR strings to std::wstring on macOS std::wstring SQLWCHARToWString(const SQLWCHAR* sqlwStr, size_t length = SQL_NTS) { if (!sqlwStr) return std::wstring(); @@ -31,6 +49,8 @@ std::wstring SQLWCHARToWString(const SQLWCHAR* sqlwStr, size_t length = SQL_NTS) return converter.from_bytes(reinterpret_cast(utf16Bytes.data()), reinterpret_cast(utf16Bytes.data() + utf16Bytes.size())); } catch (const std::exception& e) { + // Log a warning about using fallback conversion + LOG("Warning: Using fallback string conversion on macOS. Character data might be inexact."); // Fallback to character-by-character conversion if codecvt fails std::wstring result; result.reserve(length); @@ -55,6 +75,8 @@ std::vector WStringToSQLWCHAR(const std::wstring& str) { } return result; } catch (const std::exception& e) { + // Log a warning about using fallback conversion + LOG("Warning: Using fallback conversion for std::wstring to SQLWCHAR on macOS. Character data might be inexact."); // Fallback to simple casting if codecvt fails std::vector result(str.size() + 1, 0); // +1 for null terminator for (size_t i = 0; i < str.size(); ++i) { @@ -84,6 +106,8 @@ std::string SQLWCHARToUTF8String(const SQLWCHAR* buffer) { return converter.to_bytes(reinterpret_cast(utf16Bytes.data()), reinterpret_cast(utf16Bytes.data() + utf16Bytes.size())); } catch (const std::exception& e) { + // Log a warning about using fallback conversion + LOG("Warning: Using fallback conversion for SQLWCHAR to UTF-8 on macOS. Character data might be inexact."); // Simple fallback conversion std::string result; for (size_t j = 0; j < i; ++j) { From 1e89686a8fd39a552bc878783e65c117d55072df Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Mon, 2 Jun 2025 19:05:18 +0530 Subject: [PATCH 22/32] remove conn str logging in python --- mssql_python/connection_mac.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/mssql_python/connection_mac.py b/mssql_python/connection_mac.py index 66f94516..ab2cb167 100644 --- a/mssql_python/connection_mac.py +++ b/mssql_python/connection_mac.py @@ -95,9 +95,6 @@ def _construct_connection_string(self, connection_str: str = "", **kwargs) -> st continue conn_str += f"{key}={value};" - if ENABLE_LOGGING: - logger.info("Final connection string: %s", conn_str) - return conn_str def _initializer(self) -> None: From d4341ffabdaa17ba1fc18a53c31fe57b01325d9b Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Mon, 2 Jun 2025 19:35:34 +0530 Subject: [PATCH 23/32] FIX: Added @loader for DYLIBS --- mssql_python/libs/macos/lib/libltdl.7.dylib | Bin 93840 -> 93840 bytes .../libs/macos/lib/libmsodbcsql.18.dylib | Bin 1673120 -> 1673120 bytes .../libs/macos/lib/libodbcinst.2.dylib | Bin 111808 -> 111808 bytes mssql_python/pybind/configure_dylibs.sh | 23 +++++++++++++++--- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/mssql_python/libs/macos/lib/libltdl.7.dylib b/mssql_python/libs/macos/lib/libltdl.7.dylib index e0999cecf56238fd94ca4a84db00fb5a8a7a66f4..c9a767572b8e5f2025baada5613694bab7983cfb 100644 GIT binary patch delta 117 zcmbPmmvsUVi7+N?6#dU^Xu-h1AOXaTK+M3*4J5c39CGp#Q&NlK3ld8*^m8(ka!OKi z^vv~ADuHZ<&7myzdXpEh3T&QYWb|2qQM>T0({H=}{n`pP55At;?$@^LK84rpma=0{{tGE^`0? diff --git a/mssql_python/libs/macos/lib/libmsodbcsql.18.dylib b/mssql_python/libs/macos/lib/libmsodbcsql.18.dylib index 56605d671cb5438d93270fdbe08403d442bed83f..ab929d0611b30cee330578e91ec6255399244bb0 100755 GIT binary patch delta 283 zcmZ3`pSGYsZGs4+#70qlHfsk41_lWrPKv#d&dA8hzzAeJrFA(zqF+UK4 z^a}#95D*Iku?P^00J+ZVX zu}t43wK%&Zzd%2?7-*nwL1jrsejbDq59I(2E7s3VOwKQc*#@#cGq1Qr&j@Ol6~{UD zW)FdO4*^CXW&&bnAZ7t#Rv=~rVs;?r0Afxc<^p1FAm#yLULfWJVtyb7=@$fIAs`k8 zVi6z~1!6HE7T@k6AaUiN0#C^5lTRh~Y1@}Rn9R2K;HBkmRz8z<2dGcfm}9G#$j`dn JhF>zJ0s!%TXu<#h diff --git a/mssql_python/libs/macos/lib/libodbcinst.2.dylib b/mssql_python/libs/macos/lib/libodbcinst.2.dylib index d8a149f93c26893c7121723c40fef161d1f84228..83a60102113a5044659bc40d07373005990727a8 100755 GIT binary patch delta 181 zcmX@`lI_4twh1DP3pR@WXEt+SU|^5{Vn!flU|d5g2a*x{hZ9C{FJ2R z%)H_fJtMu8N+6$sVR979Eh7t{VvtrQAZB3V1`^y1=vs41QgZanVcIrNV?8B3S%A%< zIYDuIf+C}om%@8?9@`UHryjO_jy~?PAc%M4mT;EK*Y@qTn(nMMOLW$+?X$8O)jR>9 CMmTW* delta 241 zcmX@`lI_4twh1DP4>pSaXLbu6zLF~-D;u1Y0y_8BIf3g?Lt)vW~W{^=#K+M3z4J5c3^h1kNi;DHr6HAK{ z%k*7Ri?d7e3-oh~iwkpf3o1)8^79~^cqj*GR-RI8udLfA$o{!)#?l}1rS/dev/null From 6d9b207f909f2f7df000406c89228896220aab11 Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Mon, 2 Jun 2025 19:44:49 +0530 Subject: [PATCH 24/32] fixed bdist_wheel --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 8a160703..090fb353 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ import sys from setuptools import setup, find_packages from setuptools.dist import Distribution -from setuptools.command.bdist_wheel import bdist_wheel +from wheel.bdist_wheel import bdist_wheel # Custom distribution to force platform-specific wheel class BinaryDistribution(Distribution): From b1025b2055d4f72ab68cc4c6ddb956e1ad79c9e4 Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Mon, 2 Jun 2025 20:00:18 +0530 Subject: [PATCH 25/32] fix python libs for python <3.13 --- mssql_python/pybind/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mssql_python/pybind/CMakeLists.txt b/mssql_python/pybind/CMakeLists.txt index bbc1dd50..c793ba65 100644 --- a/mssql_python/pybind/CMakeLists.txt +++ b/mssql_python/pybind/CMakeLists.txt @@ -111,7 +111,7 @@ execute_process( message(STATUS "Python LIBDIR from sysconfig: ${PYTHON_LIB_DIR}") # On macOS, we may need additional work to find the Python library -if(APPLE AND (NOT PYTHON_LIB_DIR OR "${PYTHON_LIB_DIR}" STREQUAL "")) +if(NOT PYTHON_LIB_DIR OR "${PYTHON_LIB_DIR}" STREQUAL "") message(STATUS "LIBDIR is None or empty, trying alternative methods") # Get Python executable path From 0921f81965b5e8305caf23a0c4352b3c415f262e Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Mon, 2 Jun 2025 20:10:38 +0530 Subject: [PATCH 26/32] fix python libs for python <3.13 --- mssql_python/pybind/CMakeLists.txt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/mssql_python/pybind/CMakeLists.txt b/mssql_python/pybind/CMakeLists.txt index c793ba65..fc7d913b 100644 --- a/mssql_python/pybind/CMakeLists.txt +++ b/mssql_python/pybind/CMakeLists.txt @@ -111,7 +111,7 @@ execute_process( message(STATUS "Python LIBDIR from sysconfig: ${PYTHON_LIB_DIR}") # On macOS, we may need additional work to find the Python library -if(NOT PYTHON_LIB_DIR OR "${PYTHON_LIB_DIR}" STREQUAL "") +if(APPLE AND (NOT PYTHON_LIB_DIR OR "${PYTHON_LIB_DIR}" STREQUAL "")) message(STATUS "LIBDIR is None or empty, trying alternative methods") # Get Python executable path @@ -154,8 +154,18 @@ if(NOT PYTHON_LIB_DIR OR "${PYTHON_LIB_DIR}" STREQUAL "") message(STATUS "Python library not found in standard locations, will try using framework") # When using a framework, we don't specify the library directly endif() +elseif(WIN32 AND (NOT PYTHON_LIB_DIR OR "${PYTHON_LIB_DIR}" STREQUAL "" OR "${PYTHON_LIB_DIR}" STREQUAL "None")) + # On Windows, if PYTHON_LIB_DIR is not set, we will try to find it using sysconfig + message(STATUS "PYTHON_LIB_DIR is None or empty for Windows, trying to find it using sysconfig") + execute_process( + COMMAND python -c "import sysconfig; print(sysconfig.get_config_var('LIBRARY'))" + OUTPUT_VARIABLE PYTHON_LIB_DIR + OUTPUT_STRIP_TRAILING_WHITESPACE + ) endif() +message(STATUS "Final Python library directory: ${PYTHON_LIB_DIR}") + # Determine which source file to use based on platform if(APPLE) set(DDBC_SOURCE "ddbc_bindings_mac.cpp") From 8061b1435b7db745a9b2463f036435681cff1cd2 Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Mon, 2 Jun 2025 20:17:30 +0530 Subject: [PATCH 27/32] fix python libs for python <3.13 --- mssql_python/pybind/CMakeLists.txt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/mssql_python/pybind/CMakeLists.txt b/mssql_python/pybind/CMakeLists.txt index fc7d913b..8b91c9c7 100644 --- a/mssql_python/pybind/CMakeLists.txt +++ b/mssql_python/pybind/CMakeLists.txt @@ -157,11 +157,16 @@ if(APPLE AND (NOT PYTHON_LIB_DIR OR "${PYTHON_LIB_DIR}" STREQUAL "")) elseif(WIN32 AND (NOT PYTHON_LIB_DIR OR "${PYTHON_LIB_DIR}" STREQUAL "" OR "${PYTHON_LIB_DIR}" STREQUAL "None")) # On Windows, if PYTHON_LIB_DIR is not set, we will try to find it using sysconfig message(STATUS "PYTHON_LIB_DIR is None or empty for Windows, trying to find it using sysconfig") + # Use Python Executable to find the library directory execute_process( - COMMAND python -c "import sysconfig; print(sysconfig.get_config_var('LIBRARY'))" - OUTPUT_VARIABLE PYTHON_LIB_DIR + COMMAND python -c "import sys, os; print(os.path.dirname(sys.executable))"Add commentMore actions + OUTPUT_VARIABLE PYTHON_EXEC_DIR OUTPUT_STRIP_TRAILING_WHITESPACE ) + message(STATUS "Python executable directory: ${PYTHON_EXEC_DIR}") + # Set the library directory based on the executable directory + set(PYTHON_LIB_DIR "${PYTHON_EXEC_DIR}/libs") + message(STATUS "Using Python library directory: ${PYTHON_LIB_DIR}") endif() message(STATUS "Final Python library directory: ${PYTHON_LIB_DIR}") From 58c57d51c00789679cb20fa20fa1742d998c37b9 Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Mon, 2 Jun 2025 20:18:09 +0530 Subject: [PATCH 28/32] fix python libs for python <3.13 --- mssql_python/pybind/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mssql_python/pybind/CMakeLists.txt b/mssql_python/pybind/CMakeLists.txt index 8b91c9c7..a6b40346 100644 --- a/mssql_python/pybind/CMakeLists.txt +++ b/mssql_python/pybind/CMakeLists.txt @@ -159,7 +159,7 @@ elseif(WIN32 AND (NOT PYTHON_LIB_DIR OR "${PYTHON_LIB_DIR}" STREQUAL "" OR "${PY message(STATUS "PYTHON_LIB_DIR is None or empty for Windows, trying to find it using sysconfig") # Use Python Executable to find the library directory execute_process( - COMMAND python -c "import sys, os; print(os.path.dirname(sys.executable))"Add commentMore actions + COMMAND python -c "import sys, os; print(os.path.dirname(sys.executable))" OUTPUT_VARIABLE PYTHON_EXEC_DIR OUTPUT_STRIP_TRAILING_WHITESPACE ) From 71e22d23d0a182e6255b3a632199c7fc08684abe Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Mon, 2 Jun 2025 20:23:50 +0530 Subject: [PATCH 29/32] fix python lib path for arm64 --- mssql_python/pybind/CMakeLists.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mssql_python/pybind/CMakeLists.txt b/mssql_python/pybind/CMakeLists.txt index a6b40346..379e3997 100644 --- a/mssql_python/pybind/CMakeLists.txt +++ b/mssql_python/pybind/CMakeLists.txt @@ -102,6 +102,7 @@ else() message(STATUS "Auto-detected pybind11 include directory: ${PYBIND11_INCLUDE_DIR}") endif() + # Find Python Library for linking execute_process( COMMAND python -c "import sysconfig; print(sysconfig.get_config_var('LIBDIR'))" @@ -169,6 +170,12 @@ elseif(WIN32 AND (NOT PYTHON_LIB_DIR OR "${PYTHON_LIB_DIR}" STREQUAL "" OR "${PY message(STATUS "Using Python library directory: ${PYTHON_LIB_DIR}") endif() +if(DEFINED ENV{CUSTOM_PYTHON_LIB_DIR} AND NOT "$ENV{CUSTOM_PYTHON_LIB_DIR}" STREQUAL "" AND NOT "$ENV{CUSTOM_PYTHON_LIB_DIR}" STREQUAL "None")Add commentMore actions + message(STATUS "CUSTOM_PYTHON_LIB_DIR is set, using it") + set(PYTHON_LIB_DIR $ENV{CUSTOM_PYTHON_LIB_DIR}) + message(STATUS "Using custom Python library directory: ${PYTHON_LIB_DIR}") +endif() + message(STATUS "Final Python library directory: ${PYTHON_LIB_DIR}") # Determine which source file to use based on platform From 4b548b247cc8abf35af5501a02c57862896aa1f6 Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Mon, 2 Jun 2025 20:26:46 +0530 Subject: [PATCH 30/32] fix python lib path for arm64 --- mssql_python/pybind/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mssql_python/pybind/CMakeLists.txt b/mssql_python/pybind/CMakeLists.txt index 379e3997..8d42a560 100644 --- a/mssql_python/pybind/CMakeLists.txt +++ b/mssql_python/pybind/CMakeLists.txt @@ -170,7 +170,7 @@ elseif(WIN32 AND (NOT PYTHON_LIB_DIR OR "${PYTHON_LIB_DIR}" STREQUAL "" OR "${PY message(STATUS "Using Python library directory: ${PYTHON_LIB_DIR}") endif() -if(DEFINED ENV{CUSTOM_PYTHON_LIB_DIR} AND NOT "$ENV{CUSTOM_PYTHON_LIB_DIR}" STREQUAL "" AND NOT "$ENV{CUSTOM_PYTHON_LIB_DIR}" STREQUAL "None")Add commentMore actions +if(DEFINED ENV{CUSTOM_PYTHON_LIB_DIR} AND NOT "$ENV{CUSTOM_PYTHON_LIB_DIR}" STREQUAL "" AND NOT "$ENV{CUSTOM_PYTHON_LIB_DIR}" STREQUAL "None") message(STATUS "CUSTOM_PYTHON_LIB_DIR is set, using it") set(PYTHON_LIB_DIR $ENV{CUSTOM_PYTHON_LIB_DIR}) message(STATUS "Using custom Python library directory: ${PYTHON_LIB_DIR}") From 3ea7ccc09def1669be22999bd193754773cc9a19 Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Mon, 2 Jun 2025 23:13:16 +0530 Subject: [PATCH 31/32] case insensitive search for conn str --- mssql_python/pybind/ddbc_bindings_mac.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/mssql_python/pybind/ddbc_bindings_mac.cpp b/mssql_python/pybind/ddbc_bindings_mac.cpp index 094c6206..9ce5409f 100644 --- a/mssql_python/pybind/ddbc_bindings_mac.cpp +++ b/mssql_python/pybind/ddbc_bindings_mac.cpp @@ -1083,8 +1083,14 @@ ErrorInfo SQLCheckError_Wrap(SQLSMALLINT handleType, intptr_t handle, SQLRETURN std::wstring SanitizeConnectionString(const std::wstring& connectionString) { // This function will remove the UID and Pwd parameters for security reasons std::wstring sanitizedString = connectionString; - // Remove UID and Pwd parameters - size_t uidPos = sanitizedString.find(L"UID="); + std::wstring lowerCaseString = sanitizedString; + // Convert the string to lowercase for case-insensitive search + // Using lowerCaseString to avoid modifying the original string + // This is necessary because towlower works on wide characters + std::transform(lowerCaseString.begin(), lowerCaseString.end(), lowerCaseString.begin(), + ::towlower); + // Can be UID or uid or UID, test only on lowercase uid + size_t uidPos = lowerCaseString.find(L"uid="); if (uidPos != std::wstring::npos) { size_t endPos = sanitizedString.find(L';', uidPos); if (endPos != std::wstring::npos) { @@ -1093,7 +1099,8 @@ std::wstring SanitizeConnectionString(const std::wstring& connectionString) { sanitizedString.erase(uidPos); } } - size_t pwdPos = sanitizedString.find(L"Pwd="); + // Can be Pwd or pwd or PWD, test only on lowercase pwd + size_t pwdPos = lowerCaseString.find(L"pwd="); if (pwdPos != std::wstring::npos) { size_t endPos = sanitizedString.find(L';', pwdPos); if (endPos != std::wstring::npos) { From 179bbd71005a88ce2910c1502b114e1419a0bc34 Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Mon, 2 Jun 2025 23:16:36 +0530 Subject: [PATCH 32/32] case insensitive search for conn str --- mssql_python/pybind/ddbc_bindings_mac.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mssql_python/pybind/ddbc_bindings_mac.cpp b/mssql_python/pybind/ddbc_bindings_mac.cpp index 9ce5409f..85b39001 100644 --- a/mssql_python/pybind/ddbc_bindings_mac.cpp +++ b/mssql_python/pybind/ddbc_bindings_mac.cpp @@ -1095,8 +1095,10 @@ std::wstring SanitizeConnectionString(const std::wstring& connectionString) { size_t endPos = sanitizedString.find(L';', uidPos); if (endPos != std::wstring::npos) { sanitizedString.erase(uidPos, endPos - uidPos + 1); + lowerCaseString.erase(uidPos, endPos - uidPos + 1); } else { sanitizedString.erase(uidPos); + lowerCaseString.erase(uidPos); } } // Can be Pwd or pwd or PWD, test only on lowercase pwd @@ -1105,8 +1107,10 @@ std::wstring SanitizeConnectionString(const std::wstring& connectionString) { size_t endPos = sanitizedString.find(L';', pwdPos); if (endPos != std::wstring::npos) { sanitizedString.erase(pwdPos, endPos - pwdPos + 1); + lowerCaseString.erase(pwdPos, endPos - pwdPos + 1); } else { sanitizedString.erase(pwdPos); + lowerCaseString.erase(pwdPos); } } return sanitizedString;

>kgs+1avh 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�`wXqVzIVLa23P1u8BL~ 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 z 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%0At$C7cZi=ZcyK+|J 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