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