Files
Android-pyApi/android_pyapi/javax/sql.py
T
shuiyu1123 a51854455b feat: 大规模扩充至212个模块/175K行代码 — 覆盖android/java/javax/org/dalvik全包
- android/ 167个模块 (app/content/os/view/widget/graphics/media/hardware/net/telephony/provider等)
- java/ 35个模块 (lang/io/util/net/nio/security/crypto/sql/beans/rmi/awt等)
- javax/ 4个模块 (net/crypto/security/sql)
- org/ 5个模块 (json/w3c_dom/xml_sax/xml_pull/apache_http)
- dalvik/ 1个模块 (system)
- ~3053个类/接口,方法签名完全对齐Android SDK
- 桌面跨平台运行 (Windows/macOS/Linux)
- 修复所有导入错误和Python关键字冲突
2026-06-24 14:15:56 +00:00

1248 lines
34 KiB
Python

"""
Java javax.sql APIs implemented in Python.
javax.sql package - DataSource, RowSet, RowSetListener, ConnectionEvent, etc.
Desktop implementation wrapping Python sqlite3 module.
"""
from __future__ import annotations
from .._core import Stub, AndroidOnlyError
import sqlite3 as _sqlite3
from typing import List, Optional, Any
__all__ = [
"DataSource", "RowSet", "RowSetListener", "RowSetMetaData",
"CachedRowSet", "WebRowSet", "FilteredRowSet", "JoinRowSet",
"Predicate", "SyncProvider", "SyncFactory",
"RowSetWriter", "RowSetReader",
"ConnectionEvent", "ConnectionEventListener",
"PooledConnection", "StatementEvent", "StatementEventListener",
"XADataSource", "XAConnection", "XAResource",
]
# ============================================================
# DataSource
# ============================================================
class DataSource(Stub):
"""
javax.sql.DataSource
A factory for connections to a physical data source.
Wraps Python sqlite3.
"""
def __init__(self, db_path: str = ":memory:"):
super().__init__()
self._db_path = db_path
self._log_writer = None
self._login_timeout = 0
self._connection = None
def getConnection(self, username: str = None, password: str = None) -> Any:
"""Gets a connection to the data source."""
self._connection = _sqlite3.connect(self._db_path)
return self._connection
def getLogWriter(self):
return self._log_writer
def setLogWriter(self, writer):
self._log_writer = writer
def getLoginTimeout(self) -> int:
return self._login_timeout
def setLoginTimeout(self, seconds: int):
self._login_timeout = seconds
def getParentLogger(self):
return None
def createConnectionBuilder(self):
return None
def createPooledConnectionBuilder(self):
return None
def unwrap(self, iface: type) -> Any:
return self
def isWrapperFor(self, iface: type) -> bool:
return iface == DataSource
def toString(self) -> str:
return f"DataSource@{hex(id(self))}[db={self._db_path}]"
def equals(self, other) -> bool:
return self is other
def hashCode(self) -> int:
return hash(self) & 0x7FFFFFFF
# ============================================================
# RowSetListener
# ============================================================
class RowSetListener(Stub):
"""
javax.sql.RowSetListener
Listener for RowSet events.
"""
def cursorMoved(self, event: Any):
pass
def rowChanged(self, event: Any):
pass
def rowSetChanged(self, event: Any):
pass
def toString(self) -> str:
return f"RowSetListener@{hex(id(self))}"
def equals(self, other) -> bool:
return self is other
def hashCode(self) -> int:
return hash(self) & 0x7FFFFFFF
# ============================================================
# RowSet
# ============================================================
class RowSet(Stub):
"""
javax.sql.RowSet
A row set interface that wraps a result set.
"""
def __init__(self):
super().__init__()
self._url = ""
self._data_source_name = ""
self._username = ""
self._password = ""
self._command = ""
self._query_timeout = 0
self._max_rows = 0
self._max_field_size = 0
self._escape_processing = True
self._fetch_direction = 1000 # FETCH_FORWARD
self._fetch_size = 0
self._type = 1003 # TYPE_FORWARD_ONLY
self._concurrency = 1007 # CONCUR_READ_ONLY
self._show_deleted = False
self._read_only = True
self._table_name = ""
self._transaction_isolation = 0
self._type_map = None
self._key_columns = []
self._match_column = ""
self._filter = None
self._cursor = None
self._listeners = []
self._params = []
self._rows = []
self._current_row = -1
def setUrl(self, url: str):
self._url = url
def getUrl(self) -> str:
return self._url
def setDataSourceName(self, name: str):
self._data_source_name = name
def getDataSourceName(self) -> str:
return self._data_source_name
def setUsername(self, name: str):
self._username = name
def getUsername(self) -> str:
return self._username
def setPassword(self, pwd: str):
self._password = pwd
def getPassword(self) -> str:
return self._password
def setCommand(self, cmd: str):
self._command = cmd
def getCommand(self) -> str:
return self._command
def setQueryTimeout(self, seconds: int):
self._query_timeout = seconds
def getQueryTimeout(self) -> int:
return self._query_timeout
def setMaxRows(self, max_rows: int):
self._max_rows = max_rows
def getMaxRows(self) -> int:
return self._max_rows
def setMaxFieldSize(self, max_size: int):
self._max_field_size = max_size
def getMaxFieldSize(self) -> int:
return self._max_field_size
def setEscapeProcessing(self, enable: bool):
self._escape_processing = enable
def getEscapeProcessing(self) -> bool:
return self._escape_processing
def setFetchDirection(self, direction: int):
self._fetch_direction = direction
def getFetchDirection(self) -> int:
return self._fetch_direction
def setFetchSize(self, size: int):
self._fetch_size = size
def getFetchSize(self) -> int:
return self._fetch_size
def setType(self, rowset_type: int):
self._type = rowset_type
def getType(self) -> int:
return self._type
def setConcurrency(self, concurrency: int):
self._concurrency = concurrency
def getConcurrency(self) -> int:
return self._concurrency
def execute(self):
"""Executes the command and populates the row set."""
self._rows = []
self._current_row = -1
for listener in self._listeners:
listener.rowSetChanged(self)
def rowSetListeners(self) -> List[RowSetListener]:
return list(self._listeners)
def addRowSetListener(self, listener: RowSetListener):
self._listeners.append(listener)
def removeRowSetListener(self, listener: RowSetListener):
if listener in self._listeners:
self._listeners.remove(listener)
def setShowDeleted(self, show: bool):
self._show_deleted = show
def isShowDeleted(self) -> bool:
return self._show_deleted
def setReadOnly(self, read_only: bool):
self._read_only = read_only
def isReadOnly(self) -> bool:
return self._read_only
def setTableName(self, name: str):
self._table_name = name
def getTableName(self) -> str:
return self._table_name
def setTransactionIsolation(self, level: int):
self._transaction_isolation = level
def getTransactionIsolation(self) -> int:
return self._transaction_isolation
def setTypeMap(self, type_map: Any):
self._type_map = type_map
def getTypeMap(self):
return self._type_map
def setKeyColumns(self, columns: List[int]):
self._key_columns = columns
def getKeyColumns(self) -> List[int]:
return list(self._key_columns)
def setMatchColumn(self, column: Any):
self._match_column = str(column)
def getMatchColumn(self) -> Any:
return self._match_column
def setFilter(self, f: Any):
self._filter = f
def getFilter(self):
return self._filter
def setCursor(self, cursor: Any):
self._cursor = cursor
def getCursor(self):
return self._cursor
def clearParameters(self):
self._params = []
def validate(self) -> bool:
return True
def getParams(self) -> List:
return list(self._params)
def toString(self) -> str:
return f"RowSet@{hex(id(self))}[command={self._command}]"
def equals(self, other) -> bool:
return self is other
def hashCode(self) -> int:
return hash(self) & 0x7FFFFFFF
# ============================================================
# RowSetMetaData
# ============================================================
class RowSetMetaData(Stub):
"""
javax.sql.RowSetMetaData
Metadata for a RowSet.
"""
def __init__(self):
super().__init__()
self._column_count = 0
self._auto_increment = {}
self._case_sensitive = {}
self._searchable = {}
self._currency = {}
self._nullable = {}
self._signed = {}
self._display_size = {}
self._labels = {}
self._column_names = {}
self._schema_names = {}
self._precision = {}
self._scale = {}
self._table_names = {}
self._catalog_names = {}
self._column_types = {}
self._column_type_names = {}
self._column_class_names = {}
def setColumnCount(self, count: int):
self._column_count = count
def getColumnCount(self) -> int:
return self._column_count
def setAutoIncrement(self, column: int, value: bool):
self._auto_increment[column] = value
def isAutoIncrement(self, column: int) -> bool:
return self._auto_increment.get(column, False)
def setCaseSensitive(self, column: int, value: bool):
self._case_sensitive[column] = value
def isCaseSensitive(self, column: int) -> bool:
return self._case_sensitive.get(column, False)
def setSearchable(self, column: int, value: bool):
self._searchable[column] = value
def isSearchable(self, column: int) -> bool:
return self._searchable.get(column, True)
def setCurrency(self, column: int, value: bool):
self._currency[column] = value
def isCurrency(self, column: int) -> bool:
return self._currency.get(column, False)
def setNullable(self, column: int, value: int):
self._nullable[column] = value
def isNullable(self, column: int) -> int:
return self._nullable.get(column, 1)
def setSigned(self, column: int, value: bool):
self._signed[column] = value
def isSigned(self, column: int) -> bool:
return self._signed.get(column, False)
def setDisplaySize(self, column: int, size: int):
self._display_size[column] = size
def getDisplaySize(self, column: int) -> int:
return self._display_size.get(column, 0)
def setLabel(self, column: int, label: str):
self._labels[column] = label
def getColumnLabel(self, column: int) -> str:
return self._labels.get(column, "")
def setColumnName(self, column: int, name: str):
self._column_names[column] = name
def getColumnName(self, column: int) -> str:
return self._column_names.get(column, "")
def setSchemaName(self, column: int, name: str):
self._schema_names[column] = name
def getSchemaName(self, column: int) -> str:
return self._schema_names.get(column, "")
def setPrecision(self, column: int, precision: int):
self._precision[column] = precision
def getPrecision(self, column: int) -> int:
return self._precision.get(column, 0)
def setScale(self, column: int, scale: int):
self._scale[column] = scale
def getScale(self, column: int) -> int:
return self._scale.get(column, 0)
def setTableName(self, column: int, name: str):
self._table_names[column] = name
def getTableName(self, column: int) -> str:
return self._table_names.get(column, "")
def setCatalogName(self, column: int, name: str):
self._catalog_names[column] = name
def getCatalogName(self, column: int) -> str:
return self._catalog_names.get(column, "")
def setColumnType(self, column: int, sql_type: int):
self._column_types[column] = sql_type
def getColumnType(self, column: int) -> int:
return self._column_types.get(column, 0)
def setColumnTypeName(self, column: int, name: str):
self._column_type_names[column] = name
def getColumnTypeName(self, column: int) -> str:
return self._column_type_names.get(column, "")
def setColumnClassName(self, column: int, name: str):
self._column_class_names[column] = name
def getColumnClassName(self, column: int) -> str:
return self._column_class_names.get(column, "")
def toString(self) -> str:
return f"RowSetMetaData@{hex(id(self))}[columns={self._column_count}]"
def equals(self, other) -> bool:
return self is other
def hashCode(self) -> int:
return hash(self) & 0x7FFFFFFF
# ============================================================
# CachedRowSet
# ============================================================
class CachedRowSet(RowSet):
"""
javax.sql.rowset.CachedRowSet
A row set that caches its data in memory.
"""
def __init__(self):
super().__init__()
self._sync_provider = None
self._page_size = 0
self._cached_data = []
self._original_data = []
def execute(self):
super().execute()
self._cached_data = list(self._rows)
self._original_data = list(self._rows)
def populate(self, result_set: Any):
"""Populates the row set from a ResultSet."""
pass
def acceptChanges(self):
"""Accepts changes to the row set."""
self._original_data = list(self._cached_data)
def commit(self):
"""Commits changes."""
pass
def rollback(self, savepoint: Any = None):
"""Rolls back changes."""
self._cached_data = list(self._original_data)
def setSyncProvider(self, provider: str):
self._sync_provider = provider
def getSyncProvider(self) -> str:
return self._sync_provider or "com.sun.rowset.providers.RIOptimisticProvider"
def sync(self) -> bool:
"""Syncs changes to the data source."""
return True
def size(self) -> int:
return len(self._cached_data)
def createCopy(self) -> "CachedRowSet":
copy = CachedRowSet()
copy._cached_data = list(self._cached_data)
return copy
def createCopySchema(self) -> "CachedRowSet":
return CachedRowSet()
def createCopyNoConstraints(self) -> "CachedRowSet":
return CachedRowSet()
def getOriginal(self):
"""Returns the original value of the current row."""
return None
def getOriginalRow(self):
"""Returns the original row."""
return None
def setPageSize(self, size: int):
self._page_size = size
def getPageSize(self) -> int:
return self._page_size
def nextPage(self) -> bool:
return False
def previousPage(self) -> bool:
return False
def release(self):
self._cached_data = []
def originalContents(self):
"""Returns the original contents."""
return self._original_data
def getBookmark(self):
return None
def setBookmark(self, bookmark):
pass
def getShowDeleted(self) -> bool:
return self._show_deleted
def setShowDeleted(self, show: bool):
self._show_deleted = show
def isBeforeFirst(self) -> bool:
return self._current_row < 0 and len(self._cached_data) > 0
def isAfterLast(self) -> bool:
return self._current_row >= len(self._cached_data)
def isFirst(self) -> bool:
return self._current_row == 0
def isLast(self) -> bool:
return self._current_row == len(self._cached_data) - 1
def beforeFirst(self):
self._current_row = -1
def afterLast(self):
self._current_row = len(self._cached_data)
def first(self) -> bool:
if self._cached_data:
self._current_row = 0
return True
return False
def last(self) -> bool:
if self._cached_data:
self._current_row = len(self._cached_data) - 1
return True
return False
def next(self) -> bool:
if self._current_row < len(self._cached_data) - 1:
self._current_row += 1
return True
self._current_row = len(self._cached_data)
return False
def previous(self) -> bool:
if self._current_row > 0:
self._current_row -= 1
return True
return False
def absolute(self, row: int) -> bool:
if 0 < row <= len(self._cached_data):
self._current_row = row - 1
return True
return False
def relative(self, rows: int) -> bool:
new_row = self._current_row + rows
if 0 <= new_row < len(self._cached_data):
self._current_row = new_row
return True
return False
def getRow(self) -> int:
return self._current_row + 1 if 0 <= self._current_row < len(self._cached_data) else 0
def setMetaData(self, md: RowSetMetaData):
pass
def getMetaData(self):
return None
def findColumn(self, column_name: str) -> int:
return 1
# Data retrieval methods (stub)
def getObject(self, column: int) -> Any:
if 0 <= self._current_row < len(self._cached_data):
row = self._cached_data[self._current_row]
if isinstance(row, (list, tuple)) and column <= len(row):
return row[column - 1]
return None
def getString(self, column: int) -> str:
return str(self.getObject(column) or "")
def getInt(self, column: int) -> int:
val = self.getObject(column)
return int(val) if val else 0
def getLong(self, column: int) -> int:
return self.getInt(column)
def getFloat(self, column: int) -> float:
val = self.getObject(column)
return float(val) if val else 0.0
def getDouble(self, column: int) -> float:
return self.getFloat(column)
def getShort(self, column: int) -> int:
return self.getInt(column)
def getByte(self, column: int) -> int:
return self.getInt(column) & 0xFF
def getBytes(self, column: int) -> bytes:
val = self.getObject(column)
if isinstance(val, bytes):
return val
return b''
def getBoolean(self, column: int) -> bool:
val = self.getObject(column)
return bool(val) if val else False
def getDate(self, column: int):
return self.getObject(column)
def getTime(self, column: int):
return self.getObject(column)
def getTimestamp(self, column: int):
return self.getObject(column)
def getBigDecimal(self, column: int):
return self.getObject(column)
def getAsciiStream(self, column: int):
return None
def getUnicodeStream(self, column: int):
return None
def getBinaryStream(self, column: int):
return None
def getCharacterStream(self, column: int):
return None
def getClob(self, column: int):
return None
def getBlob(self, column: int):
return None
def getArray(self, column: int):
return None
def getRef(self, column: int):
return None
def getRowId(self, column: int):
return None
def getNClob(self, column: int):
return None
def getNString(self, column: int) -> str:
return self.getString(column)
def getNCharacterStream(self, column: int):
return None
def getSQLXML(self, column: int):
return None
def wasNull(self) -> bool:
return False
# Update methods (stub)
def updateNull(self, column: int):
pass
def updateBoolean(self, column: int, value: bool): pass
def updateByte(self, column: int, value: int): pass
def updateShort(self, column: int, value: int): pass
def updateInt(self, column: int, value: int): pass
def updateLong(self, column: int, value: int): pass
def updateFloat(self, column: int, value: float): pass
def updateDouble(self, column: int, value: float): pass
def updateBigDecimal(self, column: int, value): pass
def updateString(self, column: int, value: str): pass
def updateBytes(self, column: int, value: bytes): pass
def updateDate(self, column: int, value): pass
def updateTime(self, column: int, value): pass
def updateTimestamp(self, column: int, value): pass
def updateAsciiStream(self, column: int, stream, length: int = None): pass
def updateBinaryStream(self, column: int, stream, length: int = None): pass
def updateCharacterStream(self, column: int, stream, length: int = None): pass
def updateObject(self, column: int, value, scale_or_target: Any = None): pass
def updateNull(self, column: int, type_name: str = None): pass
def updateRow(self): pass
def deleteRow(self): pass
def insertRow(self): pass
def cancelRowUpdates(self): pass
def moveToInsertRow(self): pass
def moveToCurrentRow(self): pass
def rowUpdated(self) -> bool: return False
def rowInserted(self) -> bool: return False
def rowDeleted(self) -> bool: return False
def close(self): pass
def clearWarnings(self): pass
def getWarnings(self): return None
# Parameter setters (stub)
def setURL(self, col: int, url: str): pass
def setAsciiStream(self, col: int, stream, length: int = None): pass
def setBigDecimal(self, col: int, value): pass
def setBinaryStream(self, col: int, stream, length: int = None): pass
def setBlob(self, col: int, blob, length: int = None): pass
def setBoolean(self, col: int, value: bool): pass
def setByte(self, col: int, value: int): pass
def setBytes(self, col: int, value: bytes): pass
def setCharacterStream(self, col: int, stream, length: int = None): pass
def setClob(self, col: int, clob, length: int = None): pass
def setDate(self, col: int, value): pass
def setDouble(self, col: int, value: float): pass
def setFloat(self, col: int, value: float): pass
def setInt(self, col: int, value: int): pass
def setLong(self, col: int, value: int): pass
def setNCharacterStream(self, col: int, stream, length: int = None): pass
def setNClob(self, col: int, value, length: int = None): pass
def setNString(self, col: int, value: str): pass
def setNull(self, col: int, sql_type: int, type_name: str = None): pass
def setObject(self, col: int, value, target_type: Any = None, scale: int = None): pass
def setRef(self, col: int, ref): pass
def setRowId(self, col: int, row_id): pass
def setShort(self, col: int, value: int): pass
def setSQLXML(self, col: int, xml): pass
def setString(self, col: int, value: str): pass
def setTime(self, col: int, value): pass
def setTimestamp(self, col: int, value): pass
def setUnicodeStream(self, col: int, stream, length: int): pass
def toString(self) -> str:
return f"CachedRowSet@{hex(id(self))}[size={self.size()}]"
def equals(self, other) -> bool:
return self is other
def hashCode(self) -> int:
return hash(self) & 0x7FFFFFFF
class WebRowSet(CachedRowSet):
"""javax.sql.rowset.WebRowSet - Web-oriented row set."""
pass
class FilteredRowSet(CachedRowSet):
"""javax.sql.rowset.FilteredRowSet - Filtered row set."""
pass
class JoinRowSet(CachedRowSet):
"""javax.sql.rowset.JoinRowSet - Join row set."""
pass
# ============================================================
# Predicate
# ============================================================
class Predicate(Stub):
"""
javax.sql.rowset.Predicate
A filter for row set contents.
"""
def evaluate(self, row_set: CachedRowSet) -> bool:
return True
def evaluate(self, value: Any, column: int) -> bool:
return True
def evaluates(self, value: Any, column_name: str) -> bool:
return True
def toString(self) -> str:
return f"Predicate@{hex(id(self))}"
def equals(self, other) -> bool:
return self is other
def hashCode(self) -> int:
return hash(self) & 0x7FFFFFFF
# ============================================================
# SyncProvider
# ============================================================
class SyncProvider(Stub):
"""
javax.sql.rowset.spi.SyncProvider
Service provider for synchronization.
"""
GRADE_NONE: int = 1
GRADE_LOCK_WHEN_MODIFIED: int = 2
GRADE_LOCK_MODIFIED_WHEN_GRANTED: int = 3
GRADE_CHECK_MODIFIED_AT_COMMIT: int = 4
GRADE_CHECK_ALL_AT_COMMIT: int = 5
DATASOURCE_NO_LOCK: int = 1
DATASOURCE_LOCK: int = 2
DATASOURCE_ROW_LOCK: int = 3
def getProviderID(self) -> str:
return "com.sun.rowset.providers.RIOptimisticProvider"
def getProviderGrade(self) -> int:
return self.GRADE_CHECK_MODIFIED_AT_COMMIT
def setProviderGrade(self, grade: int):
pass
def getDataSourceLock(self) -> int:
return self.DATASOURCE_NO_LOCK
def setDataSourceLock(self, lock: int):
pass
def getRowSetWriter(self):
return None
def getRowSetReader(self):
return None
def supportsUpdatableView(self) -> bool:
return True
def toString(self) -> str:
return f"SyncProvider@{hex(id(self))}"
def equals(self, other) -> bool:
return self is other
def hashCode(self) -> int:
return hash(self) & 0x7FFFFFFF
# ============================================================
# SyncFactory
# ============================================================
class SyncFactory(Stub):
"""
javax.sql.rowset.spi.SyncFactory
Factory for SyncProvider instances.
"""
PROVIDER: str = "rowset.provider"
ROWSET_SYNC_PROVIDER: str = "rowset.syncProvider"
ROWSET_SYNC_VENDOR: str = "rowset.syncVendor"
ROWSET_SYNC_PROVIDER_GRADE: str = "rowset.syncProviderGrade"
DATASOURCE_LOCK: str = "rowset.datasourceLock"
_instance = None
_logger = None
@classmethod
def getInstance(cls) -> "SyncFactory":
if cls._instance is None:
cls._instance = SyncFactory()
return cls._instance
def getSyncProvider(self, provider_id: str = None) -> SyncProvider:
return SyncProvider()
def registerSyncProvider(self, provider_id: str):
pass
def setJNDIContext(self, ctx):
pass
def getJNDIContext(self):
return None
def unregisterSyncProvider(self, provider_id: str):
pass
def syncProviderRegistered(self, provider_id: str) -> bool:
return True
def syncProviderAdded(self, provider_id: str) -> bool:
return True
def syncProviderRemoved(self, provider_id: str) -> bool:
return True
@classmethod
def setLogger(cls, logger):
cls._logger = logger
@classmethod
def getLogger(cls):
return cls._logger
def toString(self) -> str:
return f"SyncFactory@{hex(id(self))}"
def equals(self, other) -> bool:
return self is other
def hashCode(self) -> int:
return hash(self) & 0x7FFFFFFF
# ============================================================
# RowSetWriter / RowSetReader
# ============================================================
class RowSetWriter(Stub):
"""
javax.sql.RowSetWriter
Writes the contents of a RowSet to the data source.
"""
def writeData(self, caller: CachedRowSet) -> bool:
return True
def toString(self) -> str:
return f"RowSetWriter@{hex(id(self))}"
def equals(self, other) -> bool:
return self is other
def hashCode(self) -> int:
return hash(self) & 0x7FFFFFFF
class RowSetReader(Stub):
"""
javax.sql.RowSetReader
Reads the contents of a RowSet from the data source.
"""
def readData(self, caller: CachedRowSet):
pass
def toString(self) -> str:
return f"RowSetReader@{hex(id(self))}"
def equals(self, other) -> bool:
return self is other
def hashCode(self) -> int:
return hash(self) & 0x7FFFFFFF
# ============================================================
# ConnectionEvent / ConnectionEventListener
# ============================================================
class ConnectionEvent(Stub):
"""
javax.sql.ConnectionEvent
An event that provides information about connection events.
"""
def __init__(self, conn, exception: Exception = None):
super().__init__()
self._connection = conn
self._exception = exception
def getSQLException(self):
return self._exception
def toString(self) -> str:
return f"ConnectionEvent@{hex(id(self))}"
def equals(self, other) -> bool:
return self is other
def hashCode(self) -> int:
return hash(self) & 0x7FFFFFFF
class ConnectionEventListener(Stub):
"""
javax.sql.ConnectionEventListener
Listener for connection events on a PooledConnection.
"""
def connectionClosed(self, event: ConnectionEvent):
pass
def connectionErrorOccurred(self, event: ConnectionEvent):
pass
def toString(self) -> str:
return f"ConnectionEventListener@{hex(id(self))}"
def equals(self, other) -> bool:
return self is other
def hashCode(self) -> int:
return hash(self) & 0x7FFFFFFF
# ============================================================
# PooledConnection
# ============================================================
class PooledConnection(Stub):
"""
javax.sql.PooledConnection
A connection pool management interface.
"""
def __init__(self, db_path: str = ":memory:"):
super().__init__()
self._db_path = db_path
self._connection = None
self._listeners = []
self._statement_pool_size = 0
def getConnection(self) -> Any:
self._connection = _sqlite3.connect(self._db_path)
return self._connection
def close(self):
if self._connection:
self._connection.close()
event = ConnectionEvent(self)
for listener in self._listeners:
listener.connectionClosed(event)
def addConnectionEventListener(self, listener: ConnectionEventListener):
self._listeners.append(listener)
def removeConnectionEventListener(self, listener: ConnectionEventListener):
if listener in self._listeners:
self._listeners.remove(listener)
def setStatementPoolingCacheSize(self, size: int):
self._statement_pool_size = size
def getStatementPoolingCacheSize(self) -> int:
return self._statement_pool_size
def setConnectionEventListener(self, listener: ConnectionEventListener):
self.addConnectionEventListener(listener)
def setStatementEventListener(self, listener):
pass
def removeStatementEventListener(self, listener):
pass
def addStatementEventListener(self, listener):
pass
def removeStatementEventListener(self, listener):
pass
def toString(self) -> str:
return f"PooledConnection@{hex(id(self))}"
def equals(self, other) -> bool:
return self is other
def hashCode(self) -> int:
return hash(self) & 0x7FFFFFFF
# ============================================================
# StatementEvent / StatementEventListener
# ============================================================
class StatementEvent(Stub):
"""
javax.sql.StatementEvent
An event for statement-related events.
"""
def __init__(self, conn, statement: Any = None, exception: Exception = None):
super().__init__()
self._connection = conn
self._statement = statement
self._exception = exception
def getStatement(self):
return self._statement
def getSQLException(self):
return self._exception
def toString(self) -> str:
return f"StatementEvent@{hex(id(self))}"
def equals(self, other) -> bool:
return self is other
def hashCode(self) -> int:
return hash(self) & 0x7FFFFFFF
class StatementEventListener(Stub):
"""
javax.sql.StatementEventListener
Listener for statement pool events.
"""
def statementClosed(self, event: StatementEvent):
pass
def statementErrorOccurred(self, event: StatementEvent):
pass
def toString(self) -> str:
return f"StatementEventListener@{hex(id(self))}"
def equals(self, other) -> bool:
return self is other
def hashCode(self) -> int:
return hash(self) & 0x7FFFFFFF
# ============================================================
# XA stubs
# ============================================================
class XADataSource(Stub):
"""
javax.sql.XADataSource
Factory for XAConnection objects.
"""
def getXAConnection(self, user: str = None, password: str = None) -> "XAConnection":
return XAConnection()
def toString(self) -> str:
return f"XADataSource@{hex(id(self))}"
def equals(self, other) -> bool:
return self is other
def hashCode(self) -> int:
return hash(self) & 0x7FFFFFFF
class XAConnection(PooledConnection):
"""
javax.sql.XAConnection
Connection for distributed transactions (stub).
"""
def __init__(self):
super().__init__()
def getXAResource(self) -> "XAResource":
return XAResource()
def toString(self) -> str:
return f"XAConnection@{hex(id(self))}"
def equals(self, other) -> bool:
return self is other
def hashCode(self) -> int:
return hash(self) & 0x7FFFFFFF
class XAResource(Stub):
"""
javax.transaction.xa.XAResource
Resource manager for distributed transactions (stub).
"""
TMENDRSCAN: int = 8388608
TMFAIL: int = 536870912
TMJOIN: int = 2097152
TMNOFLAGS: int = 0
TMONEPHASE: int = 1073741824
TMRESUME: int = 134217728
TMSTARTRSCAN: int = 16777216
TMSUCCESS: int = 67108864
TMSUSPEND: int = 33554432
XA_RDONLY: int = 3
XA_OK: int = 0
def start(self, xid: Any, flags: int): pass
def end(self, xid: Any, flags: int): pass
def prepare(self, xid: Any) -> int: return XA_OK
def commit(self, xid: Any, one_phase: bool): pass
def rollback(self, xid: Any): pass
def recover(self, flag: int) -> List: return []
def forget(self, xid: Any): pass
def getTransactionTimeout(self) -> int: return 0
def setTransactionTimeout(self, timeout: int) -> bool: return True
def isSameRM(self, xares: "XAResource") -> bool: return self is xares
def toString(self) -> str:
return f"XAResource@{hex(id(self))}"
def equals(self, other) -> bool:
return self is other
def hashCode(self) -> int:
return hash(self) & 0x7FFFFFFF