summaryrefslogtreecommitdiff
path: root/libopie/pim/otodoaccesssql.cpp
Unidiff
Diffstat (limited to 'libopie/pim/otodoaccesssql.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/pim/otodoaccesssql.cpp31
1 files changed, 22 insertions, 9 deletions
diff --git a/libopie/pim/otodoaccesssql.cpp b/libopie/pim/otodoaccesssql.cpp
index a059dab..ea8b3c9 100644
--- a/libopie/pim/otodoaccesssql.cpp
+++ b/libopie/pim/otodoaccesssql.cpp
@@ -232,56 +232,58 @@ namespace {
232 } 232 }
233 QString EffQuery::out()const { 233 QString EffQuery::out()const {
234 QString str; 234 QString str;
235 str = QString("select uid from todolist where DueDate >= '%1-%2-%3' AND DueDate <= '%4-%5-%6'") 235 str = QString("select uid from todolist where DueDate >= '%1-%2-%3' AND DueDate <= '%4-%5-%6'")
236 .arg(m_start.year() ).arg(m_start.month() ).arg( m_start.day() ) 236 .arg(m_start.year() ).arg(m_start.month() ).arg( m_start.day() )
237 .arg(m_end. year() ).arg(m_end. month() ).arg(m_end.day() ); 237 .arg(m_end. year() ).arg(m_end. month() ).arg(m_end.day() );
238 238
239 return str; 239 return str;
240 } 240 }
241}; 241};
242 242
243OTodoAccessBackendSQL::OTodoAccessBackendSQL( const QString& file ) 243OTodoAccessBackendSQL::OTodoAccessBackendSQL( const QString& file )
244 : OTodoAccessBackend(), m_dict(15) 244 : OTodoAccessBackend(), m_dict(15), m_dirty(true)
245{ 245{
246 QString fi = file; 246 QString fi = file;
247 if ( fi.isEmpty() ) 247 if ( fi.isEmpty() )
248 fi = Global::applicationFileName( "todolist", "todolist.db" ); 248 fi = Global::applicationFileName( "todolist", "todolist.db" );
249 OSQLManager man; 249 OSQLManager man;
250 m_driver = man.standard(); 250 m_driver = man.standard();
251 m_driver->setUrl(fi); 251 m_driver->setUrl(fi);
252 fillDict(); 252 fillDict();
253} 253}
254 254
255OTodoAccessBackendSQL::~OTodoAccessBackendSQL(){ 255OTodoAccessBackendSQL::~OTodoAccessBackendSQL(){
256} 256}
257bool OTodoAccessBackendSQL::load(){ 257bool OTodoAccessBackendSQL::load(){
258 if (!m_driver->open() ) 258 if (!m_driver->open() )
259 return false; 259 return false;
260 260
261 CreateQuery creat; 261 CreateQuery creat;
262 OSQLResult res = m_driver->query(&creat ); 262 OSQLResult res = m_driver->query(&creat );
263 263
264 update(); 264 m_dirty = true;
265 qWarning("loaded %d", m_uids.count() );
266 return true; 265 return true;
267} 266}
268bool OTodoAccessBackendSQL::reload(){ 267bool OTodoAccessBackendSQL::reload(){
269 return load(); 268 return load();
270} 269}
271 270
272bool OTodoAccessBackendSQL::save(){ 271bool OTodoAccessBackendSQL::save(){
273 return m_driver->close(); 272 return m_driver->close();
274} 273}
275QArray<int> OTodoAccessBackendSQL::allRecords()const { 274QArray<int> OTodoAccessBackendSQL::allRecords()const {
275 if (m_dirty )
276 update();
277
276 return m_uids; 278 return m_uids;
277} 279}
278QArray<int> OTodoAccessBackendSQL::queryByExample( const OTodo& , int ){ 280QArray<int> OTodoAccessBackendSQL::queryByExample( const OTodo& , int ){
279 QArray<int> ints(0); 281 QArray<int> ints(0);
280 return ints; 282 return ints;
281} 283}
282OTodo OTodoAccessBackendSQL::find(int uid ) const{ 284OTodo OTodoAccessBackendSQL::find(int uid ) const{
283 FindQuery query( uid ); 285 FindQuery query( uid );
284 return todo( m_driver->query(&query) ); 286 return todo( m_driver->query(&query) );
285 287
286} 288}
287OTodo OTodoAccessBackendSQL::find( int uid, const QArray<int>& ints, 289OTodo OTodoAccessBackendSQL::find( int uid, const QArray<int>& ints,
@@ -294,25 +296,25 @@ OTodo OTodoAccessBackendSQL::find( int uid, const QArray<int>& ints,
294 // we try to cache 8 items 296 // we try to cache 8 items
295 switch( dir ) { 297 switch( dir ) {
296 /* forward */ 298 /* forward */
297 case 0: 299 case 0:
298 for (uint i = cur; i < ints.count() && size < 8; i++ ) { 300 for (uint i = cur; i < ints.count() && size < 8; i++ ) {
299 qWarning("size %d %d", size, ints[i] ); 301 qWarning("size %d %d", size, ints[i] );
300 search[size] = ints[i]; 302 search[size] = ints[i];
301 size++; 303 size++;
302 } 304 }
303 break; 305 break;
304 /* reverse */ 306 /* reverse */
305 case 1: 307 case 1:
306 for (uint i = cur; i >= 0 && size < 8; i-- ) { 308 for (uint i = cur; i != 0 && size < 8; i-- ) {
307 search[size] = ints[i]; 309 search[size] = ints[i];
308 size++; 310 size++;
309 } 311 }
310 break; 312 break;
311 } 313 }
312 search.resize( size ); 314 search.resize( size );
313 FindQuery query( search ); 315 FindQuery query( search );
314 OSQLResult res = m_driver->query( &query ); 316 OSQLResult res = m_driver->query( &query );
315 if ( res.state() != OSQLResult::Success ) 317 if ( res.state() != OSQLResult::Success )
316 return to; 318 return to;
317 319
318 return todo( res ); 320 return todo( res );
@@ -333,51 +335,54 @@ bool OTodoAccessBackendSQL::add( const OTodo& t) {
333 m_uids.resize( c+1 ); 335 m_uids.resize( c+1 );
334 m_uids[c] = t.uid(); 336 m_uids[c] = t.uid();
335 337
336 return true; 338 return true;
337} 339}
338bool OTodoAccessBackendSQL::remove( int uid ) { 340bool OTodoAccessBackendSQL::remove( int uid ) {
339 RemoveQuery rem( uid ); 341 RemoveQuery rem( uid );
340 OSQLResult res = m_driver->query(&rem ); 342 OSQLResult res = m_driver->query(&rem );
341 343
342 if ( res.state() == OSQLResult::Failure ) 344 if ( res.state() == OSQLResult::Failure )
343 return false; 345 return false;
344 346
345 update(); 347 m_dirty = true;
346 return true; 348 return true;
347} 349}
348/* 350/*
349 * FIXME better set query 351 * FIXME better set query
350 * but we need the cache for that 352 * but we need the cache for that
351 * now we remove 353 * now we remove
352 */ 354 */
353bool OTodoAccessBackendSQL::replace( const OTodo& t) { 355bool OTodoAccessBackendSQL::replace( const OTodo& t) {
354 remove( t.uid() ); 356 remove( t.uid() );
355 return add(t); 357 bool b= add(t);
358 m_dirty = false; // we changed some stuff but the UID stayed the same
359 return b;
356} 360}
357QArray<int> OTodoAccessBackendSQL::overDue() { 361QArray<int> OTodoAccessBackendSQL::overDue() {
358 OverDueQuery qu; 362 OverDueQuery qu;
359 return uids( m_driver->query(&qu ) ); 363 return uids( m_driver->query(&qu ) );
360} 364}
361QArray<int> OTodoAccessBackendSQL::effectiveToDos( const QDate& s, 365QArray<int> OTodoAccessBackendSQL::effectiveToDos( const QDate& s,
362 const QDate& t, 366 const QDate& t,
363 bool u) { 367 bool u) {
364 EffQuery ef(s, t, u ); 368 EffQuery ef(s, t, u );
365 return uids (m_driver->query(&ef) ); 369 return uids (m_driver->query(&ef) );
366} 370}
367/* 371/*
368 * 372 *
369 */ 373 */
370QArray<int> OTodoAccessBackendSQL::sorted( bool asc, int sortOrder, 374QArray<int> OTodoAccessBackendSQL::sorted( bool asc, int sortOrder,
371 int sortFilter, int cat ) { 375 int sortFilter, int cat ) {
376 qWarning("sorted %d, %d", asc, sortOrder );
372 QString query; 377 QString query;
373 query = "select uid from todolist WHERE "; 378 query = "select uid from todolist WHERE ";
374 379
375 /* 380 /*
376 * Sort Filter stuff 381 * Sort Filter stuff
377 * not that straight forward 382 * not that straight forward
378 * 383 *
379 */ 384 */
380 /* Category */ 385 /* Category */
381 if ( sortFilter & 1 ) { 386 if ( sortFilter & 1 ) {
382 QString str; 387 QString str;
383 if (cat != 0 ) str = QString::number( cat ); 388 if (cat != 0 ) str = QString::number( cat );
@@ -412,26 +417,29 @@ QArray<int> OTodoAccessBackendSQL::sorted( bool asc, int sortOrder,
412 query += "completed"; 417 query += "completed";
413 break; 418 break;
414 case 1: 419 case 1:
415 query += "priority"; 420 query += "priority";
416 break; 421 break;
417 case 2: 422 case 2:
418 query += "description"; 423 query += "description";
419 break; 424 break;
420 case 3: 425 case 3:
421 query += "DueDate"; 426 query += "DueDate";
422 break; 427 break;
423 } 428 }
424 if ( !asc ) 429
430 if ( !asc ) {
431 qWarning("not ascending!");
425 query += " DESC"; 432 query += " DESC";
433 }
426 434
427 qWarning( query ); 435 qWarning( query );
428 OSQLRawQuery raw(query ); 436 OSQLRawQuery raw(query );
429 return uids( m_driver->query(&raw) ); 437 return uids( m_driver->query(&raw) );
430} 438}
431bool OTodoAccessBackendSQL::date( QDate& da, const QString& str ) const{ 439bool OTodoAccessBackendSQL::date( QDate& da, const QString& str ) const{
432 if ( str == "0-0-0" ) 440 if ( str == "0-0-0" )
433 return false; 441 return false;
434 else{ 442 else{
435 int day, year, month; 443 int day, year, month;
436 QStringList list = QStringList::split("-", str ); 444 QStringList list = QStringList::split("-", str );
437 year = list[0].toInt(); 445 year = list[0].toInt();
@@ -492,31 +500,36 @@ void OTodoAccessBackendSQL::fillDict() {
492 m_dict.insert("Description" , new int(OTodo::Description) ); 500 m_dict.insert("Description" , new int(OTodo::Description) );
493 m_dict.insert("Summary" , new int(OTodo::Summary) ); 501 m_dict.insert("Summary" , new int(OTodo::Summary) );
494 m_dict.insert("Priority" , new int(OTodo::Priority) ); 502 m_dict.insert("Priority" , new int(OTodo::Priority) );
495 m_dict.insert("DateDay" , new int(OTodo::DateDay) ); 503 m_dict.insert("DateDay" , new int(OTodo::DateDay) );
496 m_dict.insert("DateMonth" , new int(OTodo::DateMonth) ); 504 m_dict.insert("DateMonth" , new int(OTodo::DateMonth) );
497 m_dict.insert("DateYear" , new int(OTodo::DateYear) ); 505 m_dict.insert("DateYear" , new int(OTodo::DateYear) );
498 m_dict.insert("Progress" , new int(OTodo::Progress) ); 506 m_dict.insert("Progress" , new int(OTodo::Progress) );
499 m_dict.insert("Completed", new int(OTodo::Completed) ); 507 m_dict.insert("Completed", new int(OTodo::Completed) );
500 m_dict.insert("CrossReference", new int(OTodo::CrossReference) ); 508 m_dict.insert("CrossReference", new int(OTodo::CrossReference) );
501 m_dict.insert("HasAlarmDateTime",new int(OTodo::HasAlarmDateTime) ); 509 m_dict.insert("HasAlarmDateTime",new int(OTodo::HasAlarmDateTime) );
502 m_dict.insert("AlarmDateTime", new int(OTodo::AlarmDateTime) ); 510 m_dict.insert("AlarmDateTime", new int(OTodo::AlarmDateTime) );
503} 511}
504void OTodoAccessBackendSQL::update() { 512/*
513 * need to be const so let's fool the
514 * compiler :(
515 */
516void OTodoAccessBackendSQL::update()const {
517 ((OTodoAccessBackendSQL*)this)->m_dirty = false;
505 LoadQuery lo; 518 LoadQuery lo;
506 OSQLResult res = m_driver->query(&lo); 519 OSQLResult res = m_driver->query(&lo);
507 if ( res.state() != OSQLResult::Success ) 520 if ( res.state() != OSQLResult::Success )
508 return; 521 return;
509 522
510 m_uids = uids( res ); 523 ((OTodoAccessBackendSQL*)this)->m_uids = uids( res );
511} 524}
512QArray<int> OTodoAccessBackendSQL::uids( const OSQLResult& res) const{ 525QArray<int> OTodoAccessBackendSQL::uids( const OSQLResult& res) const{
513 526
514 OSQLResultItem::ValueList list = res.results(); 527 OSQLResultItem::ValueList list = res.results();
515 OSQLResultItem::ValueList::Iterator it; 528 OSQLResultItem::ValueList::Iterator it;
516 QArray<int> ints(list.count() ); 529 QArray<int> ints(list.count() );
517 qWarning(" count = %d", list.count() ); 530 qWarning(" count = %d", list.count() );
518 531
519 int i = 0; 532 int i = 0;
520 for (it = list.begin(); it != list.end(); ++it ) { 533 for (it = list.begin(); it != list.end(); ++it ) {
521 ints[i] = (*it).data("uid").toInt(); 534 ints[i] = (*it).data("uid").toInt();
522 i++; 535 i++;