gbase8sdb 0.2.1__cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
gbase8sdb/__init__.py ADDED
@@ -0,0 +1,121 @@
1
+ # coding: utf-8
2
+ """
3
+ the package of gbase8sdb __init__ module
4
+ """
5
+
6
+ import sys
7
+ import collections
8
+
9
+ apilevel = "2.0"
10
+ paramstyle = "qmark"
11
+ threadsafety = 2
12
+
13
+ # version info
14
+ from .version import __version__
15
+ version = __version__
16
+
17
+ # import GSDK
18
+ # from . import driver, gsdk_driver
19
+ from . import driver
20
+
21
+ from .driver import (
22
+ DB_TYPE_BINARY_DOUBLE,
23
+ DB_TYPE_BINARY_FLOAT,
24
+ DB_TYPE_BINARY_INTEGER,
25
+ DB_TYPE_BLOB,
26
+ DB_TYPE_CHAR,
27
+ DB_TYPE_CLOB,
28
+ DB_TYPE_CURSOR,
29
+ DB_TYPE_DATE, # map to TIMESTAMP
30
+ DB_TYPE_INTERVAL_DS,
31
+ DB_TYPE_INTERVAL_YM,
32
+ DB_TYPE_LONG_NVARCHAR,
33
+ DB_TYPE_NCHAR,
34
+ DB_TYPE_NCLOB,
35
+ DB_TYPE_NUMBER,
36
+ DB_TYPE_NVARCHAR,
37
+ DB_TYPE_TIMESTAMP,
38
+ DB_TYPE_TIMESTAMP_TZ,
39
+ DB_TYPE_VARCHAR,
40
+ # DB API
41
+ BINARY,
42
+ DATETIME,
43
+ NUMBER,
44
+ ROWID,
45
+ STRING,
46
+ )
47
+
48
+
49
+ from .exceptions import (
50
+ Warning as Warning,
51
+ Error as Error,
52
+ DatabaseError as DatabaseError,
53
+ DataError as DataError,
54
+ IntegrityError as IntegrityError,
55
+ InterfaceError as InterfaceError,
56
+ InternalError as InternalError,
57
+ NotSupportedError as NotSupportedError,
58
+ OperationalError as OperationalError,
59
+ ProgrammingError as ProgrammingError,
60
+ )
61
+
62
+ from .defaults import defaults
63
+
64
+ from .connection import connect, Connection
65
+
66
+ from .cursor import Cursor
67
+
68
+ from .lob import LOB
69
+
70
+ from .column_metadata import ColumnMetaData
71
+
72
+ from .var import Var
73
+
74
+ from .dsn import makedsn
75
+
76
+ from .driver import load_gsdk as __load_gsdk, clientversion
77
+
78
+ from .constructors import (
79
+ Binary as Binary,
80
+ Date as Date,
81
+ DateFromTicks as DateFromTicks,
82
+ Time as Time,
83
+ TimeFromTicks as TimeFromTicks,
84
+ Timestamp as Timestamp,
85
+ TimestampFromTicks as TimestampFromTicks,
86
+ )
87
+
88
+
89
+ IntervalYM = collections.namedtuple("IntervalYM", ["years", "months"])
90
+
91
+
92
+ package = sys.modules[__name__]
93
+ driver.init_driver(package)
94
+
95
+
96
+ del package
97
+ del sys
98
+ del driver, connection, constructors
99
+ del cursor, dsn, exceptions, column_metadata
100
+ del lob
101
+ del var
102
+
103
+ __load_gsdk()
104
+
105
+
106
+ __all__ = [
107
+ # defined in DB API
108
+ "apilevel", "paramstyle", "threadsafety",
109
+ "BINARY", "DATETIME", "NUMBER", "ROWID", "STRING",
110
+ "Binary", "Date", "DateFromTicks", "Time", "TimeFromTicks", "Timestamp", "TimestampFromTicks",
111
+ "Warning", "Error", "DatabaseError", "DataError", "IntegrityError", "InterfaceError",
112
+ "InternalError", "NotSupportedError", "OperationalError", "ProgrammingError",
113
+ "connect", "Connection",
114
+ # not define in DB API
115
+ "DB_TYPE_BINARY_DOUBLE", "DB_TYPE_BINARY_FLOAT", "DB_TYPE_BINARY_INTEGER", "DB_TYPE_BLOB",
116
+ "DB_TYPE_CHAR", "DB_TYPE_CLOB", "DB_TYPE_CURSOR", "DB_TYPE_DATE", "DB_TYPE_INTERVAL_DS",
117
+ "DB_TYPE_INTERVAL_YM", "DB_TYPE_LONG_NVARCHAR", "DB_TYPE_NCHAR", "DB_TYPE_NCLOB",
118
+ "DB_TYPE_NUMBER", "DB_TYPE_NVARCHAR", "DB_TYPE_TIMESTAMP", "DB_TYPE_TIMESTAMP_TZ", "DB_TYPE_VARCHAR",
119
+ "ColumnMetaData", "Var", "makedsn", "clientversion", "IntervalYM",
120
+ "defaults", "Cursor", "LOB", "version"
121
+ ]
@@ -0,0 +1,121 @@
1
+ # coding: utf-8
2
+ from typing import Union
3
+
4
+ from . import __name__ as MODULE_NAME
5
+
6
+ from .driver import (
7
+ DbType,
8
+ DB_TYPE_NUMBER,
9
+ DB_TYPE_BINARY_INTEGER,
10
+ DB_TYPE_BINARY_DOUBLE,
11
+ DB_TYPE_BINARY_FLOAT,
12
+ DB_TYPE_TIMESTAMP_TZ,
13
+ DB_TYPE_TIMESTAMP_LTZ,
14
+ DB_TYPE_TIMESTAMP,
15
+ DB_TYPE_DATE,
16
+
17
+ )
18
+
19
+
20
+ class ColumnMetaData:
21
+
22
+ __module__ = MODULE_NAME
23
+
24
+
25
+ def __str__(self):
26
+ return str(tuple(self))
27
+
28
+ def __repr__(self):
29
+ return repr(tuple(self))
30
+
31
+
32
+ def __len__(self):
33
+ return 7
34
+
35
+
36
+ def __eq__(self, other):
37
+ return tuple(self) == other
38
+
39
+ def __getitem__(self, index):
40
+ description = (
41
+ self.name,
42
+ self.type_code,
43
+ self.display_size,
44
+ self.internal_size,
45
+ self.precision,
46
+ self.scale,
47
+ self.null_ok,
48
+ )
49
+ return description[index]
50
+
51
+ @classmethod
52
+ def _create_with_cyobj(cls, cyobj):
53
+ info = cls.__new__(cls)
54
+ info._type = None
55
+ info._cyobj = cyobj
56
+ return info
57
+
58
+ @staticmethod
59
+ def _is_date_type(dbtype):
60
+ return dbtype in {DB_TYPE_DATE, DB_TYPE_TIMESTAMP, DB_TYPE_TIMESTAMP_LTZ, DB_TYPE_TIMESTAMP_TZ}
61
+
62
+ @staticmethod
63
+ def _is_numeric_type(dbtype):
64
+ return dbtype in {DB_TYPE_BINARY_FLOAT, DB_TYPE_BINARY_DOUBLE, DB_TYPE_BINARY_INTEGER, DB_TYPE_NUMBER}
65
+
66
+ @property
67
+ def internal_size(self):
68
+ if self._cyobj.size > 0:
69
+ return self._cyobj.buffer_size
70
+
71
+ @property
72
+ def is_json(self):
73
+ return self._cyobj.is_json
74
+
75
+ @property
76
+ def name(self) -> str:
77
+ return self._cyobj.name
78
+
79
+
80
+
81
+ @property
82
+ def precision(self) -> Union[int, None]:
83
+ if self._cyobj.precision or self._cyobj.scale:
84
+ return self._cyobj.precision
85
+
86
+
87
+
88
+ @property
89
+ def type(self) -> DbType:
90
+ if self._type is None:
91
+ self._type = self._cyobj.dbtype
92
+ return self._type
93
+
94
+ @property
95
+ def type_code(self) -> DbType:
96
+ return self._cyobj.dbtype
97
+
98
+ @property
99
+ def display_size(self):
100
+ if self._cyobj.size > 0:
101
+ return self._cyobj.size
102
+ dbtype = self._cyobj.dbtype
103
+ if self._is_numeric_type(dbtype):
104
+ if self._cyobj.precision:
105
+ display_size = self._cyobj.precision + 1
106
+ if self._cyobj.scale > 0:
107
+ display_size += self._cyobj.scale + 1
108
+ else:
109
+ display_size = 127
110
+ return display_size
111
+ elif self._is_date_type(dbtype):
112
+ return 23
113
+
114
+ @property
115
+ def scale(self):
116
+ if self._cyobj.precision or self._cyobj.scale:
117
+ return self._cyobj.scale
118
+
119
+ @property
120
+ def null_ok(self):
121
+ return self._cyobj.nulls_allowed
@@ -0,0 +1,152 @@
1
+ # coding: utf-8
2
+
3
+ from . import __name__ as MODULE_NAME
4
+ from typing import Callable, Union
5
+ from . import errors
6
+ from . import driver
7
+ from .cursor import Cursor
8
+ from .lob import LOB
9
+ from .driver import DB_TYPE_BLOB, DB_TYPE_CLOB, DB_TYPE_NCLOB, DbType
10
+
11
+
12
+ class Connection:
13
+ __module__ = MODULE_NAME
14
+
15
+ def __init__(self, dsn: str, user: str, password: str) -> None:
16
+ self._cyobj = None
17
+ self._version = None
18
+ cy_conn = driver.CyConnection(dsn, user, password)
19
+ cy_conn.connect()
20
+ self._cyobj = cy_conn
21
+
22
+ def __repr__(self):
23
+ cls_name = f"{self.__class__.__module__}.{self.__class__.__qualname__}"
24
+ if self._cyobj is None:
25
+ return f"<{cls_name} disconnected>"
26
+ return f"<{cls_name} to {self.username}@{self.dsn}>"
27
+
28
+ def __del__(self):
29
+ if self._cyobj is not None:
30
+ self._cyobj.close(in_del=True)
31
+ self._cyobj = None
32
+
33
+ def __enter__(self):
34
+ self._verify_connected()
35
+ return self
36
+
37
+ def __exit__(self, exc_type, exc_value, exc_tb):
38
+ if self._cyobj is not None:
39
+ self._cyobj.close(in_del=True)
40
+ self._cyobj = None
41
+
42
+ def _verify_connected(self) -> None:
43
+ if self._cyobj is None:
44
+ errors.raise_error(errors.ERR_NOT_CONNECTED)
45
+
46
+ def close(self) -> None:
47
+ self._verify_connected()
48
+ self._cyobj.close()
49
+ self._cyobj = None
50
+
51
+ def commit(self) -> None:
52
+ self._verify_connected()
53
+ self._cyobj.commit()
54
+
55
+ def createlob(
56
+ self, lob_type: DbType, data: Union[str, bytes] = None
57
+ ) -> LOB:
58
+ self._verify_connected()
59
+ if lob_type not in (DB_TYPE_CLOB, DB_TYPE_NCLOB, DB_TYPE_BLOB):
60
+ message = (
61
+ "lob type should be one of gbase8sdb.DB_TYPE_BLOB, "
62
+ "gbase8sdb.DB_TYPE_CLOB or gbase8sdb.DB_TYPE_NCLOB"
63
+ )
64
+ raise TypeError(message)
65
+ impl = self._cyobj.create_temp_lob_impl(lob_type)
66
+ lob = LOB._create_with_cyobj(impl)
67
+ if data:
68
+ lob.write(data)
69
+ return lob
70
+
71
+ def cursor(self) -> Cursor:
72
+ self._verify_connected()
73
+ return Cursor(self)
74
+
75
+ def ping(self) -> None:
76
+ self._verify_connected()
77
+ self._cyobj.ping()
78
+
79
+ def rollback(self) -> None:
80
+ self._verify_connected()
81
+ self._cyobj.rollback()
82
+
83
+ def cancel(self) -> None:
84
+ self._verify_connected()
85
+ self._cyobj.cancel()
86
+
87
+ @property
88
+ def autocommit(self) -> bool:
89
+ self._verify_connected()
90
+ return self._cyobj.autocommit
91
+
92
+ @autocommit.setter
93
+ def autocommit(self, value: bool) -> None:
94
+ self._verify_connected()
95
+ self._cyobj.autocommit = value
96
+
97
+ @property
98
+ def dsn(self) -> str:
99
+ self._verify_connected()
100
+ return self._cyobj.dsn
101
+
102
+ @property
103
+ def inputtypehandler(self) -> Callable:
104
+ self._verify_connected()
105
+ return self._cyobj.inputtypehandler
106
+
107
+ @inputtypehandler.setter
108
+ def inputtypehandler(self, value: Callable) -> None:
109
+ self._verify_connected()
110
+ self._cyobj.inputtypehandler = value
111
+
112
+
113
+ @property
114
+ def outputtypehandler(self) -> Callable:
115
+ self._verify_connected()
116
+ return self._cyobj.outputtypehandler
117
+
118
+ @outputtypehandler.setter
119
+ def outputtypehandler(self, value: Callable) -> None:
120
+ self._verify_connected()
121
+ self._cyobj.outputtypehandler = value
122
+
123
+ @property
124
+ def transaction_in_progress(self) -> bool:
125
+ self._verify_connected()
126
+ return self._cyobj.get_transaction_in_progress()
127
+
128
+ @property
129
+ def username(self) -> str:
130
+ self._verify_connected()
131
+ return self._cyobj.username
132
+
133
+ @property
134
+ def version(self) -> str:
135
+ if self._version is None:
136
+ self._verify_connected()
137
+ self._version = ".".join(str(c) for c in self._cyobj.server_version)
138
+ return self._version
139
+
140
+ @property
141
+ def warning(self) -> errors.ErrorWrapper:
142
+ self._verify_connected()
143
+ return self._cyobj.warning
144
+
145
+
146
+ def connect(dsn: str, user: str, password: str) -> Connection:
147
+ """
148
+ 创建数据库连接,并返回连接对象
149
+ """
150
+ if len(dsn) == 0 or len(user) == 0 or len(password) == 0:
151
+ raise errors.raise_error(errors.ERR_INVALID_CONNECT_PARAMS)
152
+ return Connection(dsn=dsn, user=user, password=password)
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Database API functions
5
+ """
6
+ import datetime
7
+ from . import errors
8
+
9
+
10
+ def Date(year: int, month: int, day: int) -> datetime.date:
11
+ return datetime.date(year, month, day)
12
+
13
+ def Time(hour: int, minute: int, second: int) -> None:
14
+ errors.raise_error(errors.ERR_TIME_NOT_SUPPORTED)
15
+
16
+ def Timestamp(year: int, month: int, day: int, hour: int, minute: int, second: int) -> datetime.datetime:
17
+ return datetime.datetime(year, month, day, hour, minute, second)
18
+
19
+ def DateFromTicks(ticks: float) -> datetime.date:
20
+ return datetime.date.fromtimestamp(ticks)
21
+
22
+
23
+ def TimeFromTicks(ticks: float) -> None:
24
+ errors.raise_error(errors.ERR_TIME_NOT_SUPPORTED)
25
+
26
+
27
+ def TimestampFromTicks(ticks: float) -> datetime.datetime:
28
+ return datetime.datetime.fromtimestamp(ticks)
29
+
30
+
31
+ def Binary(value) -> bytes:
32
+ if isinstance(value, str):
33
+ return value.encode()
34
+ return bytes(value)