1 /** 2 * PostgreSQL major types oids. 3 * 4 * Copyright: © 2014 DSoftOut 5 * Authors: NCrashed <ncrashed@gmail.com> 6 */ 7 8 module dpq2.oids; 9 10 @safe: 11 12 @property OidType oid2oidType(Oid oid) pure 13 { 14 static assert(Oid.sizeof == OidType.sizeof); 15 16 return cast(OidType)(oid); 17 } 18 19 OidType oidConvTo(string s)(OidType type) 20 { 21 foreach(ref a; appropriateArrOid) 22 { 23 static if(s == "array") 24 { 25 if(a.value == type) 26 return a.array; 27 } 28 else 29 static if(s == "element") 30 { 31 if(a.array == type) 32 return a.value; 33 } 34 else 35 static assert(false, "Wrong oidConvTo type "~s); 36 } 37 38 import dpq2.result: AnswerConvException, ConvExceptionType; 39 import std.conv: to; 40 41 throw new AnswerConvException( // TODO: rename it to ValueConvException and move to value.d 42 ConvExceptionType.NOT_IMPLEMENTED, 43 "Conv to "~s~" for type "~type.to!string~" isn't defined", 44 __FILE__, __LINE__ 45 ); 46 } 47 48 package: 49 50 private struct AppropriateArrOid 51 { 52 OidType value; 53 OidType array; 54 } 55 56 private immutable AppropriateArrOid[] appropriateArrOid; 57 58 shared static this() 59 { 60 alias A = AppropriateArrOid; 61 62 with(OidType) 63 { 64 immutable AppropriateArrOid[] a = 65 [ 66 A(Text, TextArray), 67 A(Bool, BoolArray), 68 A(Int2, Int2Array), 69 A(Int4, Int4Array), 70 A(Int8, Int8Array), 71 A(Float4, Float4Array), 72 A(Float8, Float8Array) 73 ]; 74 75 appropriateArrOid = a; 76 } 77 } 78 79 import derelict.pq.pq: Oid; 80 81 bool isNativeInteger(OidType t) pure 82 { 83 with(OidType) 84 switch(t) 85 { 86 case Int8: 87 case Int2: 88 case Int4: 89 return true; 90 default: 91 break; 92 } 93 94 return false; 95 } 96 97 bool isNativeFloat(OidType t) pure 98 { 99 with(OidType) 100 switch(t) 101 { 102 case Float4: 103 case Float8: 104 return true; 105 default: 106 break; 107 } 108 109 return false; 110 } 111 112 bool isSupportedArray(OidType t) pure 113 { 114 with(OidType) 115 switch(t) 116 { 117 case BoolArray: 118 case ByteArrayArray: 119 case CharArray: 120 case Int2Array: 121 case Int4Array: 122 case TextArray: 123 case Int8Array: 124 case Float4Array: 125 case Float8Array: 126 case TimeStampArray: 127 case DateArray: 128 case TimeArray: 129 case NumericArray: 130 case UUIDArray: 131 case JsonArray: 132 //case JsonbArray: 133 return true; 134 default: 135 break; 136 } 137 138 return false; 139 } 140 141 OidType detectOidTypeFromNative(T)() 142 { 143 with(OidType) 144 { 145 static if(is(T == string)){ return Text; } else 146 static if(is(T == bool)){ return Bool; } else 147 static if(is(T == short)){ return Int2; } else 148 static if(is(T == int)){ return Int4; } else 149 static if(is(T == long)){ return Int8; } else 150 static if(is(T == float)){ return Float4; } else 151 static if(is(T == double)){ return Float8; } else 152 153 static assert(false, "Unsupported D type: "~T.stringof); 154 } 155 } 156 157 enum OidType : Oid 158 { 159 Undefined = 0, 160 161 Bool = 16, 162 ByteArray = 17, 163 Char = 18, 164 Name = 19, 165 Int8 = 20, 166 Int2 = 21, 167 Int2Vector = 22, 168 Int4 = 23, 169 RegProc = 24, 170 Text = 25, 171 Oid = 26, 172 Tid = 27, 173 Xid = 28, 174 Cid = 29, 175 OidVector = 30, 176 177 AccessControlList = 1033, 178 TypeCatalog = 71, 179 AttributeCatalog = 75, 180 ProcCatalog = 81, 181 ClassCatalog = 83, 182 183 Json = 114, 184 Jsonb = 3802, 185 Xml = 142, 186 NodeTree = 194, 187 StorageManager = 210, 188 189 Point = 600, 190 LineSegment = 601, 191 Path = 602, 192 Box = 603, 193 Polygon = 604, 194 Line = 628, 195 196 Float4 = 700, 197 Float8 = 701, 198 AbsTime = 702, 199 RelTime = 703, 200 Interval = 704, 201 Unknown = 705, 202 203 Circle = 718, 204 Money = 790, 205 MacAddress = 829, 206 HostAddress = 869, 207 NetworkAddress = 650, 208 209 FixedString = 1042, 210 VariableString = 1043, 211 212 Date = 1082, 213 Time = 1083, 214 TimeStamp = 1114, 215 TimeStampWithZone = 1184, 216 TimeInterval = 1186, 217 TimeWithZone = 1266, 218 219 FixedBitString = 1560, 220 VariableBitString = 1562, 221 222 Numeric = 1700, 223 RefCursor = 1790, 224 RegProcWithArgs = 2202, 225 RegOperator = 2203, 226 RegOperatorWithArgs = 2204, 227 RegClass = 2205, 228 RegType = 2206, 229 230 UUID = 2950, 231 TSVector = 3614, 232 GTSVector = 3642, 233 TSQuery = 3615, 234 RegConfig = 3734, 235 RegDictionary = 3769, 236 TXidSnapshot = 2970, 237 238 Int4Range = 3904, 239 NumRange = 3906, 240 TimeStampRange = 3908, 241 TimeStampWithZoneRange = 3910, 242 DateRange = 3912, 243 Int8Range = 3926, 244 245 // Arrays 246 XmlArray = 143, 247 JsonArray = 3807, 248 JsonbArray = 199, 249 BoolArray = 1000, 250 ByteArrayArray = 1001, 251 CharArray = 1002, 252 NameArray = 1003, 253 Int2Array = 1005, 254 Int2VectorArray = 1006, 255 Int4Array = 1007, 256 RegProcArray = 1008, 257 TextArray = 1009, 258 OidArray = 1028, 259 TidArray = 1010, 260 XidArray = 1011, 261 CidArray = 1012, 262 OidVectorArray = 1013, 263 FixedStringArray = 1014, 264 VariableStringArray = 1015, 265 Int8Array = 1016, 266 PointArray = 1017, 267 LineSegmentArray = 1018, 268 PathArray = 1019, 269 BoxArray = 1020, 270 Float4Array = 1021, 271 Float8Array = 1022, 272 AbsTimeArray = 1023, 273 RelTimeArray = 1024, 274 IntervalArray = 1025, 275 PolygonArray = 1027, 276 AccessControlListArray = 1034, 277 MacAddressArray = 1040, 278 HostAdressArray = 1041, 279 NetworkAdressArray = 651, 280 CStringArray = 1263, 281 TimeStampArray = 1115, 282 DateArray = 1182, 283 TimeArray = 1183, 284 TimeStampWithZoneArray = 1185, 285 TimeIntervalArray = 1187, 286 NumericArray = 1231, 287 TimeWithZoneArray = 1270, 288 FixedBitStringArray = 1561, 289 VariableBitStringArray = 1563, 290 RefCursorArray = 2201, 291 RegProcWithArgsArray = 2207, 292 RegOperatorArray = 2208, 293 RegOperatorWithArgsArray = 2209, 294 RegClassArray = 2210, 295 RegTypeArray = 2211, 296 UUIDArray = 2951, 297 TSVectorArray = 3643, 298 GTSVectorArray = 3644, 299 TSQueryArray = 3645, 300 RegConfigArray = 3735, 301 RegDictionaryArray = 3770, 302 TXidSnapshotArray = 2949, 303 Int4RangeArray = 3905, 304 NumRangeArray = 3907, 305 TimeStampRangeArray = 3909, 306 TimeStampWithZoneRangeArray = 3911, 307 DateRangeArray = 3913, 308 Int8RangeArray = 3927, 309 310 // Pseudo types 311 Record = 2249, 312 RecordArray = 2287, 313 CString = 2275, 314 AnyVoid = 2276, 315 AnyArray = 2277, 316 Void = 2278, 317 Trigger = 2279, 318 EventTrigger = 3838, 319 LanguageHandler = 2280, 320 Internal = 2281, 321 Opaque = 2282, 322 AnyElement = 2283, 323 AnyNoArray = 2776, 324 AnyEnum = 3500, 325 FDWHandler = 3115, 326 AnyRange = 3831 327 }