1 module hunt.entity.dialect.Dialect; 2 3 // import hunt.database; 4 import hunt.database.query.Common; 5 6 import std.conv; 7 import std.variant; 8 9 interface Dialect { 10 Variant fromSqlValue(DlangDataType fieldType, Variant fieldValue); 11 string toSqlValueImpl(DlangDataType type, Variant value); 12 13 string toSqlValue(T)(T val) { 14 Variant value = val; 15 DlangDataType type = getDlangDataType!T; 16 return toSqlValueImpl(type, value); 17 } 18 19 string getColumnDefinition(ColumnDefinitionInfo info); 20 } 21 22 public T safeConvert(F, T)(F value) { 23 try { 24 return to!T(value); 25 } catch (Exception ex){ 26 return T.init; 27 } 28 } 29 30 auto fromSQLType(uint type) { 31 return typeid(string); 32 } 33 34 struct SqlSingleTypeInfo { 35 SqlType sqlType; 36 int len; 37 bool unsigned; 38 } 39 40 struct ColumnDefinitionInfo { 41 int len = 0; 42 bool isId; 43 string name; 44 bool isAuto; 45 bool isNullable; 46 string dType; 47 } 48 49 // dfmt off 50 enum SqlSingleTypeInfo[PropertyMemberType] DTypeToSqlInfo = [ 51 PropertyMemberType.BOOL_TYPE : SqlSingleTypeInfo(SqlType.BOOLEAN, 2, false), 52 PropertyMemberType.SHORT_TYPE : SqlSingleTypeInfo(SqlType.SMALLINT, 4, false), 53 PropertyMemberType.USHORT_TYPE : SqlSingleTypeInfo(SqlType.SMALLINT, 4, true), 54 PropertyMemberType.INT_TYPE : SqlSingleTypeInfo(SqlType.INTEGER, 9, false), 55 PropertyMemberType.UINT_TYPE : SqlSingleTypeInfo(SqlType.INTEGER, 9, true), 56 PropertyMemberType.LONG_TYPE : SqlSingleTypeInfo(SqlType.BIGINT, 20, false), 57 PropertyMemberType.ULONG_TYPE : SqlSingleTypeInfo(SqlType.BIGINT, 20, true), 58 PropertyMemberType.BYTE_TYPE : SqlSingleTypeInfo(SqlType.TINYINT, 2, false), 59 PropertyMemberType.UBYTE_TYPE : SqlSingleTypeInfo(SqlType.TINYINT, 2, true), 60 PropertyMemberType.FLOAT_TYPE : SqlSingleTypeInfo(SqlType.FLOAT, 7, false), 61 PropertyMemberType.DOUBLE_TYPE : SqlSingleTypeInfo(SqlType.DOUBLE, 14, false), 62 PropertyMemberType.STRING_TYPE : SqlSingleTypeInfo(SqlType.VARCHAR, 0, false), 63 ]; 64 // dfmt on