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 }