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,338 @@
1
+ from datetime import datetime
2
+ from collections import namedtuple
3
+ from ._SQLType import SQLType
4
+ from .._DBList import _DBList
5
+ from .._ListItem import _ListItem
6
+ from ._IRISStream import IRISStream, IRISBinaryStream
7
+ from ._Column import _Column
8
+
9
+ def from_timestamp_posix(posix):
10
+ time = int(posix)
11
+ if time > 0:
12
+ time ^= 0x1000000000000000
13
+ else:
14
+ time |= 0xF000000000000000
15
+
16
+ time /= 1000000
17
+
18
+ value = datetime.utcfromtimestamp(time).replace(tzinfo=None)
19
+ return value
20
+
21
+ class _ResultSetRow:
22
+ _locale = "latin-1"
23
+ _connection = None
24
+
25
+ def __init__(self, connection, columns=None, rowcount=0, ):
26
+ self._connection = connection
27
+ # index from user-inputted columns to columns received from server
28
+ self.col_index = []
29
+ self._col_type = []
30
+ self._columns = columns
31
+ if columns != None:
32
+ for column in columns:
33
+ self.col_index.append(column.slotPosition - 1)
34
+ self._col_type.append(column.type)
35
+
36
+ self._name_dict = {}
37
+ for columnIndex, column in enumerate(columns):
38
+ key = column.name.lower()
39
+ if key in self._name_dict:
40
+ self._name_dict[key].append(columnIndex)
41
+ else:
42
+ self._name_dict[key] = [columnIndex]
43
+
44
+ self._name_dict_keys = list(self._name_dict.keys())
45
+ self._name_dict_values = list(self._name_dict.values())
46
+
47
+ if rowcount != 0:
48
+ self._fast_select = True
49
+ self.colCount = rowcount
50
+ self._fast_first_iter = True
51
+ else:
52
+ self._fast_select = False
53
+ self.colCount = len(columns) if columns != None else 0
54
+
55
+ # number of columns received from server, aka number of items per row
56
+ #self.colCount = rowcount
57
+
58
+ # list of _ListItems corresponding to the various entries in the row, plus the offset of next row's first _ListItem
59
+ self.rowItems = None
60
+
61
+ self._locale = connection._connection_info._locale
62
+
63
+ self._new_buffer = True
64
+
65
+ # list of data offsets corresponding to each _ListItem in the row
66
+ self._offsets = [0] * self.colCount
67
+
68
+ class DataRow:
69
+ _types = {
70
+ SQLType.BIGINT: int,
71
+ SQLType.BINARY: bytes,
72
+ SQLType.BIT: None,
73
+ SQLType.CHAR: None,
74
+ SQLType.DECIMAL: None,
75
+ SQLType.DOUBLE: None,
76
+ SQLType.FLOAT: None,
77
+ SQLType.GUID: None,
78
+ SQLType.INTEGER: int,
79
+ SQLType.LONGVARBINARY: IRISBinaryStream,
80
+ SQLType.LONGVARCHAR: IRISStream,
81
+ SQLType.NUMERIC: None,
82
+ SQLType.REAL: None,
83
+ SQLType.SMALLINT: None,
84
+ SQLType.DATE: None,
85
+ SQLType.TIME: None,
86
+ SQLType.TIMESTAMP: None,
87
+ SQLType.TINYINT: None,
88
+ SQLType.TYPE_DATE: None,
89
+ SQLType.TYPE_TIME: None,
90
+ SQLType.TYPE_TIMESTAMP: None,
91
+ SQLType.VARBINARY: bytes,
92
+ SQLType.VARCHAR: str,
93
+ SQLType.WCHAR: None,
94
+ SQLType.WLONGVARCHAR: None,
95
+ SQLType.WVARCHAR: None,
96
+ SQLType.DATE_HOROLOG: None,
97
+ SQLType.TIME_HOROLOG: None,
98
+ SQLType.TIMESTAMP_POSIX: None,
99
+ }
100
+
101
+ def __init__(self, rsrow):
102
+ self._offsets = []
103
+ for i in range(len(rsrow.rowItems) - 1):
104
+ self._offsets.append(rsrow.rowItems[i])
105
+
106
+ self._connection = rsrow._connection
107
+ self._col_type = []
108
+ self._columns = rsrow._columns
109
+ self._name_dict = []
110
+ self._name_dict_keys = []
111
+ self._name_dict_values = []
112
+ if hasattr(rsrow, "_name_dict"):
113
+ self._col_type = rsrow._col_type
114
+ self._name_dict = rsrow._name_dict
115
+ self._name_dict_keys = rsrow._name_dict_keys
116
+ self._name_dict_values = rsrow._name_dict_values
117
+
118
+ self._list_item = rsrow._last_list_item
119
+ self._locale = rsrow._locale
120
+
121
+ def __getattr__(self, key):
122
+ return self.__getitem__(key)
123
+
124
+ def get(self):
125
+ return self[:]
126
+
127
+ def as_tuple(self):
128
+ row = namedtuple('Row', [col.name for col in self._columns], rename=True)
129
+ values = self[:]
130
+ return row(*values)
131
+
132
+ def __getitem__(self, key):
133
+ if isinstance(key, str):
134
+ key = key.lower()
135
+ if key not in self._name_dict_keys:
136
+ raise KeyError("Column '" + key + "' does not exist")
137
+ return self[self._name_dict[key][0] + 1]
138
+ elif isinstance(key, int):
139
+ if key < 0 or key > sum(len(item) for item in self._name_dict_values):
140
+ raise ValueError("Column index " + str(key) + " is out of range")
141
+ if key == 0:
142
+ return self.__getitem__(slice(None, None, None))
143
+ key = key - 1
144
+
145
+ for i, list in enumerate(self._name_dict_values):
146
+ if key in list:
147
+ idx = i
148
+ break
149
+ else:
150
+ continue
151
+ name = self._name_dict_keys[idx]
152
+
153
+ self._list_item.next_offset = self._offsets[key]
154
+ _DBList._get_list_element(self._list_item)
155
+ item = _DBList._get(self._list_item, self._locale)
156
+ _column: _Column = self._columns[idx]
157
+ ctype = _column.type
158
+ value_type = self._types[ctype] if ctype in self._types else None
159
+ try:
160
+ if ctype == SQLType.TIMESTAMP_POSIX:
161
+ item = from_timestamp_posix(item)
162
+
163
+ if _column.tableName == 'None' and _column.schema == 'None':
164
+ # Ignore for anonymous tables
165
+ pass
166
+ elif item is None:
167
+ pass
168
+ elif value_type is bytes:
169
+ item = bytes(map(ord, item))
170
+ elif issubclass(value_type, IRISStream):
171
+ stream = value_type(self._connection, item)
172
+ item = stream.fetch()
173
+ elif value_type is not None and not isinstance(item, value_type):
174
+ item = value_type(item)
175
+ except Exception:
176
+ pass
177
+
178
+ setattr(self, name, item)
179
+ return item
180
+ elif isinstance(key, slice):
181
+ list = []
182
+ if key.start is None:
183
+ if key.stop is None:
184
+ for i in range(len(self._offsets))[key]:
185
+ list.append(self[i + 1])
186
+ else:
187
+ key2 = slice(None, key.stop - 1, key.step)
188
+ for i in range(len(self._offsets))[key2]:
189
+ list.append(self[i + 1])
190
+ else:
191
+ if key.stop is None:
192
+ for i in range(len(self._offsets) + 1)[key]:
193
+ list.append(self[i])
194
+ else:
195
+ for i in range(len(self._offsets) + 1)[key]:
196
+ list.append(self[i])
197
+ return list
198
+ else:
199
+ raise TypeError("List indices must be strings, integers, or slices, not " + type(key).__name__)
200
+
201
+ def __len__(self):
202
+ return len(self._offsets)
203
+
204
+ class DataRowIterator:
205
+ def __init__(self, data_row):
206
+ self._data_row = data_row
207
+ self._counter = 1
208
+
209
+ def __iter__(self):
210
+ return self
211
+
212
+ def __next__(self):
213
+ if self._counter > len(self._data_row):
214
+ raise StopIteration()
215
+ next = self._data_row[self._counter]
216
+ self._counter += 1
217
+ return next
218
+
219
+ def __iter__(self):
220
+ return self.DataRowIterator(self)
221
+
222
+ class DataRowFastSelect(DataRow):
223
+ def __init__(self, rsrow, first_offset, length, buffer):
224
+ super().__init__(rsrow)
225
+ self._start_offset = first_offset
226
+ self._length = length
227
+ self._buffer = buffer
228
+ self._rsrow = rsrow
229
+
230
+ def __getitem__(self, key):
231
+ if len(self._offsets) == 0:
232
+ self.__len__()
233
+ return super().__getitem__(key)
234
+
235
+ def __len__(self):
236
+ self._offsets = self._rsrow.indexRowFastSelect(self._start_offset, self._length, self._buffer)
237
+ if not self._offsets:
238
+ self._offsets = []
239
+ return len(self._offsets)
240
+
241
+ def indexRow(self, list_item):
242
+ self._last_list_item = list_item
243
+ rowItems = [0] * (self.colCount + 1)
244
+ # buffer is reset by a read_message
245
+ buffer = list_item.buffer
246
+ length = list_item.list_buffer_end
247
+ self._first_offset = list_item.next_offset
248
+
249
+ if self._new_buffer:
250
+ # First row after creation of RsRow
251
+ # This is for cases where metadata is mixed with data (MRS)
252
+ prev_offset = self._first_offset
253
+ self._first_offset = 0
254
+ else:
255
+ prev_offset = self.rowItems[-1]
256
+
257
+ for i in range(self.colCount + 1):
258
+ try:
259
+ if prev_offset > length:
260
+ raise Exception("Offset out of range")
261
+ if prev_offset == length:
262
+ if i != 0:
263
+ if self._new_buffer and self.rowItems != None:
264
+ self.rowItems[-1] = 0
265
+ else:
266
+ if self.rowItems != None:
267
+ self.rowItems[-1] = 0
268
+ return False
269
+ if i == 0:
270
+ rowItems[i] = prev_offset
271
+ continue
272
+ curr_offset = _DBList._get_data_offset(buffer, prev_offset)
273
+ rowItems[i] = curr_offset
274
+ prev_offset = curr_offset
275
+ except IndexError:
276
+ raise IndexError("Row incomplete: " + str(self.colCount) +
277
+ " items expected, but " + str(i) + " were found")
278
+ self.update(rowItems)
279
+ return True
280
+
281
+ def indexRowFastSelect(self, prev_offset, length, buffer):
282
+ rowItems = [-1] * (self.colCount + 1)
283
+ for i in range(self.colCount + 1):
284
+ try:
285
+ if prev_offset > length:
286
+ raise Exception("Offset out of range")
287
+ if prev_offset == length:
288
+ if i != 0:
289
+ if self._fast_select:
290
+ # Fill in the remaining entries with -1
291
+ j = i - 1
292
+ for idx in range(len(rowItems) - i + 1):
293
+ rowItems[j] = -1
294
+ j += 1
295
+ return self.update(rowItems)
296
+ else:
297
+ if self._new_buffer and self.rowItems != None:
298
+ self.rowItems[-1] = 0
299
+ else:
300
+ if self.rowItems != None:
301
+ self.rowItems[-1] = 0
302
+ return
303
+ if i == 0:
304
+ rowItems[i] = prev_offset
305
+ continue
306
+ curr_offset = _DBList._get_data_offset(buffer, prev_offset)
307
+ rowItems[i] = curr_offset
308
+ prev_offset = curr_offset
309
+ except IndexError:
310
+ raise IndexError("Row incomplete: " + str(self.colCount) +
311
+ " items expected, but " + str(i) + " were found")
312
+ return self.update(rowItems)
313
+
314
+ def update(self, rowItems):
315
+ if self._fast_select:
316
+ colIndexOffsets = [0] * (len(self.col_index) + 1)
317
+ for idx, i in enumerate(self.col_index):
318
+ colIndexOffsets[idx] = rowItems[i]
319
+ colIndexOffsets[-1] = self._last_list_item.next_offset
320
+ self.rowItems = colIndexOffsets
321
+ return self.rowItems[:self.colCount]
322
+ self.rowItems = rowItems
323
+ self._offsets = self.DataRow(self)
324
+ self._new_buffer = False
325
+
326
+ def cloneListItem(self, list_item):
327
+ clone = _ListItem(list_item.buffer)
328
+ clone.is_null = list_item.is_null
329
+ clone.is_undefined = list_item.is_undefined
330
+ clone.type = list_item.type
331
+ clone.data_offset = list_item.data_offset
332
+ clone.data_length = list_item.data_length
333
+ clone.next_offset = list_item.next_offset
334
+ clone.by_reference = list_item.by_reference
335
+ return clone
336
+
337
+ def get(self):
338
+ return self._offsets.get()
@@ -0,0 +1,32 @@
1
+ import enum
2
+
3
+ class SQLType(enum.IntEnum):
4
+ BIGINT = -5
5
+ BINARY = -2
6
+ BIT = -7
7
+ CHAR = 1
8
+ DECIMAL = 3
9
+ DOUBLE = 8
10
+ FLOAT = 6
11
+ GUID = -11
12
+ INTEGER = 4
13
+ LONGVARBINARY = -4
14
+ LONGVARCHAR = -1
15
+ NUMERIC = 2
16
+ REAL = 7
17
+ SMALLINT = 5
18
+ DATE = 9
19
+ TIME = 10
20
+ TIMESTAMP = 11
21
+ TINYINT = -6
22
+ TYPE_DATE = 91
23
+ TYPE_TIME = 92
24
+ TYPE_TIMESTAMP = 93
25
+ VARBINARY = -3
26
+ VARCHAR = 12
27
+ WCHAR = -8
28
+ WLONGVARCHAR = -10
29
+ WVARCHAR = -9
30
+ DATE_HOROLOG = 1091
31
+ TIME_HOROLOG = 1092
32
+ TIMESTAMP_POSIX = 1093
File without changes