44import re
55import string
66from abc import ABC , abstractmethod
7+ from base64 import b64encode
78from dataclasses import dataclass
89from enum import Enum
910from hashlib import sha1
10- from typing import TYPE_CHECKING , Any , Dict , List , Optional , Pattern , Tuple , Type , Union
11+ from typing import TYPE_CHECKING , Any , Dict , List , Optional , Tuple , Type
1112
12- from pydantic .main import BaseModel
1313from sqlalchemy import text
1414from sqlalchemy .engine import Dialect
1515from sqlalchemy .exc import ArgumentError , CompileError
@@ -328,6 +328,25 @@ def create_transaction_id() -> str:
328328 for _ in range (TRANSACTION_ID_LENGTH )
329329 )
330330
331+ @abstractmethod
332+ def get_field_from_value (self , value : Any ) -> Field :
333+ if isinstance (value , bool ):
334+ return Field (booleanValue = value )
335+ elif isinstance (value , str ):
336+ return Field (stringValue = value )
337+ elif type (value ).__name__ == 'datetime' :
338+ return Field (stringValue = str (value ))
339+ elif isinstance (value , int ):
340+ return Field (longValue = value )
341+ elif isinstance (value , float ):
342+ return Field (doubleValue = value )
343+ elif isinstance (value , bytes ):
344+ return Field (blobValue = b64encode (value ))
345+ elif value is None :
346+ return Field (isNull = True )
347+ else :
348+ raise Exception (f'unsupported type { type (value )} : { value } ' )
349+
331350 @abstractmethod
332351 def create_column_metadata_set (self , cursor : Cursor ) -> List [ColumnMetadata ]:
333352 raise NotImplementedError
@@ -369,7 +388,7 @@ def execute(
369388 response : ExecuteStatementResponse = ExecuteStatementResponse (
370389 numberOfRecordsUpdated = 0 ,
371390 records = [
372- [Field . from_value (column ) for column in row ]
391+ [self . get_field_from_value (column ) for column in row ]
373392 for row in cursor .fetchall ()
374393 ],
375394 )
@@ -383,7 +402,9 @@ def execute(
383402 last_generated_id : int = cursor .lastrowid
384403 generated_fields : List [Field ] = []
385404 if last_generated_id > 0 :
386- generated_fields .append (Field .from_value (last_generated_id ))
405+ generated_fields .append (
406+ self .get_field_from_value (last_generated_id )
407+ )
387408 return ExecuteStatementResponse (
388409 numberOfRecordsUpdated = rowcount ,
389410 generatedFields = generated_fields ,
0 commit comments