iris-pex-embedded-python 2.3.16__py3-none-any.whl → 2.3.18__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.

Potentially problematic release.


This version of iris-pex-embedded-python might be problematic. Click here for more details.

Files changed (120) hide show
  1. grongier/iris/Grongier/PEX/BusinessOperation.cls +33 -0
  2. grongier/iris/Grongier/PEX/BusinessProcess.cls +100 -0
  3. grongier/iris/Grongier/PEX/BusinessService.cls +33 -0
  4. grongier/iris/Grongier/PEX/Common.cls +133 -0
  5. grongier/iris/Grongier/PEX/Director.cls +15 -0
  6. grongier/iris/Grongier/PEX/Duplex/Operation.cls +27 -0
  7. grongier/iris/Grongier/PEX/Duplex/Process.cls +211 -0
  8. grongier/iris/Grongier/PEX/Duplex/Service.cls +9 -0
  9. grongier/iris/Grongier/PEX/InboundAdapter.cls +22 -0
  10. grongier/iris/Grongier/PEX/Message.cls +126 -0
  11. grongier/iris/Grongier/PEX/OutboundAdapter.cls +34 -0
  12. grongier/iris/Grongier/PEX/PickleMessage.cls +58 -0
  13. grongier/iris/Grongier/PEX/PrivateSession/Duplex.cls +247 -0
  14. grongier/iris/Grongier/PEX/PrivateSession/Message/Ack.cls +32 -0
  15. grongier/iris/Grongier/PEX/PrivateSession/Message/Poll.cls +32 -0
  16. grongier/iris/Grongier/PEX/PrivateSession/Message/Start.cls +32 -0
  17. grongier/iris/Grongier/PEX/PrivateSession/Message/Stop.cls +48 -0
  18. grongier/iris/Grongier/PEX/Python.cls +27 -0
  19. grongier/iris/Grongier/PEX/Test.cls +62 -0
  20. grongier/iris/Grongier/PEX/Utils.cls +312 -0
  21. grongier/iris/__init__.py +0 -0
  22. grongier/pex/_business_host.py +9 -1
  23. grongier/pex/_cli.py +8 -2
  24. grongier/pex/data/PEX/BusinessOperation.cls +35 -0
  25. grongier/pex/data/PEX/BusinessProcess.cls +113 -0
  26. grongier/pex/data/PEX/BusinessService.cls +35 -0
  27. grongier/pex/data/PEX/Common.cls +146 -0
  28. grongier/pex/data/PEX/Director.cls +57 -0
  29. grongier/pex/data/PEX/Duplex/Operation.cls +29 -0
  30. grongier/pex/data/PEX/Duplex/Process.cls +229 -0
  31. grongier/pex/data/PEX/Duplex/Service.cls +9 -0
  32. grongier/pex/data/PEX/InboundAdapter.cls +22 -0
  33. grongier/pex/data/PEX/Message.cls +128 -0
  34. grongier/pex/data/PEX/OutboundAdapter.cls +36 -0
  35. grongier/pex/data/PEX/PickleMessage.cls +58 -0
  36. grongier/pex/data/PEX/PrivateSession/Duplex.cls +260 -0
  37. grongier/pex/data/PEX/PrivateSession/Message/Ack.cls +32 -0
  38. grongier/pex/data/PEX/PrivateSession/Message/Poll.cls +32 -0
  39. grongier/pex/data/PEX/PrivateSession/Message/Start.cls +32 -0
  40. grongier/pex/data/PEX/PrivateSession/Message/Stop.cls +48 -0
  41. grongier/pex/data/PEX/Test.cls +62 -0
  42. grongier/pex/data/PEX/Utils.cls +413 -0
  43. intersystems_iris/_BufferReader.py +10 -0
  44. intersystems_iris/_BufferWriter.py +32 -0
  45. intersystems_iris/_ConnectionInformation.py +54 -0
  46. intersystems_iris/_ConnectionParameters.py +18 -0
  47. intersystems_iris/_Constant.py +38 -0
  48. intersystems_iris/_DBList.py +500 -0
  49. intersystems_iris/_Device.py +69 -0
  50. intersystems_iris/_GatewayContext.py +25 -0
  51. intersystems_iris/_GatewayException.py +4 -0
  52. intersystems_iris/_GatewayUtility.py +74 -0
  53. intersystems_iris/_IRIS.py +1294 -0
  54. intersystems_iris/_IRISConnection.py +516 -0
  55. intersystems_iris/_IRISEmbedded.py +85 -0
  56. intersystems_iris/_IRISGlobalNode.py +273 -0
  57. intersystems_iris/_IRISGlobalNodeView.py +25 -0
  58. intersystems_iris/_IRISIterator.py +143 -0
  59. intersystems_iris/_IRISList.py +360 -0
  60. intersystems_iris/_IRISNative.py +208 -0
  61. intersystems_iris/_IRISOREF.py +4 -0
  62. intersystems_iris/_IRISObject.py +424 -0
  63. intersystems_iris/_IRISReference.py +133 -0
  64. intersystems_iris/_InStream.py +149 -0
  65. intersystems_iris/_LegacyIterator.py +135 -0
  66. intersystems_iris/_ListItem.py +15 -0
  67. intersystems_iris/_ListReader.py +84 -0
  68. intersystems_iris/_ListWriter.py +157 -0
  69. intersystems_iris/_LogFileStream.py +115 -0
  70. intersystems_iris/_MessageHeader.py +51 -0
  71. intersystems_iris/_OutStream.py +25 -0
  72. intersystems_iris/_PrintStream.py +65 -0
  73. intersystems_iris/_PythonGateway.py +850 -0
  74. intersystems_iris/_SharedMemorySocket.py +87 -0
  75. intersystems_iris/__init__.py +79 -0
  76. intersystems_iris/__main__.py +7 -0
  77. intersystems_iris/dbapi/_Column.py +56 -0
  78. intersystems_iris/dbapi/_DBAPI.py +2587 -0
  79. intersystems_iris/dbapi/_Descriptor.py +46 -0
  80. intersystems_iris/dbapi/_IRISStream.py +65 -0
  81. intersystems_iris/dbapi/_Message.py +158 -0
  82. intersystems_iris/dbapi/_Parameter.py +169 -0
  83. intersystems_iris/dbapi/_ParameterCollection.py +141 -0
  84. intersystems_iris/dbapi/_ResultSetRow.py +338 -0
  85. intersystems_iris/dbapi/_SQLType.py +32 -0
  86. intersystems_iris/dbapi/__init__.py +0 -0
  87. intersystems_iris/dbapi/preparser/_PreParser.py +1671 -0
  88. intersystems_iris/dbapi/preparser/_Scanner.py +391 -0
  89. intersystems_iris/dbapi/preparser/_Token.py +81 -0
  90. intersystems_iris/dbapi/preparser/_TokenList.py +251 -0
  91. intersystems_iris/dbapi/preparser/__init__.py +0 -0
  92. intersystems_iris/pex/_BusinessHost.py +101 -0
  93. intersystems_iris/pex/_BusinessOperation.py +105 -0
  94. intersystems_iris/pex/_BusinessProcess.py +214 -0
  95. intersystems_iris/pex/_BusinessService.py +95 -0
  96. intersystems_iris/pex/_Common.py +228 -0
  97. intersystems_iris/pex/_Director.py +24 -0
  98. intersystems_iris/pex/_IRISBusinessOperation.py +5 -0
  99. intersystems_iris/pex/_IRISBusinessService.py +18 -0
  100. intersystems_iris/pex/_IRISInboundAdapter.py +5 -0
  101. intersystems_iris/pex/_IRISOutboundAdapter.py +17 -0
  102. intersystems_iris/pex/_InboundAdapter.py +57 -0
  103. intersystems_iris/pex/_Message.py +6 -0
  104. intersystems_iris/pex/_OutboundAdapter.py +46 -0
  105. intersystems_iris/pex/__init__.py +25 -0
  106. iris/__init__.py +33 -0
  107. iris/iris_ipm.py +40 -0
  108. iris/iris_site.py +13 -0
  109. iris/irisbuiltins.py +97 -0
  110. iris/irisloader.py +199 -0
  111. {iris_pex_embedded_python-2.3.16.dist-info → iris_pex_embedded_python-2.3.18.dist-info}/METADATA +3 -4
  112. iris_pex_embedded_python-2.3.18.dist-info/RECORD +153 -0
  113. {iris_pex_embedded_python-2.3.16.dist-info → iris_pex_embedded_python-2.3.18.dist-info}/WHEEL +1 -1
  114. iris_pex_embedded_python-2.3.18.dist-info/top_level.txt +4 -0
  115. irisnative/_IRISNative.py +9 -0
  116. irisnative/__init__.py +10 -0
  117. iris_pex_embedded_python-2.3.16.dist-info/RECORD +0 -43
  118. iris_pex_embedded_python-2.3.16.dist-info/top_level.txt +0 -1
  119. {iris_pex_embedded_python-2.3.16.dist-info → iris_pex_embedded_python-2.3.18.dist-info}/LICENSE +0 -0
  120. {iris_pex_embedded_python-2.3.16.dist-info → iris_pex_embedded_python-2.3.18.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,65 @@
1
+ from . import _Message
2
+ from .._MessageHeader import _MessageHeader
3
+ from .._InStream import _InStream
4
+ from .._OutStream import _OutStream
5
+
6
+
7
+ class IRISStream:
8
+ _handle = None
9
+ _binary = False
10
+ _connection = None
11
+ _embedded = False
12
+
13
+ def __init__(self, connection, handle, embedded=False):
14
+ self._connection = connection
15
+ self._handle = handle
16
+ self._embedded = embedded
17
+ self._locale = connection._connection_info._locale
18
+ if not self._embedded:
19
+ self._in_message = _InStream(connection)
20
+ self._out_message = _OutStream(connection)
21
+
22
+ def fetch_embdedded(self):
23
+ result = b'' if self._binary else ''
24
+
25
+ stream = self._connection.iris.cls('%Stream.Object')._Open(self._handle)
26
+ while not stream.AtEnd:
27
+ chunk = stream.Read()
28
+ result += bytes(chunk, self._locale) if self._binary else chunk
29
+
30
+ return result
31
+
32
+ def fetch(self):
33
+ if self._embedded:
34
+ return self.fetch_embdedded()
35
+ result = None
36
+ if not self._handle:
37
+ return result
38
+
39
+ with self._connection._lock:
40
+ # message header
41
+ self._statement_id = self._connection._get_new_statement_id()
42
+ self._out_message.wire._write_header(_Message.READ_STREAM)
43
+ _MessageHeader._set_statement_id(self._out_message.wire.buffer, self._statement_id)
44
+
45
+ # message body
46
+ self._out_message.wire._set(self._handle) # stream handle
47
+ self._out_message.wire._set(-1) # length
48
+
49
+ # send message
50
+ sequence_number = self._connection._get_new_sequence_number()
51
+ self._out_message._send(sequence_number)
52
+
53
+ code = self._in_message._read_message_sql(sequence_number, self._statement_id, _InStream.BYTE_STREAM, 403)
54
+ if code == 403:
55
+ return None
56
+
57
+ result = self._in_message.wire._get_raw()
58
+ if not self._binary:
59
+ result = str(result, self._locale)
60
+
61
+ return result
62
+
63
+
64
+ class IRISBinaryStream(IRISStream):
65
+ _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,169 @@
1
+ import datetime
2
+ import decimal
3
+ import enum
4
+ import intersystems_iris.dbapi._Descriptor
5
+
6
+
7
+ class ParameterMode(enum.IntEnum):
8
+ UNKNOWN = 0
9
+ INPUT = 1
10
+ INPUT_OUTPUT = 2
11
+ UNUSED = 3
12
+ OUTPUT = 4
13
+ REPLACED_LITERAL = 5
14
+ DEFAULT_PARAMETER = 6
15
+ RETURN_VALUE = 7
16
+
17
+
18
+ class _Parameter(intersystems_iris.dbapi._Descriptor._Descriptor):
19
+ def __init__(
20
+ self,
21
+ value=None,
22
+ mode=ParameterMode.UNKNOWN,
23
+ paramType="?",
24
+ name="",
25
+ execParam=False,
26
+ bound=False,
27
+ type=0,
28
+ precision=0,
29
+ scale=None,
30
+ nullable=0,
31
+ slotPosition=None,
32
+ ):
33
+ if not isinstance(mode, ParameterMode):
34
+ raise TypeError("mode must be a ParameterMode")
35
+ paramType = str(paramType)
36
+ if len(paramType) > 1:
37
+ raise ValueError("paramType must be a single character")
38
+ name = str(name)
39
+ execParam = bool(execParam)
40
+ bound = bool(bound)
41
+ if slotPosition is not None:
42
+ try:
43
+ slotPosition = int(slotPosition)
44
+ except (TypeError, ValueError):
45
+ raise TypeError("slotPosition must be an integer")
46
+ if slotPosition < 0:
47
+ raise ValueError("slotPosition must be positive")
48
+
49
+ super().__init__(type, precision, scale, nullable)
50
+
51
+ self.__value = value
52
+ self.mode = mode
53
+ self.__paramType = paramType
54
+ self.name = name
55
+ self.execParam = execParam
56
+ self.__bound = bound
57
+ self.slotPosition = slotPosition
58
+
59
+ self._values = list()
60
+
61
+ self.parsermatched = False
62
+ self.matchedParameterList = None
63
+
64
+ def __repr__(self) -> str:
65
+ if self.mode not in [ParameterMode.UNKNOWN, ParameterMode.INPUT]:
66
+ return f"<{self.mode.name}>{repr(self.value)}"
67
+ else:
68
+ return f"<{self.mode.name}>"
69
+
70
+ def Clone(self, value=None):
71
+ clone = _Parameter(
72
+ value or self.value,
73
+ self.mode,
74
+ self.paramType,
75
+ self.name,
76
+ self.execParam,
77
+ self.bound,
78
+ self.type,
79
+ self.precision,
80
+ self.scale,
81
+ self.nullable,
82
+ self.slotPosition,
83
+ )
84
+ clone.cloneMe(self)
85
+
86
+ clone.parsermatched = self.parsermatched
87
+ clone.matchedParameterList = self.matchedParameterList
88
+
89
+ return clone
90
+
91
+ @property
92
+ def bound(self):
93
+ return self.__bound
94
+
95
+ @property
96
+ def paramType(self):
97
+ return self.__paramType
98
+
99
+ @property
100
+ def value(self):
101
+ _set_switcher = {
102
+ type(None): lambda v: None,
103
+ # str: lambda v : v or b'\x00',
104
+ datetime.time: lambda v: v.strftime("%H:%M:%S.%f"),
105
+ datetime.date: lambda v: v.strftime("%Y-%m-%d"),
106
+ datetime.datetime: lambda v: v.strftime("%Y-%m-%d %H:%M:%S.%f"),
107
+ bytes: lambda v: v,
108
+ bytearray: lambda v: v,
109
+ bool: lambda v: 1 if v else 0,
110
+ int: lambda v: v,
111
+ float: lambda v: v,
112
+ decimal.Decimal: lambda v: v,
113
+ }
114
+ func = None
115
+ if issubclass(type(self.__value), enum.Enum):
116
+ value = self.__value.value
117
+ elif type(self.__value) in _set_switcher:
118
+ func = _set_switcher[type(self.__value)]
119
+ value = func(self.__value)
120
+ else:
121
+ value = str(self.__value)
122
+ if self.mode == ParameterMode.REPLACED_LITERAL:
123
+ if isinstance(value, str) and value.isdigit() and str(int(value)) == value:
124
+ value = int(value)
125
+ return value
126
+
127
+ def _copy_cached_info(self, desc, copy_replaced):
128
+ self.type = desc.type
129
+ self.precision = desc.precision
130
+ self.scale = desc.scale
131
+ self.nullable = desc.nullable
132
+ self.name = desc.name
133
+ if (
134
+ (self.mode != ParameterMode.REPLACED_LITERAL)
135
+ and (desc.mode != ParameterMode.REPLACED_LITERAL)
136
+ and (desc.mode != ParameterMode.UNKNOWN)
137
+ ):
138
+ self.mode = desc.mode
139
+
140
+ if not copy_replaced:
141
+ return
142
+
143
+ if desc.mode == ParameterMode.REPLACED_LITERAL:
144
+ self.mode = ParameterMode.REPLACED_LITERAL
145
+ self.__value = desc.value
146
+ self._values = list()
147
+ if len(desc._values) > 0:
148
+ self._values.append(desc._values[0])
149
+ return
150
+
151
+ def _bind(self, value, parameter_sets):
152
+ if isinstance(value, list):
153
+ self._values = value
154
+ else:
155
+ if parameter_sets == 0:
156
+ self._values = []
157
+ size = len(self._values)
158
+ if parameter_sets + 1 < size or size < parameter_sets:
159
+ raise Exception("Not all parameters bound for this set")
160
+ elif parameter_sets == size:
161
+ self._values.append(value)
162
+ else:
163
+ # Rebinding
164
+ self._values[size - 1] = value
165
+ self.__bound = True
166
+ if self.mode == ParameterMode.OUTPUT or self.mode == ParameterMode.INPUT_OUTPUT:
167
+ self.mode = ParameterMode.INPUT_OUTPUT
168
+ else:
169
+ self.mode = ParameterMode.INPUT
@@ -0,0 +1,141 @@
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 = list(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 update(self, set_index, param_index, value):
65
+ if isinstance(self._input_params[set_index], tuple):
66
+ self._input_params[set_index] = list(self._input_params[set_index])
67
+ if isinstance(self._input_params[set_index], list):
68
+ self._input_params[set_index][param_index] = value
69
+ else:
70
+ self._input_params[param_index] = value
71
+
72
+ def __repr__(self) -> str:
73
+ return repr(self.collect())
74
+
75
+ def _add_user_param(self, param):
76
+ self._user_param_cnt = self._user_param_cnt + 1
77
+ #self._params_list.append(param)
78
+ return
79
+
80
+ def _user_parameters_size(self):
81
+ if self._user_index == None:
82
+ return len(self._params_list)
83
+ return self._user_param_cnt
84
+
85
+ def _has_named_parameters(self):
86
+ return self._param_names != None and len(self._params_list) != 0
87
+
88
+ def _update_names(self):
89
+ self._param_names = {}
90
+ for i in range(len(self._params_list)):
91
+ key = self._params_list[i].name.upper()
92
+ self._param_names[key] = i
93
+ return
94
+
95
+ def _get_user_param_index(self, user_parameter_number):
96
+ actual_index = self._user_index[user_parameter_number]
97
+ if actual_index == -1:
98
+ raise IndexError("Invalid parameter number: " + str(user_parameter_number))
99
+ return actual_index
100
+
101
+ def _get_user_param(self, user_parameter_number):
102
+ if user_parameter_number >= len(self._user_index):
103
+ raise IndexError("Invalid parameter number: " + str(user_parameter_number))
104
+ actual_index = self._get_user_param_index(user_parameter_number)
105
+ return self._params_list[actual_index]
106
+
107
+ def _update_param_info(self, from_param_coll):
108
+ try:
109
+ for i, param in enumerate(from_param_coll._params_list):
110
+ self._params_list[i]._copy_cached_info(param, False)
111
+
112
+ if self._user_param_cnt != len(from_param_coll._params_list):
113
+ self._user_param_cnt = from_param_coll._user_param_cnt
114
+ self._user_index = from_param_coll._user_index
115
+
116
+ if from_param_coll._has_named_parameters():
117
+ self._update_names()
118
+
119
+ except Exception:
120
+ # need to handle exceptions properly
121
+ if len(from_param_coll._params_list) != len(self._params_list):
122
+ raise LookupError("Parameter mismatch")
123
+ raise Exception
124
+
125
+ def _clear(self):
126
+ self._params_list.clear()
127
+ if self._param_names != None:
128
+ self._param_names.clear()
129
+ self._has_bound_by_param_name = False
130
+ self._array_bound = False
131
+
132
+ def _prep_list_index(self, is_fast_select, output_parameter_list):
133
+ self._param_row = intersystems_iris.dbapi._ResultSetRow._ResultSetRow(rowcount = len(self._params_list))
134
+ self._param_row._fast_select = is_fast_select
135
+ self._param_row.indexRow(output_parameter_list.list_item)
136
+ return
137
+
138
+ def _get_user_list_offset(self, user_parameter_number):
139
+ if user_parameter_number >= len(self._user_index):
140
+ raise IndexError("Invalid parameter number: " + str(user_parameter_number))
141
+ return self._param_row.rowItems[self._get_user_param_index(user_parameter_number)]