merged: Linuxport revisions through to r15292.
[xbmc:xbmc-antiquated.git] / xbmc / lib / sqLite / qry_dat.h
1 /**********************************************************************
2  * Copyright (c) 2004, Leo Seib, Hannover
3  *
4  * Project:Dataset C++ Dynamic Library
5  * Module: FieldValue class and result sets classes header file
6  * Author: Leo Seib      E-Mail: leoseib@web.de
7  * Begin: 5/04/2002
8  *
9  * Permission is hereby granted, free of charge, to any person obtaining a copy
10  * of this software and associated documentation files (the "Software"), to deal
11  * in the Software without restriction, including without limitation the rights
12  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13  * copies of the Software, and to permit persons to whom the Software is
14  * furnished to do so, subject to the following conditions:
15  *
16  * The above copyright notice and this permission notice shall be included in
17  * all copies or substantial portions of the Software.
18  *
19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
22  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25  * THE SOFTWARE.
26  *
27  **********************************************************************/
28
29
30 #include <map>
31 #include <vector>
32 #include <iostream>
33 #include <string>
34
35 #ifndef _QRYDAT_H
36 #define _QRYDAT_H
37
38
39 namespace dbiplus {
40
41 enum fType { 
42         ft_String,
43         ft_Boolean,
44         ft_Char,
45         ft_WChar,
46         ft_WideString,
47         ft_Short,
48         ft_UShort,
49         ft_Long,
50         ft_ULong,
51         ft_Float,
52         ft_Double,
53         ft_LongDouble,
54         ft_Object
55     };
56
57
58
59 class field_value {
60 private:
61   fType field_type;
62   std::string str_value;
63   union {
64     bool   bool_value;
65     char   char_value;
66     short  short_value;
67     unsigned short ushort_value;
68     long   long_value;
69     unsigned long  ulong_value;
70     float  float_value;
71     double double_value;
72     void   *object_value;
73   } ;
74
75   bool is_null;
76
77 public:
78   field_value();
79   field_value(const char *s);
80   field_value(const bool b);
81   field_value(const char c);
82   field_value(const short s);
83   field_value(const unsigned short us);
84   field_value(const long l);
85   field_value(const unsigned long ul);
86   field_value(const int i);
87   field_value(const float f);
88   field_value(const double d);
89   field_value(const field_value & fv);
90   ~field_value();
91   
92
93   fType get_fType() const {return field_type;}
94   bool get_isNull() const {return is_null;}
95   std::string get_asString() const;
96   bool get_asBool() const;
97   char get_asChar() const;
98   short get_asShort() const;
99   unsigned short get_asUShort() const;
100   long get_asLong() const;
101   int get_asInteger() const;
102   unsigned long get_asULong() const;
103   float get_asFloat() const;
104   double get_asDouble() const;
105
106   field_value& operator= (const char *s)
107     {set_asString(s); return *this;}
108     field_value& operator= (const std::string &s)
109     {set_asString(s); return *this;}
110   field_value& operator= (const bool b)
111     {set_asBool(b); return *this;}
112   field_value& operator= (const short s)
113     {set_asShort(s); return *this;}
114   field_value& operator= (const unsigned short us)
115     {set_asUShort(us); return *this;}
116   field_value& operator= (const long l)
117     {set_asLong(l); return *this;}
118   field_value& operator= (const unsigned long l)
119     {set_asULong(l); return *this;}
120   field_value& operator= (const int i)
121     {set_asLong(i); return *this;}
122   field_value& operator= (const float f)
123     {set_asFloat(f); return *this;}
124   field_value& operator= (const double d)
125     {set_asDouble(d); return *this;}
126   field_value& operator= (const field_value & fv);
127   
128   //class ostream;
129   friend std::ostream& operator<< (std::ostream& os, const field_value &fv)
130   {switch (fv.get_fType()) {
131     case ft_String: {
132       return os << fv.get_asString();
133       break;
134     }
135     case ft_Boolean:{
136       return os << fv.get_asBool();
137       break;     
138     }
139     case ft_Char: {
140       return os << fv.get_asChar();
141       break;
142     }
143     case ft_Short: {
144       return os << fv.get_asShort();
145       break;
146     }
147     case ft_UShort: {
148       return os << fv.get_asUShort();
149       break;
150     }
151     case ft_Long: {
152       return os << fv.get_asLong();
153       break;
154     }
155     case ft_ULong: {
156       return os << fv.get_asULong();
157       break;
158     }
159     case ft_Float: {
160       return os << fv.get_asFloat();
161       break;
162     }
163     case ft_Double: {
164       return os << fv.get_asDouble();
165       break;
166     default:
167       return os;
168       break;
169     }
170   }
171   }
172
173   void set_isNull(){is_null=true;}
174   void set_asString(const char *s);
175   void set_asString(const std::string & s);
176   void set_asBool(const bool b);
177   void set_asChar(const char c);
178   void set_asShort(const short s);
179   void set_asUShort(const unsigned short us);
180   void set_asInteger(const int i);
181   void set_asLong(const long l);
182   void set_asULong(const unsigned long l);
183   void set_asFloat(const float f);
184   void set_asDouble(const double d);
185
186   fType get_field_type();
187   std::string gft();
188 };
189
190 struct field_prop {
191   std::string name,display_name;
192   fType type;
193   std::string field_table; //?
194   bool read_only;
195   unsigned int field_len;
196   unsigned int field_flags;
197   int idx;
198 };
199
200 struct field {
201   field_prop props;
202   field_value val;
203 }; 
204
205
206 typedef std::vector<field> Fields;
207 typedef std::vector<field_value> sql_record;
208 typedef std::vector<field_prop> record_prop;
209 typedef std::vector<sql_record*> query_data;
210 typedef field_value variant;
211
212 //typedef Fields::iterator fld_itor;
213 typedef sql_record::iterator rec_itor;
214 typedef record_prop::iterator recprop_itor;
215 typedef query_data::iterator qry_itor;
216
217 class result_set
218 {
219 public:
220   result_set()
221   {
222   };
223   ~result_set()
224   {
225     clear();
226   };
227   void clear()
228   {
229     for (unsigned int i = 0; i < records.size(); i++)
230       if (records[i])
231         delete records[i];
232     records.clear();
233     record_header.clear();
234   };
235
236   record_prop record_header;
237   query_data records;
238 };
239
240 } // namespace
241
242 #endif