Diffstat (limited to 'libopie/pim/opimaccesstemplate.h') (more/less context) (show whitespace changes)
-rw-r--r-- | libopie/pim/opimaccesstemplate.h | 57 |
1 files changed, 54 insertions, 3 deletions
diff --git a/libopie/pim/opimaccesstemplate.h b/libopie/pim/opimaccesstemplate.h index 31ab516..92d7192 100644 --- a/libopie/pim/opimaccesstemplate.h +++ b/libopie/pim/opimaccesstemplate.h | |||
@@ -1,37 +1,39 @@ | |||
1 | #ifndef OPIE_PIM_ACCESS_TEMPLATE_H | 1 | #ifndef OPIE_PIM_ACCESS_TEMPLATE_H |
2 | #define OPIE_PIM_ACCESS_TEMPLATE_H | 2 | #define OPIE_PIM_ACCESS_TEMPLATE_H |
3 | 3 | ||
4 | #include <qarray.h> | 4 | #include <qarray.h> |
5 | 5 | ||
6 | #include <opie/opimrecord.h> | 6 | #include <opie/opimrecord.h> |
7 | #include <opie/opimaccessbackend.h> | 7 | #include <opie/opimaccessbackend.h> |
8 | #include <opie/orecordlist.h> | 8 | #include <opie/orecordlist.h> |
9 | 9 | ||
10 | #include "opimcache.h" | ||
10 | #include "otemplatebase.h" | 11 | #include "otemplatebase.h" |
11 | 12 | ||
12 | /** | 13 | /** |
13 | * Thats the frontend to our OPIE PIM | 14 | * Thats the frontend to our OPIE PIM |
14 | * Library. Either you want to use it's | 15 | * Library. Either you want to use it's |
15 | * interface or you want to implement | 16 | * interface or you want to implement |
16 | * your own Access lib | 17 | * your own Access lib |
17 | * Just create a OPimRecord and inherit from | 18 | * Just create a OPimRecord and inherit from |
18 | * the plugins | 19 | * the plugins |
19 | */ | 20 | */ |
20 | 21 | ||
21 | template <class T = OPimRecord > | 22 | template <class T = OPimRecord > |
22 | class OPimAccessTemplate : public OTemplateBase<T> { | 23 | class OPimAccessTemplate : public OTemplateBase<T> { |
23 | public: | 24 | public: |
24 | typedef ORecordList<T> List; | 25 | typedef ORecordList<T> List; |
25 | typedef OPimAccessBackend<T> BackEnd; | 26 | typedef OPimAccessBackend<T> BackEnd; |
27 | typedef OPimCache<T> Cache; | ||
26 | 28 | ||
27 | /** | 29 | /** |
28 | * our sort order | 30 | * our sort order |
29 | * should be safe explaining | 31 | * should be safe explaining |
30 | */ | 32 | */ |
31 | enum SortOrder { WildCards = 0, IgnoreCase = 1, | 33 | enum SortOrder { WildCards = 0, IgnoreCase = 1, |
32 | RegExp = 2, ExactMatch = 4 }; | 34 | RegExp = 2, ExactMatch = 4 }; |
33 | 35 | ||
34 | /** | 36 | /** |
35 | * c'tor BackEnd | 37 | * c'tor BackEnd |
36 | */ | 38 | */ |
37 | OPimAccessTemplate( BackEnd* end); | 39 | OPimAccessTemplate( BackEnd* end); |
@@ -64,24 +66,30 @@ public: | |||
64 | virtual List allRecords()const; | 66 | virtual List allRecords()const; |
65 | 67 | ||
66 | /** | 68 | /** |
67 | * queryByExample | 69 | * queryByExample |
68 | */ | 70 | */ |
69 | virtual List queryByExample( const T& t, int sortOrder ); | 71 | virtual List queryByExample( const T& t, int sortOrder ); |
70 | 72 | ||
71 | /** | 73 | /** |
72 | * find the OPimRecord uid | 74 | * find the OPimRecord uid |
73 | */ | 75 | */ |
74 | virtual T find( int uid )const; | 76 | virtual T find( int uid )const; |
75 | 77 | ||
78 | /** | ||
79 | * read ahead cache find method ;) | ||
80 | */ | ||
81 | virtual T find( int uid, const QArray<int>&, | ||
82 | uint current, CacheDirection dir = Forward )const; | ||
83 | |||
76 | /* invalidate cache here */ | 84 | /* invalidate cache here */ |
77 | /** | 85 | /** |
78 | * clears the backend and invalidates the backend | 86 | * clears the backend and invalidates the backend |
79 | */ | 87 | */ |
80 | virtual void clear() ; | 88 | virtual void clear() ; |
81 | 89 | ||
82 | /** | 90 | /** |
83 | * add T to the backend | 91 | * add T to the backend |
84 | */ | 92 | */ |
85 | virtual bool add( const T& t ) ; | 93 | virtual bool add( const T& t ) ; |
86 | 94 | ||
87 | /* only the uid matters */ | 95 | /* only the uid matters */ |
@@ -90,52 +98,61 @@ public: | |||
90 | */ | 98 | */ |
91 | virtual bool remove( const T& t ); | 99 | virtual bool remove( const T& t ); |
92 | 100 | ||
93 | /** | 101 | /** |
94 | * remove the OPimRecord with uid | 102 | * remove the OPimRecord with uid |
95 | */ | 103 | */ |
96 | virtual bool remove( int uid ); | 104 | virtual bool remove( int uid ); |
97 | 105 | ||
98 | /** | 106 | /** |
99 | * replace T from backend | 107 | * replace T from backend |
100 | */ | 108 | */ |
101 | virtual bool replace( const T& t) ; | 109 | virtual bool replace( const T& t) ; |
110 | |||
111 | /** | ||
112 | * @internal | ||
113 | */ | ||
114 | void cache( const T& )const; | ||
115 | void setSaneCacheSize( int ); | ||
102 | protected: | 116 | protected: |
103 | /** | 117 | /** |
104 | * invalidate the cache | 118 | * invalidate the cache |
105 | */ | 119 | */ |
106 | void invalidateCache(); | 120 | void invalidateCache(); |
107 | 121 | ||
108 | void setBackEnd( BackEnd* end ); | 122 | void setBackEnd( BackEnd* end ); |
109 | /** | 123 | /** |
110 | * returns the backend | 124 | * returns the backend |
111 | */ | 125 | */ |
112 | BackEnd* backEnd(); | 126 | BackEnd* backEnd(); |
113 | BackEnd* m_backEnd; | 127 | BackEnd* m_backEnd; |
128 | Cache m_cache; | ||
114 | 129 | ||
115 | }; | 130 | }; |
116 | 131 | ||
117 | template <class T> | 132 | template <class T> |
118 | OPimAccessTemplate<T>::OPimAccessTemplate( BackEnd* end ) | 133 | OPimAccessTemplate<T>::OPimAccessTemplate( BackEnd* end ) |
119 | : OTemplateBase<T>(), m_backEnd( end ) | 134 | : OTemplateBase<T>(), m_backEnd( end ) |
120 | { | 135 | { |
121 | 136 | if (end ) | |
137 | end->setFrontend( this ); | ||
122 | } | 138 | } |
123 | template <class T> | 139 | template <class T> |
124 | OPimAccessTemplate<T>::~OPimAccessTemplate() { | 140 | OPimAccessTemplate<T>::~OPimAccessTemplate() { |
125 | qWarning("~OPimAccessTemplate<T>"); | 141 | qWarning("~OPimAccessTemplate<T>"); |
126 | delete m_backEnd; | 142 | delete m_backEnd; |
127 | } | 143 | } |
128 | template <class T> | 144 | template <class T> |
129 | bool OPimAccessTemplate<T>::load() { | 145 | bool OPimAccessTemplate<T>::load() { |
146 | invalidateCache(); | ||
130 | return m_backEnd->load(); | 147 | return m_backEnd->load(); |
131 | } | 148 | } |
132 | template <class T> | 149 | template <class T> |
133 | bool OPimAccessTemplate<T>::reload() { | 150 | bool OPimAccessTemplate<T>::reload() { |
134 | return m_backEnd->reload(); | 151 | return m_backEnd->reload(); |
135 | } | 152 | } |
136 | template <class T> | 153 | template <class T> |
137 | bool OPimAccessTemplate<T>::save() { | 154 | bool OPimAccessTemplate<T>::save() { |
138 | return m_backEnd->save(); | 155 | return m_backEnd->save(); |
139 | } | 156 | } |
140 | template <class T> | 157 | template <class T> |
141 | OPimAccessTemplate<T>::List OPimAccessTemplate<T>::allRecords()const { | 158 | OPimAccessTemplate<T>::List OPimAccessTemplate<T>::allRecords()const { |
@@ -145,52 +162,86 @@ OPimAccessTemplate<T>::List OPimAccessTemplate<T>::allRecords()const { | |||
145 | } | 162 | } |
146 | template <class T> | 163 | template <class T> |
147 | OPimAccessTemplate<T>::List | 164 | OPimAccessTemplate<T>::List |
148 | OPimAccessTemplate<T>::queryByExample( const T& t, int sortOrder ) { | 165 | OPimAccessTemplate<T>::queryByExample( const T& t, int sortOrder ) { |
149 | QArray<int> ints = m_backEnd->queryByExample( t, sortOrder ); | 166 | QArray<int> ints = m_backEnd->queryByExample( t, sortOrder ); |
150 | 167 | ||
151 | List lis(ints, this ); | 168 | List lis(ints, this ); |
152 | return lis; | 169 | return lis; |
153 | } | 170 | } |
154 | template <class T> | 171 | template <class T> |
155 | T OPimAccessTemplate<T>::find( int uid ) const{ | 172 | T OPimAccessTemplate<T>::find( int uid ) const{ |
156 | T t = m_backEnd->find( uid ); | 173 | T t = m_backEnd->find( uid ); |
174 | cache( t ); | ||
175 | return t; | ||
176 | } | ||
177 | template <class T> | ||
178 | T OPimAccessTemplate<T>::find( int uid, const QArray<int>& ar, | ||
179 | uint current, CacheDirection dir )const { | ||
180 | /* | ||
181 | * better do T.isEmpty() | ||
182 | * after a find this way we would | ||
183 | * avoid two finds in QCache... | ||
184 | */ | ||
185 | // qWarning("find it now %d", uid ); | ||
186 | if (m_cache.contains( uid ) ) { | ||
187 | qWarning("m cache contains %d", uid); | ||
188 | return m_cache.find( uid ); | ||
189 | } | ||
190 | |||
191 | T t = m_backEnd->find( uid, ar, current, dir ); | ||
192 | qWarning("found it and cache it now %d", uid); | ||
193 | cache( t ); | ||
157 | return t; | 194 | return t; |
158 | } | 195 | } |
159 | template <class T> | 196 | template <class T> |
160 | void OPimAccessTemplate<T>::clear() { | 197 | void OPimAccessTemplate<T>::clear() { |
161 | invalidateCache(); | 198 | invalidateCache(); |
162 | m_backEnd->clear(); | 199 | m_backEnd->clear(); |
163 | } | 200 | } |
164 | template <class T> | 201 | template <class T> |
165 | bool OPimAccessTemplate<T>::add( const T& t ) { | 202 | bool OPimAccessTemplate<T>::add( const T& t ) { |
203 | cache( t ); | ||
166 | return m_backEnd->add( t ); | 204 | return m_backEnd->add( t ); |
167 | } | 205 | } |
168 | template <class T> | 206 | template <class T> |
169 | bool OPimAccessTemplate<T>::remove( const T& t ) { | 207 | bool OPimAccessTemplate<T>::remove( const T& t ) { |
170 | return m_backEnd->remove( t.uid() ); | 208 | return remove( t.uid() ); |
171 | } | 209 | } |
172 | template <class T> | 210 | template <class T> |
173 | bool OPimAccessTemplate<T>::remove( int uid ) { | 211 | bool OPimAccessTemplate<T>::remove( int uid ) { |
212 | m_cache.remove( uid ); | ||
174 | return m_backEnd->remove( uid ); | 213 | return m_backEnd->remove( uid ); |
175 | } | 214 | } |
176 | template <class T> | 215 | template <class T> |
177 | bool OPimAccessTemplate<T>::replace( const T& t ) { | 216 | bool OPimAccessTemplate<T>::replace( const T& t ) { |
217 | m_cache.replace( t ); | ||
178 | return m_backEnd->replace( t ); | 218 | return m_backEnd->replace( t ); |
179 | } | 219 | } |
180 | template <class T> | 220 | template <class T> |
181 | void OPimAccessTemplate<T>::invalidateCache() { | 221 | void OPimAccessTemplate<T>::invalidateCache() { |
182 | 222 | m_cache.invalidate(); | |
183 | } | 223 | } |
184 | template <class T> | 224 | template <class T> |
185 | OPimAccessTemplate<T>::BackEnd* OPimAccessTemplate<T>::backEnd() { | 225 | OPimAccessTemplate<T>::BackEnd* OPimAccessTemplate<T>::backEnd() { |
186 | return m_backEnd; | 226 | return m_backEnd; |
187 | } | 227 | } |
188 | template <class T> | 228 | template <class T> |
189 | bool OPimAccessTemplate<T>::wasChangedExternally()const { | 229 | bool OPimAccessTemplate<T>::wasChangedExternally()const { |
190 | return false; | 230 | return false; |
191 | } | 231 | } |
192 | template <class T> | 232 | template <class T> |
193 | void OPimAccessTemplate<T>::setBackEnd( BackEnd* end ) { | 233 | void OPimAccessTemplate<T>::setBackEnd( BackEnd* end ) { |
194 | m_backEnd = end; | 234 | m_backEnd = end; |
235 | if (m_backEnd ) | ||
236 | m_backEnd->setFrontend( this ); | ||
237 | } | ||
238 | template <class T> | ||
239 | void OPimAccessTemplate<T>::cache( const T& t ) const{ | ||
240 | /* hacky we need to work around the const*/ | ||
241 | ((OPimAccessTemplate<T>*)this)->m_cache.add( t ); | ||
242 | } | ||
243 | template <class T> | ||
244 | void OPimAccessTemplate<T>::setSaneCacheSize( int size ) { | ||
245 | m_cache.setSize( size ); | ||
195 | } | 246 | } |
196 | #endif | 247 | #endif |