sqlalchemy-iris 0.5.0b3__py3-none-any.whl → 0.6.0b1__py3-none-any.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.
- intersystems_iris/_BufferReader.py +10 -0
- intersystems_iris/_BufferWriter.py +32 -0
- intersystems_iris/_ConnectionInformation.py +54 -0
- intersystems_iris/_ConnectionParameters.py +18 -0
- intersystems_iris/_Constant.py +38 -0
- intersystems_iris/_DBList.py +499 -0
- intersystems_iris/_Device.py +69 -0
- intersystems_iris/_GatewayContext.py +25 -0
- intersystems_iris/_GatewayException.py +4 -0
- intersystems_iris/_GatewayUtility.py +74 -0
- intersystems_iris/_IRIS.py +1294 -0
- intersystems_iris/_IRISConnection.py +516 -0
- intersystems_iris/_IRISEmbedded.py +85 -0
- intersystems_iris/_IRISGlobalNode.py +273 -0
- intersystems_iris/_IRISGlobalNodeView.py +25 -0
- intersystems_iris/_IRISIterator.py +143 -0
- intersystems_iris/_IRISList.py +360 -0
- intersystems_iris/_IRISNative.py +208 -0
- intersystems_iris/_IRISOREF.py +4 -0
- intersystems_iris/_IRISObject.py +424 -0
- intersystems_iris/_IRISReference.py +133 -0
- intersystems_iris/_InStream.py +149 -0
- intersystems_iris/_LegacyIterator.py +135 -0
- intersystems_iris/_ListItem.py +15 -0
- intersystems_iris/_ListReader.py +84 -0
- intersystems_iris/_ListWriter.py +157 -0
- intersystems_iris/_LogFileStream.py +115 -0
- intersystems_iris/_MessageHeader.py +51 -0
- intersystems_iris/_OutStream.py +25 -0
- intersystems_iris/_PrintStream.py +65 -0
- intersystems_iris/_PythonGateway.py +850 -0
- intersystems_iris/_SharedMemorySocket.py +87 -0
- intersystems_iris/__init__.py +79 -0
- intersystems_iris/__main__.py +7 -0
- intersystems_iris/dbapi/_Column.py +56 -0
- intersystems_iris/dbapi/_DBAPI.py +2295 -0
- intersystems_iris/dbapi/_Descriptor.py +46 -0
- intersystems_iris/dbapi/_IRISStream.py +63 -0
- intersystems_iris/dbapi/_Message.py +158 -0
- intersystems_iris/dbapi/_Parameter.py +138 -0
- intersystems_iris/dbapi/_ParameterCollection.py +133 -0
- intersystems_iris/dbapi/_ResultSetRow.py +314 -0
- intersystems_iris/dbapi/_SQLType.py +32 -0
- intersystems_iris/dbapi/__init__.py +0 -0
- intersystems_iris/dbapi/preparser/_PreParser.py +1658 -0
- intersystems_iris/dbapi/preparser/_Scanner.py +391 -0
- intersystems_iris/dbapi/preparser/_Token.py +81 -0
- intersystems_iris/dbapi/preparser/_TokenList.py +251 -0
- intersystems_iris/dbapi/preparser/__init__.py +0 -0
- intersystems_iris/pex/_BusinessHost.py +101 -0
- intersystems_iris/pex/_BusinessOperation.py +105 -0
- intersystems_iris/pex/_BusinessProcess.py +214 -0
- intersystems_iris/pex/_BusinessService.py +95 -0
- intersystems_iris/pex/_Common.py +228 -0
- intersystems_iris/pex/_Director.py +24 -0
- intersystems_iris/pex/_IRISBusinessOperation.py +5 -0
- intersystems_iris/pex/_IRISBusinessService.py +18 -0
- intersystems_iris/pex/_IRISInboundAdapter.py +5 -0
- intersystems_iris/pex/_IRISOutboundAdapter.py +17 -0
- intersystems_iris/pex/_InboundAdapter.py +57 -0
- intersystems_iris/pex/_Message.py +6 -0
- intersystems_iris/pex/_OutboundAdapter.py +46 -0
- intersystems_iris/pex/__init__.py +25 -0
- iris/__init__.py +25 -0
- iris/iris_site.py +13 -0
- iris/irisbuiltins.py +97 -0
- iris/irisloader.py +199 -0
- irisnative/_IRISNative.py +9 -0
- irisnative/__init__.py +10 -0
- {sqlalchemy_iris-0.5.0b3.dist-info → sqlalchemy_iris-0.6.0b1.dist-info}/METADATA +1 -1
- sqlalchemy_iris-0.6.0b1.dist-info/RECORD +83 -0
- sqlalchemy_iris-0.6.0b1.dist-info/top_level.txt +4 -0
- sqlalchemy_iris-0.5.0b3.dist-info/RECORD +0 -14
- sqlalchemy_iris-0.5.0b3.dist-info/top_level.txt +0 -1
- {sqlalchemy_iris-0.5.0b3.dist-info → sqlalchemy_iris-0.6.0b1.dist-info}/LICENSE +0 -0
- {sqlalchemy_iris-0.5.0b3.dist-info → sqlalchemy_iris-0.6.0b1.dist-info}/WHEEL +0 -0
- {sqlalchemy_iris-0.5.0b3.dist-info → sqlalchemy_iris-0.6.0b1.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,46 @@
|
|
1
|
+
class _Descriptor:
|
2
|
+
def __init__(self, type = 0, precision = 0, scale = None, nullable = 0):
|
3
|
+
try:
|
4
|
+
type = int(type)
|
5
|
+
except (TypeError, ValueError):
|
6
|
+
raise TypeError("type must be an integer")
|
7
|
+
try:
|
8
|
+
precision = int(precision)
|
9
|
+
except (TypeError, ValueError):
|
10
|
+
raise TypeError("precision must be an integer")
|
11
|
+
try:
|
12
|
+
nullable = int(nullable)
|
13
|
+
except (TypeError, ValueError):
|
14
|
+
raise TypeError("nullable must be an integer")
|
15
|
+
|
16
|
+
self.type = type
|
17
|
+
self.precision = precision
|
18
|
+
self.scale = scale
|
19
|
+
self.nullable = nullable
|
20
|
+
self.name = None
|
21
|
+
self.slotPosition = None
|
22
|
+
|
23
|
+
@property
|
24
|
+
def scale(self):
|
25
|
+
return self.__scale
|
26
|
+
|
27
|
+
@scale.setter
|
28
|
+
def scale(self, value):
|
29
|
+
if value is not None:
|
30
|
+
try:
|
31
|
+
value = int(value)
|
32
|
+
except (TypeError, ValueError):
|
33
|
+
raise TypeError("scale must be an integer")
|
34
|
+
|
35
|
+
self.__scale = value
|
36
|
+
|
37
|
+
def cloneMe(self, d):
|
38
|
+
if not isinstance(d, _Descriptor):
|
39
|
+
raise TypeError("Must clone another _Descriptor")
|
40
|
+
|
41
|
+
self.type = d.type
|
42
|
+
self.precision = d.precision
|
43
|
+
self.scale = d.scale
|
44
|
+
self.nullable = d.nullable
|
45
|
+
self.name = d.name
|
46
|
+
self.slotPosition = d.slotPosition
|
@@ -0,0 +1,63 @@
|
|
1
|
+
from . import _Message
|
2
|
+
from .._MessageHeader import _MessageHeader
|
3
|
+
from .._InStream import _InStream
|
4
|
+
from .._OutStream import _OutStream
|
5
|
+
|
6
|
+
class IRISStream:
|
7
|
+
_handle = None
|
8
|
+
_binary = False
|
9
|
+
_connection = None
|
10
|
+
_embedded = False
|
11
|
+
|
12
|
+
def __init__(self, connection, handle, embedded=False):
|
13
|
+
self._connection = connection
|
14
|
+
self._handle = handle
|
15
|
+
self._embedded = embedded
|
16
|
+
self._locale = connection._connection_info._locale
|
17
|
+
if not self._embedded:
|
18
|
+
self._in_message = _InStream(connection)
|
19
|
+
self._out_message = _OutStream(connection)
|
20
|
+
|
21
|
+
def fetch_embdedded(self):
|
22
|
+
result = b'' if self._binary else ''
|
23
|
+
|
24
|
+
stream = self._connection.iris.cls('%Stream.Object')._Open(self._handle)
|
25
|
+
while not stream.AtEnd:
|
26
|
+
chunk = stream.Read()
|
27
|
+
result += bytes(chunk, self._locale) if self._binary else chunk
|
28
|
+
|
29
|
+
return result
|
30
|
+
|
31
|
+
def fetch(self):
|
32
|
+
if self._embedded:
|
33
|
+
return self.fetch_embdedded()
|
34
|
+
result = None
|
35
|
+
if not self._handle:
|
36
|
+
return result
|
37
|
+
|
38
|
+
with self._connection._lock:
|
39
|
+
# message header
|
40
|
+
self._statement_id = self._connection._get_new_statement_id()
|
41
|
+
self._out_message.wire._write_header(_Message.READ_STREAM)
|
42
|
+
_MessageHeader._set_statement_id(self._out_message.wire.buffer, self._statement_id)
|
43
|
+
|
44
|
+
# message body
|
45
|
+
self._out_message.wire._set(self._handle) # stream handle
|
46
|
+
self._out_message.wire._set(-1) # length
|
47
|
+
|
48
|
+
# send message
|
49
|
+
sequence_number = self._connection._get_new_sequence_number()
|
50
|
+
self._out_message._send(sequence_number)
|
51
|
+
|
52
|
+
code = self._in_message._read_message_sql(sequence_number, self._statement_id, _InStream.BYTE_STREAM, 403)
|
53
|
+
if code == 403:
|
54
|
+
return None
|
55
|
+
|
56
|
+
result = self._in_message.wire._get_raw()
|
57
|
+
if not self._binary:
|
58
|
+
result = str(result, self._locale)
|
59
|
+
|
60
|
+
return result
|
61
|
+
|
62
|
+
class IRISBinaryStream(IRISStream):
|
63
|
+
_binary = True
|
@@ -0,0 +1,158 @@
|
|
1
|
+
def expect_response(message_type):
|
2
|
+
if message_type in NO_RESPONSE:
|
3
|
+
return False
|
4
|
+
return True
|
5
|
+
|
6
|
+
HANDSHAKE = b'HS'
|
7
|
+
CONNECT = b'CN'
|
8
|
+
DISCONNECT = b'DC'
|
9
|
+
PREPARE = b'PP'
|
10
|
+
DIRECT_UPDATE = b'DU'
|
11
|
+
DIRECT_QUERY = b'DQ'
|
12
|
+
DIRECT_STORED_PROCEDURE = b'DS'
|
13
|
+
PREPARE_DIALECT = b'PD'
|
14
|
+
DIRECT_EXECUTE_DIALECT = b'DD'
|
15
|
+
PREPARED_UPDATE_EXECUTE = b'PU'
|
16
|
+
PREPARED_QUERY_EXECUTE = b'PQ'
|
17
|
+
FETCH_DATA = b'FD'
|
18
|
+
CLOSE_CURSOR = b'CC'
|
19
|
+
PREPARE_STORED_PROCEDURE = b'SP'
|
20
|
+
STORED_PROCEDURE_UPDATE_EXECUTE = b'SU'
|
21
|
+
STORED_PROCEDURE_QUERY_EXECUTE = b'SQ'
|
22
|
+
STORED_PROCEDURE_FETCH_DATA = b'SF'
|
23
|
+
EXECUTE_MULTIPLE_RESULT_SETS = b'MS'
|
24
|
+
MULTIPLE_RESULT_SETS_FETCH_DATA = b'MD'
|
25
|
+
GET_MORE_RESULTS = b'MR'
|
26
|
+
GET_STREAM_SIZE = b'SS'
|
27
|
+
RETRIEVE_STREAM = b'RS'
|
28
|
+
OPEN_STREAM = b'OS'
|
29
|
+
READ_STREAM = b'JS'
|
30
|
+
READ_STREAM_ODBC = b'AS'
|
31
|
+
STORE_BINARY_STREAM = b'SB'
|
32
|
+
STORE_CHARACTER_STREAM = b'SM'
|
33
|
+
STREAM_GET_BYTES = b'GB'
|
34
|
+
STREAM_SET_BYTES = b'SZ'
|
35
|
+
STREAM_TRUNCATE = b'SX'
|
36
|
+
STREAM_GET_POSITION = b'GP'
|
37
|
+
CLOSE_STREAM = b'CS'
|
38
|
+
GET_RESULT_SET_OBJECT = b'FR'
|
39
|
+
GET_STRUCT_OBJECT = b'FS'
|
40
|
+
COMMIT = b'TC'
|
41
|
+
ROLLBACK = b'TR'
|
42
|
+
READ_COMMITTED = b'RC'
|
43
|
+
READ_UNCOMMITTED = b'RU'
|
44
|
+
ISOLATION_LEVEL = b'IL'
|
45
|
+
AUTOCOMMIT_OFF = b'AF'
|
46
|
+
AUTOCOMMIT_ON = b'AN'
|
47
|
+
TOGGLE_SYNCHRONOUS_COMMIT = b'TS'
|
48
|
+
GET_AUTO_GENERATED_KEYS = b'GG'
|
49
|
+
IN_TRANSACTION = b'IT'
|
50
|
+
JDBC_BESTROWID = b'BR'
|
51
|
+
JDBC_CATALOGS = b'CA'
|
52
|
+
JDBC_COLUMNPRIV = b'CP'
|
53
|
+
JDBC_COLUMNS = b'CO'
|
54
|
+
JDBC_CROSSREFERENCE = b'CR'
|
55
|
+
JDBC_EXPORTEDKEYS = b'EK'
|
56
|
+
JDBC_IMPORTEDKEYS = b'IK'
|
57
|
+
JDBC_INDEXINFO = b'II'
|
58
|
+
JDBC_PRIMARYKEYS = b'PK'
|
59
|
+
JDBC_PROCEDURECOL = b'PC'
|
60
|
+
JDBC_PROCEDURES = b'PR'
|
61
|
+
JDBC_SCHEMAS = b'SC'
|
62
|
+
JDBC_TABLEPRIV = b'TP'
|
63
|
+
JDBC_TABLES = b'TA'
|
64
|
+
JDBC_TABLETYPES = b'TT'
|
65
|
+
JDBC_TYPEINFO = b'TI'
|
66
|
+
JDBC_VERSIONCOL = b'VC'
|
67
|
+
ODBC_BESTROWID = b'br'
|
68
|
+
ODBC_CATALOGS = b'ca'
|
69
|
+
ODBC_COLUMNPRIV = b'cp'
|
70
|
+
ODBC_COLUMNS_35 = b'c3'
|
71
|
+
ODBC_CROSSREFERENCE_35 = b'r3'
|
72
|
+
ODBC_EXPORTEDKEYS_35 = b'e3'
|
73
|
+
ODBC_IMPORTEDKEYS_35 = b'i3'
|
74
|
+
ODBC_PROCEDURECOL_35 = b'p3'
|
75
|
+
ODBC_TYPEINFO_35 = b't3'
|
76
|
+
ODBC_COLUMNS = b'co'
|
77
|
+
ODBC_CROSSREFERENCE = b'cr'
|
78
|
+
ODBC_EXPORTEDKEYS = b'ek'
|
79
|
+
ODBC_IMPORTEDKEYS = b'ik'
|
80
|
+
ODBC_INDEXINFO = b'ii'
|
81
|
+
ODBC_PRIMARYKEYS = b'pk'
|
82
|
+
ODBC_PROCEDURECOL = b'pc'
|
83
|
+
ODBC_PROCEDURES = b'pr'
|
84
|
+
ODBC_SCHEMAS = b'sc'
|
85
|
+
ODBC_STATISTICS = b'st'
|
86
|
+
ODBC_TABLEPRIV = b'tp'
|
87
|
+
ODBC_TABLES = b'ta'
|
88
|
+
ODBC_TABLETYPES = b'tt'
|
89
|
+
ODBC_TYPEINFO = b'ti'
|
90
|
+
ODBC_VERSIONCOL = b'vc'
|
91
|
+
JDBC_UDTS = b'UT'
|
92
|
+
JDBC_SUPER_TYPES = b'SY'
|
93
|
+
JDBC_SUPER_TABLES = b'SL'
|
94
|
+
JDBC_GET_ATTRIBUTES = b'AT'
|
95
|
+
JDBC_GET_FUNCTION_COLUMNS = b'FC'
|
96
|
+
JDBC_GET_FUNCTIONS = b'FN'
|
97
|
+
JDBC_CLIENT_INFO_PROPERTIES = b'CF'
|
98
|
+
SET_CLIENT_INFO_PROPERTIES = b'CG'
|
99
|
+
XA_START = b'XS'
|
100
|
+
XA_END = b'XE'
|
101
|
+
XA_FORGET = b'XF'
|
102
|
+
XA_PREPARE = b'XP'
|
103
|
+
XA_COMMIT = b'XC'
|
104
|
+
XA_ROLLBACK = b'XR'
|
105
|
+
XA_RECOVER = b'XV'
|
106
|
+
EXECUTE_STATIC_CURSOR = b'EX'
|
107
|
+
DIRECT_STATIC_CURSOR = b'DX'
|
108
|
+
FETCH_STATIC_CURSOR = b'FX'
|
109
|
+
UPDATE_CACHE = b'UC'
|
110
|
+
RESET_CONNECTION = b'RN'
|
111
|
+
GET_SERVER_ERROR = b'OE'
|
112
|
+
EXECUTE_STATEMENT_BATCH = b'EB'
|
113
|
+
CLOSE_STATEMENT = b'CU'
|
114
|
+
QUICK_LOAD = b'QL'
|
115
|
+
QUICK_CHILD_TABLE_LOAD = b'QZ'
|
116
|
+
QUICK_CHILD_TABLE_CREATE = b'QX'
|
117
|
+
QUICK_CHILD_TABLE_REMOVE = b'QK'
|
118
|
+
QUICK_STORE = b'QS'
|
119
|
+
QUICK_CREATE = b'QC'
|
120
|
+
QUICK_REMOVE = b'QR'
|
121
|
+
QUICK_FIND_ROWID_BY_PK = b'Q1'
|
122
|
+
QUICK_FIND_ROWID_BY_CONSTRAINT = b'Q2'
|
123
|
+
QUICK_FIND_PK_BY_CONSTRAINT = b'Q3'
|
124
|
+
QUICK_REMOVE_BY_PK = b'Q4'
|
125
|
+
QUICK_CREATE_BY_PK = b'Q5'
|
126
|
+
QUICK_STORE_BY_PK = b'Q6'
|
127
|
+
QUICK_LOAD_BY_PK = b'Q7'
|
128
|
+
QUICK_CHILD_TABLE_REMOVE_BY_PK = b'Q8'
|
129
|
+
QUICK_CHILD_TABLE_CREATE_BY_PK = b'Q9'
|
130
|
+
QUICK_CHILD_TABLE_LOAD_BY_PK = b'QA'
|
131
|
+
QUICK_GET_CHILDREN_PKS = b'QB'
|
132
|
+
QUICK_GET_CHILDREN_PKS_BY_PK = b'QD'
|
133
|
+
QUICK_FIND_PK_BY_ROWID = b'QE'
|
134
|
+
QUICK_BULK_LOAD = b'QM'
|
135
|
+
QUICK_BULK_CREATE = b'QN'
|
136
|
+
QUICK_BULK_STORE = b'QO'
|
137
|
+
QUICK_BULK_SAVE_BY_PK = b'QW'
|
138
|
+
QUICK_QUERY = b'QQ'
|
139
|
+
QUICK_JPA_FLUSH = b'QF'
|
140
|
+
GET_CACHE_INFO = b'CI'
|
141
|
+
PING = b'PG'
|
142
|
+
PING_TWO = b'P2'
|
143
|
+
IS_TWO_FACTOR_ENABLED = b'2E'
|
144
|
+
SEND_TWO_FACTOR_TOKEN = b'2F'
|
145
|
+
STREAM_SET_PREFETCH_SIZE = b'SN'
|
146
|
+
EXTERNAL_INTERUPT = b'EI'
|
147
|
+
GET_NAMESPACES_MSG = b'CI'
|
148
|
+
GATEWAY_INIT = b'GI'
|
149
|
+
|
150
|
+
NO_RESPONSE = [AUTOCOMMIT_OFF,
|
151
|
+
AUTOCOMMIT_ON,
|
152
|
+
READ_COMMITTED,
|
153
|
+
READ_UNCOMMITTED,
|
154
|
+
CLOSE_CURSOR,
|
155
|
+
CLOSE_STREAM,
|
156
|
+
CLOSE_STATEMENT,
|
157
|
+
RESET_CONNECTION,
|
158
|
+
DISCONNECT]
|
@@ -0,0 +1,138 @@
|
|
1
|
+
import datetime
|
2
|
+
import decimal
|
3
|
+
import enum
|
4
|
+
import intersystems_iris.dbapi._Descriptor
|
5
|
+
|
6
|
+
class ParameterMode(enum.IntEnum):
|
7
|
+
UNKNOWN = 0
|
8
|
+
INPUT = 1
|
9
|
+
INPUT_OUTPUT = 2
|
10
|
+
UNUSED = 3
|
11
|
+
OUTPUT = 4
|
12
|
+
REPLACED_LITERAL = 5
|
13
|
+
DEFAULT_PARAMETER = 6
|
14
|
+
RETURN_VALUE = 7
|
15
|
+
|
16
|
+
class _Parameter(intersystems_iris.dbapi._Descriptor._Descriptor):
|
17
|
+
def __init__(self, value = None, mode = ParameterMode.UNKNOWN, paramType = "?", name = "", execParam = False, bound = False, type = 0, precision = 0, scale = None, nullable = 0, slotPosition = None):
|
18
|
+
if not isinstance(mode, ParameterMode):
|
19
|
+
raise TypeError("mode must be a ParameterMode")
|
20
|
+
paramType = str(paramType)
|
21
|
+
if len(paramType) > 1:
|
22
|
+
raise ValueError("paramType must be a single character")
|
23
|
+
name = str(name)
|
24
|
+
execParam = bool(execParam)
|
25
|
+
bound = bool(bound)
|
26
|
+
if slotPosition is not None:
|
27
|
+
try:
|
28
|
+
slotPosition = int(slotPosition)
|
29
|
+
except (TypeError, ValueError):
|
30
|
+
raise TypeError("slotPosition must be an integer")
|
31
|
+
if slotPosition < 0:
|
32
|
+
raise ValueError("slotPosition must be positive")
|
33
|
+
|
34
|
+
super().__init__(type, precision, scale, nullable)
|
35
|
+
|
36
|
+
self.__value = value
|
37
|
+
self.mode = mode
|
38
|
+
self.__paramType = paramType
|
39
|
+
self.name = name
|
40
|
+
self.execParam = execParam
|
41
|
+
self.__bound = bound
|
42
|
+
self.slotPosition = slotPosition
|
43
|
+
|
44
|
+
self._values = list()
|
45
|
+
|
46
|
+
self.parsermatched = False
|
47
|
+
self.matchedParameterList = None
|
48
|
+
|
49
|
+
def __repr__(self) -> str:
|
50
|
+
if self.mode not in [ParameterMode.UNKNOWN, ParameterMode.INPUT]:
|
51
|
+
return f'<{self.mode.name}>{repr(self.value)}'
|
52
|
+
else:
|
53
|
+
return f'<{self.mode.name}>'
|
54
|
+
|
55
|
+
def Clone(self):
|
56
|
+
clone = _Parameter(self.value, self.mode, self.paramType, self.name, self.execParam, self.bound)
|
57
|
+
clone.cloneMe(self)
|
58
|
+
|
59
|
+
clone.parsermatched = self.parsermatched
|
60
|
+
clone.matchedParameterList = self.matchedParameterList
|
61
|
+
|
62
|
+
return clone
|
63
|
+
|
64
|
+
@property
|
65
|
+
def bound(self):
|
66
|
+
return self.__bound
|
67
|
+
|
68
|
+
@property
|
69
|
+
def paramType(self):
|
70
|
+
return self.__paramType
|
71
|
+
|
72
|
+
@property
|
73
|
+
def value(self):
|
74
|
+
_set_switcher = {
|
75
|
+
type(None): lambda v : None,
|
76
|
+
# str: lambda v : v or b'\x00',
|
77
|
+
datetime.time: lambda v : v.strftime('%H:%M:%S.%f'),
|
78
|
+
datetime.date: lambda v : v.strftime('%Y-%m-%d'),
|
79
|
+
datetime.datetime: lambda v : v.strftime('%Y-%m-%d %H:%M:%S.%f'),
|
80
|
+
bytes: lambda v : v,
|
81
|
+
bytearray: lambda v : v,
|
82
|
+
bool: lambda v : 1 if v else 0,
|
83
|
+
int: lambda v : v,
|
84
|
+
float: lambda v : v,
|
85
|
+
decimal.Decimal: lambda v : v,
|
86
|
+
}
|
87
|
+
func = _set_switcher[type(self.__value)] if type(self.__value) in _set_switcher else (lambda v : str(v))
|
88
|
+
value = func(self.__value)
|
89
|
+
if self.mode == ParameterMode.REPLACED_LITERAL:
|
90
|
+
try:
|
91
|
+
value = int(value)
|
92
|
+
except:
|
93
|
+
try:
|
94
|
+
value = float(value)
|
95
|
+
except:
|
96
|
+
pass
|
97
|
+
return value
|
98
|
+
|
99
|
+
def _copy_cached_info(self, desc, copy_replaced):
|
100
|
+
self.type = desc.type
|
101
|
+
self.precision = desc.precision
|
102
|
+
self.scale = desc.scale
|
103
|
+
self.nullable = desc.nullable
|
104
|
+
self.name = desc.name
|
105
|
+
if ((self.mode != ParameterMode.REPLACED_LITERAL)
|
106
|
+
and (desc.mode != ParameterMode.REPLACED_LITERAL)
|
107
|
+
and (desc.mode != ParameterMode.UNKNOWN)):
|
108
|
+
self.mode = desc.mode
|
109
|
+
|
110
|
+
if not copy_replaced:
|
111
|
+
return
|
112
|
+
|
113
|
+
if desc.mode == ParameterMode.REPLACED_LITERAL:
|
114
|
+
self.mode = ParameterMode.REPLACED_LITERAL
|
115
|
+
self.__value = desc.value
|
116
|
+
self._values = list()
|
117
|
+
if len(desc._values) > 0: self._values.append(desc._values[0])
|
118
|
+
return
|
119
|
+
|
120
|
+
def _bind(self, value, parameter_sets):
|
121
|
+
if isinstance(value, list):
|
122
|
+
self._values = value
|
123
|
+
else:
|
124
|
+
if parameter_sets == 0:
|
125
|
+
self._values = []
|
126
|
+
size = len(self._values)
|
127
|
+
if parameter_sets + 1 < size or size < parameter_sets:
|
128
|
+
raise Exception("Not all parameters bound for this set")
|
129
|
+
elif parameter_sets == size:
|
130
|
+
self._values.append(value)
|
131
|
+
else:
|
132
|
+
# Rebinding
|
133
|
+
self._values[size - 1] = value
|
134
|
+
self.__bound = True
|
135
|
+
if self.mode == ParameterMode.OUTPUT or self.mode == ParameterMode.INPUT_OUTPUT:
|
136
|
+
self.mode = ParameterMode.INPUT_OUTPUT
|
137
|
+
else:
|
138
|
+
self.mode = ParameterMode.INPUT
|
@@ -0,0 +1,133 @@
|
|
1
|
+
import intersystems_iris.dbapi._ResultSetRow
|
2
|
+
from intersystems_iris.dbapi._Parameter import _Parameter
|
3
|
+
from intersystems_iris.dbapi._Parameter import ParameterMode
|
4
|
+
|
5
|
+
class _ParameterCollection:
|
6
|
+
def __init__(self, param_coll = None, shallow_copy = False):
|
7
|
+
self._params_list = list() # contains elements of type _Parameter
|
8
|
+
self._has_bound_by_param_name = False
|
9
|
+
|
10
|
+
self._user_index = list()
|
11
|
+
self._user_param_cnt = 0
|
12
|
+
|
13
|
+
self._param_names = None
|
14
|
+
self._array_bound = False
|
15
|
+
|
16
|
+
self._input_params = list()
|
17
|
+
|
18
|
+
if param_coll != None:
|
19
|
+
if shallow_copy:
|
20
|
+
self._params_list = param_coll._params_list
|
21
|
+
else:
|
22
|
+
self._params_list = list()
|
23
|
+
for param in param_coll._params_list:
|
24
|
+
new_param = _Parameter()
|
25
|
+
new_param._copy_cached_info(param, True)
|
26
|
+
self._params_list.append(new_param)
|
27
|
+
|
28
|
+
self._user_param_cnt = param_coll._user_param_cnt
|
29
|
+
self._user_index = param_coll._user_index
|
30
|
+
|
31
|
+
if param_coll._has_named_parameters():
|
32
|
+
self._update_names()
|
33
|
+
self._has_bound_by_param_name = False
|
34
|
+
self._array_bound = False
|
35
|
+
|
36
|
+
def set_input_params(self, params):
|
37
|
+
self._input_params = params
|
38
|
+
|
39
|
+
def collect(self, i: int = 0) -> list:
|
40
|
+
params = list()
|
41
|
+
|
42
|
+
param_index = 0
|
43
|
+
param_counter = i
|
44
|
+
for param in self._params_list:
|
45
|
+
mode = param.mode
|
46
|
+
if mode == ParameterMode.REPLACED_LITERAL:
|
47
|
+
params.append(_Parameter(param.value).value)
|
48
|
+
elif not mode == ParameterMode.INPUT:
|
49
|
+
params.append(_Parameter(param._values[i]).value)
|
50
|
+
elif self._input_params:
|
51
|
+
item = self._input_params[param_counter]
|
52
|
+
if isinstance(item, tuple) or isinstance(item, list):
|
53
|
+
value = item[param_index]
|
54
|
+
param_index = param_index + 1
|
55
|
+
else:
|
56
|
+
value = item
|
57
|
+
param_counter = param_counter + 1
|
58
|
+
params.append(_Parameter(value).value)
|
59
|
+
else:
|
60
|
+
raise Exception("Missing value")
|
61
|
+
|
62
|
+
return params
|
63
|
+
|
64
|
+
def __repr__(self) -> str:
|
65
|
+
return repr(self.collect())
|
66
|
+
|
67
|
+
def _add_user_param(self, param):
|
68
|
+
self._user_param_cnt = self._user_param_cnt + 1
|
69
|
+
#self._params_list.append(param)
|
70
|
+
return
|
71
|
+
|
72
|
+
def _user_parameters_size(self):
|
73
|
+
if self._user_index == None:
|
74
|
+
return len(self._params_list)
|
75
|
+
return self._user_param_cnt
|
76
|
+
|
77
|
+
def _has_named_parameters(self):
|
78
|
+
return self._param_names != None and len(self._params_list) != 0
|
79
|
+
|
80
|
+
def _update_names(self):
|
81
|
+
self._param_names = {}
|
82
|
+
for i in range(len(self._params_list)):
|
83
|
+
key = self._params_list[i].name.upper()
|
84
|
+
self._param_names[key] = i
|
85
|
+
return
|
86
|
+
|
87
|
+
def _get_user_param_index(self, user_parameter_number):
|
88
|
+
actual_index = self._user_index[user_parameter_number]
|
89
|
+
if actual_index == -1:
|
90
|
+
raise IndexError("Invalid parameter number: " + str(user_parameter_number))
|
91
|
+
return actual_index
|
92
|
+
|
93
|
+
def _get_user_param(self, user_parameter_number):
|
94
|
+
if user_parameter_number >= len(self._user_index):
|
95
|
+
raise IndexError("Invalid parameter number: " + str(user_parameter_number))
|
96
|
+
actual_index = self._get_user_param_index(user_parameter_number)
|
97
|
+
return self._params_list[actual_index]
|
98
|
+
|
99
|
+
def _update_param_info(self, from_param_coll):
|
100
|
+
try:
|
101
|
+
for i, param in enumerate(from_param_coll._params_list):
|
102
|
+
self._params_list[i]._copy_cached_info(param, False)
|
103
|
+
|
104
|
+
if self._user_param_cnt != len(from_param_coll._params_list):
|
105
|
+
self._user_param_cnt = from_param_coll._user_param_cnt
|
106
|
+
self._user_index = from_param_coll._user_index
|
107
|
+
|
108
|
+
if from_param_coll._has_named_parameters():
|
109
|
+
self._update_names()
|
110
|
+
|
111
|
+
except Exception:
|
112
|
+
# need to handle exceptions properly
|
113
|
+
if len(from_param_coll._params_list) != len(self._params_list):
|
114
|
+
raise LookupError("Parameter mismatch")
|
115
|
+
raise Exception
|
116
|
+
|
117
|
+
def _clear(self):
|
118
|
+
self._params_list.clear()
|
119
|
+
if self._param_names != None:
|
120
|
+
self._param_names.clear()
|
121
|
+
self._has_bound_by_param_name = False
|
122
|
+
self._array_bound = False
|
123
|
+
|
124
|
+
def _prep_list_index(self, is_fast_select, output_parameter_list):
|
125
|
+
self._param_row = intersystems_iris.dbapi._ResultSetRow._ResultSetRow(rowcount = len(self._params_list))
|
126
|
+
self._param_row._fast_select = is_fast_select
|
127
|
+
self._param_row.indexRow(output_parameter_list.list_item)
|
128
|
+
return
|
129
|
+
|
130
|
+
def _get_user_list_offset(self, user_parameter_number):
|
131
|
+
if user_parameter_number >= len(self._user_index):
|
132
|
+
raise IndexError("Invalid parameter number: " + str(user_parameter_number))
|
133
|
+
return self._param_row.rowItems[self._get_user_param_index(user_parameter_number)]
|