11import datetime
22from decimal import Decimal
33from sqlalchemy .sql import sqltypes
4+ from uuid import UUID as _python_UUID
45
56HOROLOG_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+
125197class BIT (sqltypes .TypeEngine ):
126198 __visit_name__ = "BIT"
127199
0 commit comments