1 module hunt.sql.ast.SQLDataTypeImpl; 2 3 import hunt.sql.ast.SQLObjectImpl; 4 import hunt.sql.ast.SQLDataType; 5 import hunt.sql.ast.SQLExpr; 6 import hunt.sql.visitor.SQLASTVisitor; 7 import hunt.sql.ast.SQLObject; 8 import hunt.sql.util.FnvHash; 9 import hunt.sql.SQLUtils; 10 11 import hunt.Boolean; 12 import hunt.collection; 13 14 15 16 public class SQLDataTypeImpl : SQLObjectImpl , SQLDataType { 17 18 private string name; 19 private long _nameHashCode64; 20 protected List!SQLExpr arguments; 21 private Boolean withTimeZone; 22 private bool withLocalTimeZone = false; 23 private string dbType; 24 25 private bool unsigned; 26 private bool zerofill; 27 28 public this(){ 29 arguments = new ArrayList!SQLExpr(); 30 } 31 32 public this(string name){ 33 this.name = name; 34 arguments = new ArrayList!SQLExpr(); 35 } 36 37 public this(string name, int precision) { 38 this(name); 39 // addArgument(new SQLIntegerExpr(precision));@gxc 40 } 41 42 public this(string name, SQLExpr arg) { 43 this(name); 44 addArgument(arg); 45 } 46 47 public this(string name, int precision, int scale) { 48 this(name); 49 // addArgument(new SQLIntegerExpr(precision)); @gxc 50 // addArgument(new SQLIntegerExpr(scale)); @gxc 51 } 52 53 protected override void accept0(SQLASTVisitor visitor) { 54 if (visitor.visit(this)) { 55 acceptChild!SQLExpr(visitor, this.arguments); 56 } 57 58 visitor.endVisit(this); 59 } 60 61 public string getName() { 62 return this.name; 63 } 64 65 public long nameHashCode64() @trusted nothrow { 66 if (_nameHashCode64 == 0) { 67 _nameHashCode64 = FnvHash.hashCode64(name); 68 } 69 return _nameHashCode64; 70 } 71 72 public void setName(string name) { 73 this.name = name; 74 _nameHashCode64 = 0L; 75 } 76 77 public List!SQLExpr getArguments() { 78 return this.arguments; 79 } 80 81 public void addArgument(SQLExpr argument) { 82 if (argument !is null) { 83 argument.setParent(this); 84 } 85 this.arguments.add(argument); 86 } 87 88 override public bool opEquals(Object o) { 89 if (this == o) return true; 90 // if (o is null || typeid(this) != typeid(o)) return false; 91 92 SQLDataTypeImpl dataType = cast(SQLDataTypeImpl) o; 93 94 if (name !is null ? !(name == dataType.name) : dataType.name !is null) return false; 95 if (arguments !is null ? !(arguments == dataType.arguments) : dataType.arguments !is null) return false; 96 return withTimeZone !is null ? 97 (withTimeZone.value() == dataType.withTimeZone.value) : (dataType.withTimeZone is null); 98 } 99 100 override public size_t toHash() @trusted nothrow { 101 long value = nameHashCode64(); 102 return cast(size_t)(value ^ (value >>> 32)); 103 } 104 105 public override Boolean getWithTimeZone() { 106 return withTimeZone; 107 } 108 109 public void setWithTimeZone(Boolean withTimeZone) { 110 this.withTimeZone = withTimeZone; 111 } 112 113 public bool isWithLocalTimeZone() { 114 return withLocalTimeZone; 115 } 116 117 public void setWithLocalTimeZone(bool withLocalTimeZone) { 118 this.withLocalTimeZone = withLocalTimeZone; 119 } 120 121 public string getDbType() { 122 return dbType; 123 } 124 125 public void setDbType(string dbType) { 126 this.dbType = dbType; 127 } 128 129 public override SQLDataTypeImpl clone() { 130 SQLDataTypeImpl x = new SQLDataTypeImpl(); 131 132 cloneTo(x); 133 134 return x; 135 } 136 137 public void cloneTo(SQLDataTypeImpl x) { 138 x.dbType = dbType; 139 x.name = name; 140 x._nameHashCode64 = _nameHashCode64; 141 142 foreach(SQLExpr arg ; arguments) { 143 x.addArgument(arg.clone()); 144 } 145 146 x.withTimeZone = withTimeZone; 147 x.withLocalTimeZone = withLocalTimeZone; 148 x.zerofill = zerofill; 149 x.unsigned = unsigned; 150 } 151 152 public override string toString() { 153 return SQLUtils.toSQLString(this, dbType); 154 } 155 156 public bool isUnsigned() { 157 return unsigned; 158 } 159 160 public void setUnsigned(bool unsigned) { 161 this.unsigned = unsigned; 162 } 163 164 public bool isZerofill() { 165 return zerofill; 166 } 167 168 public void setZerofill(bool zerofill) { 169 this.zerofill = zerofill; 170 } 171 }