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,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
|