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 }