iris-pex-embedded-python 2.3.17__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.

@@ -3,6 +3,7 @@ from .._MessageHeader import _MessageHeader
3
3
  from .._InStream import _InStream
4
4
  from .._OutStream import _OutStream
5
5
 
6
+
6
7
  class IRISStream:
7
8
  _handle = None
8
9
  _binary = False
@@ -59,5 +60,6 @@ class IRISStream:
59
60
 
60
61
  return result
61
62
 
63
+
62
64
  class IRISBinaryStream(IRISStream):
63
65
  _binary = True
@@ -3,6 +3,7 @@ import decimal
3
3
  import enum
4
4
  import intersystems_iris.dbapi._Descriptor
5
5
 
6
+
6
7
  class ParameterMode(enum.IntEnum):
7
8
  UNKNOWN = 0
8
9
  INPUT = 1
@@ -13,8 +14,22 @@ class ParameterMode(enum.IntEnum):
13
14
  DEFAULT_PARAMETER = 6
14
15
  RETURN_VALUE = 7
15
16
 
17
+
16
18
  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):
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
+ ):
18
33
  if not isinstance(mode, ParameterMode):
19
34
  raise TypeError("mode must be a ParameterMode")
20
35
  paramType = str(paramType)
@@ -48,23 +63,35 @@ class _Parameter(intersystems_iris.dbapi._Descriptor._Descriptor):
48
63
 
49
64
  def __repr__(self) -> str:
50
65
  if self.mode not in [ParameterMode.UNKNOWN, ParameterMode.INPUT]:
51
- return f'<{self.mode.name}>{repr(self.value)}'
66
+ return f"<{self.mode.name}>{repr(self.value)}"
52
67
  else:
53
- return f'<{self.mode.name}>'
68
+ return f"<{self.mode.name}>"
54
69
 
55
- def Clone(self):
56
- clone = _Parameter(self.value, self.mode, self.paramType, self.name, self.execParam, self.bound)
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
+ )
57
84
  clone.cloneMe(self)
58
-
85
+
59
86
  clone.parsermatched = self.parsermatched
60
87
  clone.matchedParameterList = self.matchedParameterList
61
-
88
+
62
89
  return clone
63
90
 
64
91
  @property
65
92
  def bound(self):
66
93
  return self.__bound
67
-
94
+
68
95
  @property
69
96
  def paramType(self):
70
97
  return self.__paramType
@@ -72,28 +99,29 @@ class _Parameter(intersystems_iris.dbapi._Descriptor._Descriptor):
72
99
  @property
73
100
  def value(self):
74
101
  _set_switcher = {
75
- type(None): lambda v : None,
102
+ type(None): lambda v: None,
76
103
  # 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,
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,
86
113
  }
87
- func = _set_switcher[type(self.__value)] if type(self.__value) in _set_switcher else (lambda v : str(v))
88
- value = func(self.__value)
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)
89
122
  if self.mode == ParameterMode.REPLACED_LITERAL:
90
- try:
123
+ if isinstance(value, str) and value.isdigit() and str(int(value)) == value:
91
124
  value = int(value)
92
- except:
93
- try:
94
- value = float(value)
95
- except:
96
- pass
97
125
  return value
98
126
 
99
127
  def _copy_cached_info(self, desc, copy_replaced):
@@ -102,9 +130,11 @@ class _Parameter(intersystems_iris.dbapi._Descriptor._Descriptor):
102
130
  self.scale = desc.scale
103
131
  self.nullable = desc.nullable
104
132
  self.name = desc.name
105
- if ((self.mode != ParameterMode.REPLACED_LITERAL)
106
- and (desc.mode != ParameterMode.REPLACED_LITERAL)
107
- and (desc.mode != ParameterMode.UNKNOWN)):
133
+ if (
134
+ (self.mode != ParameterMode.REPLACED_LITERAL)
135
+ and (desc.mode != ParameterMode.REPLACED_LITERAL)
136
+ and (desc.mode != ParameterMode.UNKNOWN)
137
+ ):
108
138
  self.mode = desc.mode
109
139
 
110
140
  if not copy_replaced:
@@ -114,7 +144,8 @@ class _Parameter(intersystems_iris.dbapi._Descriptor._Descriptor):
114
144
  self.mode = ParameterMode.REPLACED_LITERAL
115
145
  self.__value = desc.value
116
146
  self._values = list()
117
- if len(desc._values) > 0: self._values.append(desc._values[0])
147
+ if len(desc._values) > 0:
148
+ self._values.append(desc._values[0])
118
149
  return
119
150
 
120
151
  def _bind(self, value, parameter_sets):
@@ -135,4 +166,4 @@ class _Parameter(intersystems_iris.dbapi._Descriptor._Descriptor):
135
166
  if self.mode == ParameterMode.OUTPUT or self.mode == ParameterMode.INPUT_OUTPUT:
136
167
  self.mode = ParameterMode.INPUT_OUTPUT
137
168
  else:
138
- self.mode = ParameterMode.INPUT
169
+ self.mode = ParameterMode.INPUT
@@ -34,7 +34,7 @@ class _ParameterCollection:
34
34
  self._array_bound = False
35
35
 
36
36
  def set_input_params(self, params):
37
- self._input_params = params
37
+ self._input_params = list(params)
38
38
 
39
39
  def collect(self, i: int = 0) -> list:
40
40
  params = list()
@@ -61,6 +61,14 @@ class _ParameterCollection:
61
61
 
62
62
  return params
63
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
+
64
72
  def __repr__(self) -> str:
65
73
  return repr(self.collect())
66
74
 
@@ -88,7 +88,7 @@ class _ResultSetRow:
88
88
  SQLType.TYPE_DATE: None,
89
89
  SQLType.TYPE_TIME: None,
90
90
  SQLType.TYPE_TIMESTAMP: None,
91
- SQLType.VARBINARY: None,
91
+ SQLType.VARBINARY: bytes,
92
92
  SQLType.VARCHAR: str,
93
93
  SQLType.WCHAR: None,
94
94
  SQLType.WLONGVARCHAR: None,
@@ -165,6 +165,8 @@ class _ResultSetRow:
165
165
  pass
166
166
  elif item is None:
167
167
  pass
168
+ elif value_type is bytes:
169
+ item = bytes(map(ord, item))
168
170
  elif issubclass(value_type, IRISStream):
169
171
  stream = value_type(self._connection, item)
170
172
  item = stream.fetch()
@@ -11,6 +11,15 @@ from intersystems_iris.dbapi._Parameter import ParameterMode
11
11
  from intersystems_iris.dbapi.preparser._Token import TOKEN
12
12
  from intersystems_iris.dbapi.preparser._Scanner import ParseToken
13
13
 
14
+ class MultiValuesInsert(Exception):
15
+
16
+ def __init__(self, *args: object, query: str, rows: int, params=None) -> None:
17
+ super().__init__(*args)
18
+ self.query = query
19
+ self.rows = rows
20
+ self.params = params
21
+
22
+
14
23
  # May want to move to its own file eventually
15
24
  # SQL Statement Types
16
25
  class StatementType(enum.IntEnum):
@@ -544,48 +553,48 @@ class _PreParser(object):
544
553
  return False, query
545
554
 
546
555
  def InsertMultiValues(self, query):
547
- try:
548
- new_query = ''
549
- values_list = []
550
-
551
- tokens = self.m_Tokens.GetEnumerator()
552
- while tokens.MoveNext() and not tokens.Current().UpperEquals("INSERT"):
553
- new_query += tokens.Current().Lexeme + ' '
554
- if not tokens.MoveNext() or not tokens.Current().UpperEquals("INTO"):
555
- return False, query
556
- new_query += 'INSERT INTO '
557
- while tokens.MoveNext() and not tokens.Current().UpperEquals("VALUES"):
558
- new_query += tokens.Current().Lexeme + ' '
556
+ new_query = ''
557
+ values_list = []
559
558
 
560
- values = ''
561
- while tokens.MoveNext():
562
- assert tokens.Current().TokenType is TOKEN.OPEN_PAREN
563
- open_parens = 1
564
- while tokens.MoveNext() or open_parens > 0:
565
- token = tokens.Current()
566
- if token.TokenType is TOKEN.OPEN_PAREN:
567
- open_parens += 1
568
- elif token.TokenType is TOKEN.CLOSE_PAREN:
569
- open_parens -= 1
570
- if open_parens == 0:
571
- break
572
- values += token.Lexeme
573
- values += ' '
574
- values_list.append(values)
575
- values = ''
576
- if not tokens.MoveNext() or tokens.Current().TokenType is not TOKEN.COMMA:
559
+ tokens = self.m_Tokens.GetEnumerator()
560
+ while tokens.MoveNext() and not tokens.Current().UpperEquals("INSERT"):
561
+ new_query += tokens.Current().Lexeme + ' '
562
+ if not tokens.MoveNext() or not tokens.Current().UpperEquals("INTO"):
563
+ return False, query
564
+ new_query += 'INSERT INTO '
565
+ while tokens.MoveNext() and not tokens.Current().UpperEquals("VALUES"):
566
+ new_query += tokens.Current().Lexeme + ' '
567
+
568
+ values = ''
569
+ params = []
570
+ while tokens.MoveNext():
571
+ assert tokens.Current().TokenType is TOKEN.OPEN_PAREN
572
+ open_parens = 1
573
+ while tokens.MoveNext() or open_parens > 0:
574
+ token = tokens.Current()
575
+ if token.TokenType is TOKEN.OPEN_PAREN:
576
+ open_parens += 1
577
+ elif token.TokenType is TOKEN.CLOSE_PAREN:
578
+ open_parens -= 1
579
+ if open_parens == 0:
577
580
  break
578
-
579
- if len(values_list) <= 1:
580
- return False, query
581
-
582
- new_query += ' SELECT '
583
- new_query += ' UNION ALL SELECT '.join(values_list)
584
-
585
- return True, new_query
586
- except:
581
+ if token.TokenType is TOKEN.CONSTANT:
582
+ values += '?'
583
+ params += [token.Lexeme]
584
+ else:
585
+ values += token.Lexeme
586
+ values += ' '
587
+ values_list.append(values)
588
+ values = ''
589
+ if not tokens.MoveNext() or tokens.Current().TokenType is not TOKEN.COMMA:
590
+ break
591
+
592
+ if len(values_list) <= 1:
587
593
  return False, query
588
594
 
595
+ new_query += f" VALUES ({values_list[0]})"
596
+ raise MultiValuesInsert(query=new_query, rows=len(values_list), params=params)
597
+
589
598
  # Parse a statement
590
599
  def Tokenize(self, p_strInput):
591
600
  # Get a scanner on the sql string
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: iris-pex-embedded-python
3
- Version: 2.3.17
3
+ Version: 2.3.18
4
4
  Summary: iris_pex_embedded_python
5
5
  Home-page: https://github.com/grongierisc/interoperability-embedded-python
6
6
  Author: grongier
@@ -42,7 +42,7 @@ grongier/iris/Grongier/PEX/PrivateSession/Message/Start.cls,sha256=DAtq4DyRqFq2_
42
42
  grongier/iris/Grongier/PEX/PrivateSession/Message/Stop.cls,sha256=ofVKjrN6UPFasalrjPFWYNwlJ5IBlAE62IH8_U07c0g,1435
43
43
  grongier/pex/__init__.py,sha256=nvcmRCxLy-lpL5GzlCKrmsSK8LF8Q0aKddx6ib8U50E,1166
44
44
  grongier/pex/__main__.py,sha256=ebEYPDOBKiXOlmdI4onpQLzfBKU4wyfijYyquA5dWV4,107
45
- grongier/pex/_business_host.py,sha256=a3sAXvX9h_SMYTDJPTGHXxalHrsD10i5Z8PO107htkU,17804
45
+ grongier/pex/_business_host.py,sha256=DB8dGQUEzcWaVzE4lbydt97uZqrkG1UbYIHgBD7UNq4,18190
46
46
  grongier/pex/_business_operation.py,sha256=W_B9Ci1fei8SGcElkAd13gV9S4BNKeQciTMVqxxJVZc,3509
47
47
  grongier/pex/_business_process.py,sha256=WtO1RCZUKykaxUFocI1XmZmnSQzEOz_VFsVFytsOzFE,11838
48
48
  grongier/pex/_business_service.py,sha256=8CgpjcdVmv5747CTa3Lw3B48RYXq2SQN9qfdxvqEI5g,3735
@@ -110,16 +110,16 @@ intersystems_iris/_SharedMemorySocket.py,sha256=2iUaS1FdJNSCUEaE-VT0O_dxF6NRwqZS
110
110
  intersystems_iris/__init__.py,sha256=Tk1tD28LwvF6X3yXQsJFLE1Bc-PR3gUJWcX5UnNYOdY,1773
111
111
  intersystems_iris/__main__.py,sha256=rCtINTfJcADMAsw1ja-MEO7Q-XekrWthYowzWV8xGIQ,218
112
112
  intersystems_iris/dbapi/_Column.py,sha256=VCLHLXs3wuGcUa9w_qy7HBFsuGvhmmI3kGYBagQg59U,2535
113
- intersystems_iris/dbapi/_DBAPI.py,sha256=K_hBqzKhowXey2Yyf981ZTlNf5S__A_le8BBoUIBlWY,94963
113
+ intersystems_iris/dbapi/_DBAPI.py,sha256=GR09iiA59NYfR4bB8YhdEwzZBQgyZaeGjqmmhUtoMJ0,101649
114
114
  intersystems_iris/dbapi/_Descriptor.py,sha256=IjyITxvjygDrhpk-0lGhdqQPh91SG6nTb1vi-AqyJNI,1391
115
- intersystems_iris/dbapi/_IRISStream.py,sha256=Vz3ydS9djxqqp-1F385FHgjjJNosXNpGMu-rkAPJDrs,2113
115
+ intersystems_iris/dbapi/_IRISStream.py,sha256=dGJntWo4HXgM1nUHZl2hA4xHkBFEU2xkoEplVDFWhnA,2115
116
116
  intersystems_iris/dbapi/_Message.py,sha256=jpLG3HZElqp981iNPFW8UNRO3NbHf6poEv6yywX0Ssw,4076
117
- intersystems_iris/dbapi/_Parameter.py,sha256=i8J37BnmIR-YHdsyfiht8NCh9fHhcY6B8ONPMch-sKE,4776
118
- intersystems_iris/dbapi/_ParameterCollection.py,sha256=ta8nuwHjTbY4V_ouOmNQv4C46u8eA6cdvij9xIWqQuo,5151
119
- intersystems_iris/dbapi/_ResultSetRow.py,sha256=o_lqYAmge8V9KjIWjiWKHUe8ZshgKypFJT6OLIQEjAo,12810
117
+ intersystems_iris/dbapi/_Parameter.py,sha256=PrfQQnfBf1R1M3P9oUrus6T5PROg35A8LO-RRFo6J1I,5202
118
+ intersystems_iris/dbapi/_ParameterCollection.py,sha256=kcgNiGv2nH5AwuA6LlPpM4dWqhSqRyD3VtwqHqDGRGU,5541
119
+ intersystems_iris/dbapi/_ResultSetRow.py,sha256=tNKCv5P8XhP9zzdPpBGiXYHLKOScITTBGSqtui1TAM0,12910
120
120
  intersystems_iris/dbapi/_SQLType.py,sha256=IlDacXwQzUMWaJ02Zsu2bUfvUC3-5mBx-m6mE0Yp7ts,557
121
121
  intersystems_iris/dbapi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
122
- intersystems_iris/dbapi/preparser/_PreParser.py,sha256=HQ0atgoFHteMq1TLPDDp139IpExSfYsGs90Lcf8eoaY,78588
122
+ intersystems_iris/dbapi/preparser/_PreParser.py,sha256=024w-s3n_JNsk_ISC8avJMK3QEZE3hSuD0Nr8arJdZw,78828
123
123
  intersystems_iris/dbapi/preparser/_Scanner.py,sha256=xA8rkKsaVba_mAgoXEeliyuMxNKe4vVmmw_klukdf_U,16163
124
124
  intersystems_iris/dbapi/preparser/_Token.py,sha256=9ZYrjvYJtMApAR7RtYzp32Hcoo3jB_YpG7ECo7p6QHA,2304
125
125
  intersystems_iris/dbapi/preparser/_TokenList.py,sha256=P74kA3DXxi7imt0mea4LPjCCc_gk50zsYLOCWON_JvA,6770
@@ -145,9 +145,9 @@ iris/irisbuiltins.py,sha256=0xMYrnTJ8q3WsQ8CXlKHYnfAVTIkO-PXDpdQ_SvHVpI,2687
145
145
  iris/irisloader.py,sha256=2ZLM0FlYNStTiZrXuvDcO-V_XZVgmB3R8vesmaqMqYA,4808
146
146
  irisnative/_IRISNative.py,sha256=HQ4nBhc8t8_5OtxdMG-kx1aa-T1znf2I8obZOPLOPzg,665
147
147
  irisnative/__init__.py,sha256=6YmvBLQSURsCPKaNg7LK-xpo4ipDjrlhKuwdfdNb3Kg,341
148
- iris_pex_embedded_python-2.3.17.dist-info/LICENSE,sha256=rZSiBFId_sfbJ6RL0GjjPX-InNLkNS9ou7eQsikciI8,1089
149
- iris_pex_embedded_python-2.3.17.dist-info/METADATA,sha256=Ie7RxyVctM1-e9ImrVZulyFHdg_NsNozGtXMoqwYXOU,48121
150
- iris_pex_embedded_python-2.3.17.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
151
- iris_pex_embedded_python-2.3.17.dist-info/entry_points.txt,sha256=atkAtHoIuwXcZ0jl5gwof0l__ru_lt8WhVYk6HxYf70,47
152
- iris_pex_embedded_python-2.3.17.dist-info/top_level.txt,sha256=Tl4ZHgeNefaZW2Oug30vSldhD-tWzixsIfzASBrZ9ps,43
153
- iris_pex_embedded_python-2.3.17.dist-info/RECORD,,
148
+ iris_pex_embedded_python-2.3.18.dist-info/LICENSE,sha256=rZSiBFId_sfbJ6RL0GjjPX-InNLkNS9ou7eQsikciI8,1089
149
+ iris_pex_embedded_python-2.3.18.dist-info/METADATA,sha256=qgmU6DQUBf-JkfKS8mnIgyFIzdUsEgLJU3w06Dnumwg,48121
150
+ iris_pex_embedded_python-2.3.18.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
151
+ iris_pex_embedded_python-2.3.18.dist-info/entry_points.txt,sha256=atkAtHoIuwXcZ0jl5gwof0l__ru_lt8WhVYk6HxYf70,47
152
+ iris_pex_embedded_python-2.3.18.dist-info/top_level.txt,sha256=Tl4ZHgeNefaZW2Oug30vSldhD-tWzixsIfzASBrZ9ps,43
153
+ iris_pex_embedded_python-2.3.18.dist-info/RECORD,,