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