Skip to content

Commit c8c64fa

Browse files
committed
UUID as %UniqeIdentifer in IRIS
1 parent f6d35c2 commit c8c64fa

File tree

3 files changed

+93
-16
lines changed

3 files changed

+93
-16
lines changed

sqlalchemy_iris/base.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ def check_constraints(cls):
9090
from .types import IRISTimeStamp
9191
from .types import IRISDate
9292
from .types import IRISDateTime
93+
from .types import IRISUniqueIdentifier
9394

9495

9596
ischema_names = {
@@ -748,6 +749,9 @@ def visit_DOUBLE(self, type_, **kw):
748749
def visit_TINYINT(self, type_, **kw):
749750
return "TINYINT"
750751

752+
def visit_UUID(self, type_, **kw):
753+
return "%UniqueIdentifier"
754+
751755

752756
class IRISIdentifierPreparer(sql.compiler.IdentifierPreparer):
753757
"""Install IRIS specific reserved words."""
@@ -804,6 +808,7 @@ def create_cursor(self):
804808
sqltypes.DateTime: IRISDateTime,
805809
sqltypes.TIMESTAMP: IRISTimeStamp,
806810
sqltypes.Time: IRISTime,
811+
sqltypes.UUID: IRISUniqueIdentifier,
807812
}
808813

809814

sqlalchemy_iris/requirements.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def array_type(self):
1919

2020
@property
2121
def uuid_data_type(self):
22-
return exclusions.closed()
22+
return exclusions.open()
2323

2424
@property
2525
def check_constraints(self):

sqlalchemy_iris/types.py

Lines changed: 87 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import datetime
22
from decimal import Decimal
33
from sqlalchemy.sql import sqltypes
4+
from uuid import UUID as _python_UUID
45

56
HOROLOG_ORDINAL = datetime.date(1840, 12, 31).toordinal()
67

@@ -16,13 +17,15 @@ def process(value):
1617
elif isinstance(value, bool):
1718
return 1 if value is True else 0
1819
return None
20+
1921
return process
2022

2123
def result_processor(self, dialect, coltype):
2224
def process(value):
2325
if isinstance(value, int):
2426
return value > 0
2527
return value
28+
2629
return process
2730

2831

@@ -40,8 +43,8 @@ def result_processor(self, dialect, coltype):
4043
def process(value):
4144
if value is None:
4245
return None
43-
if isinstance(value, str) and '-' in value[1:]:
44-
return datetime.datetime.strptime(value, '%Y-%m-%d').date()
46+
if isinstance(value, str) and "-" in value[1:]:
47+
return datetime.datetime.strptime(value, "%Y-%m-%d").date()
4548
horolog = int(value) + HOROLOG_ORDINAL
4649
return datetime.date.fromordinal(horolog)
4750

@@ -54,19 +57,19 @@ def process(value: datetime.datetime):
5457
if value is not None:
5558
# value = int(value.timestamp() * 1000000)
5659
# value += (2 ** 60) if value > 0 else -(2 ** 61 * 3)
57-
return value.strftime('%Y-%m-%d %H:%M:%S.%f')
60+
return value.strftime("%Y-%m-%d %H:%M:%S.%f")
5861
return value
5962

6063
return process
6164

6265
def result_processor(self, dialect, coltype):
6366
def process(value):
6467
if isinstance(value, str):
65-
if '.' not in value:
66-
value += '.0'
67-
return datetime.datetime.strptime(value, '%Y-%m-%d %H:%M:%S.%f')
68+
if "." not in value:
69+
value += ".0"
70+
return datetime.datetime.strptime(value, "%Y-%m-%d %H:%M:%S.%f")
6871
if isinstance(value, int):
69-
value -= (2 ** 60) if value > 0 else -(2 ** 61 * 3)
72+
value -= (2**60) if value > 0 else -(2**61 * 3)
7073
value = value / 1000000
7174
value = datetime.datetime.utcfromtimestamp(value)
7275
return value
@@ -78,17 +81,17 @@ class IRISDateTime(sqltypes.DateTime):
7881
def bind_processor(self, dialect):
7982
def process(value):
8083
if value is not None:
81-
return value.strftime('%Y-%m-%d %H:%M:%S.%f')
84+
return value.strftime("%Y-%m-%d %H:%M:%S.%f")
8285
return value
8386

8487
return process
8588

8689
def result_processor(self, dialect, coltype):
8790
def process(value):
8891
if isinstance(value, str):
89-
if '.' not in value:
90-
value += '.0'
91-
return datetime.datetime.strptime(value, '%Y-%m-%d %H:%M:%S.%f')
92+
if "." not in value:
93+
value += ".0"
94+
return datetime.datetime.strptime(value, "%Y-%m-%d %H:%M:%S.%f")
9295
return value
9396

9497
return process
@@ -98,17 +101,17 @@ class IRISTime(sqltypes.DateTime):
98101
def bind_processor(self, dialect):
99102
def process(value):
100103
if value is not None:
101-
return value.strftime('%H:%M:%S.%f')
104+
return value.strftime("%H:%M:%S.%f")
102105
return value
103106

104107
return process
105108

106109
def result_processor(self, dialect, coltype):
107110
def process(value):
108111
if isinstance(value, str):
109-
if '.' not in value:
110-
value += '.0'
111-
return datetime.datetime.strptime(value, '%H:%M:%S.%f').time()
112+
if "." not in value:
113+
value += ".0"
114+
return datetime.datetime.strptime(value, "%H:%M:%S.%f").time()
112115
if isinstance(value, int) or isinstance(value, Decimal):
113116
horolog = value
114117
hour = int(horolog // 3600)
@@ -122,6 +125,75 @@ def process(value):
122125
return process
123126

124127

128+
class IRISUniqueIdentifier(sqltypes.Uuid):
129+
def literal_processor(self, dialect):
130+
if not self.as_uuid:
131+
132+
def process(value):
133+
return f"""'{value.replace("'", "''")}'"""
134+
135+
return process
136+
else:
137+
138+
def process(value):
139+
return f"""'{str(value).replace("'", "''")}'"""
140+
141+
return process
142+
143+
def bind_processor(self, dialect):
144+
character_based_uuid = not dialect.supports_native_uuid or not self.native_uuid
145+
146+
if character_based_uuid:
147+
if self.as_uuid:
148+
149+
def process(value):
150+
if value is not None:
151+
value = str(value)
152+
return value
153+
154+
return process
155+
else:
156+
157+
def process(value):
158+
return value
159+
160+
return process
161+
else:
162+
return None
163+
164+
def result_processor(self, dialect, coltype):
165+
character_based_uuid = not dialect.supports_native_uuid or not self.native_uuid
166+
167+
if character_based_uuid:
168+
if self.as_uuid:
169+
170+
def process(value):
171+
if value and not isinstance(value, _python_UUID):
172+
value = _python_UUID(value)
173+
return value
174+
175+
return process
176+
else:
177+
178+
def process(value):
179+
if value and isinstance(value, _python_UUID):
180+
value = str(value)
181+
return value
182+
183+
return process
184+
else:
185+
if not self.as_uuid:
186+
187+
def process(value):
188+
if value and isinstance(value, _python_UUID):
189+
value = str(value)
190+
return value
191+
192+
return process
193+
else:
194+
return None
195+
196+
125197
class BIT(sqltypes.TypeEngine):
126198
__visit_name__ = "BIT"
127199

0 commit comments

Comments
 (0)