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