~ubuntu-branches/ubuntu/maverick/evolution-data-server/maverick-proposed

« back to all changes in this revision

Viewing changes to camel/camel-db.c

  • Committer: Bazaar Package Importer
  • Author(s): Didier Roche
  • Date: 2010-05-17 17:02:06 UTC
  • mfrom: (1.1.79 upstream) (1.6.12 experimental)
  • Revision ID: james.westby@ubuntu.com-20100517170206-4ufr52vwrhh26yh0
Tags: 2.30.1-1ubuntu1
* Merge from debian experimental. Remaining change:
  (LP: #42199, #229669, #173703, #360344, #508494)
  + debian/control:
    - add Vcs-Bzr tag
    - don't use libgnome
    - Use Breaks instead of Conflicts against evolution 2.25 and earlier.
  + debian/evolution-data-server.install,
    debian/patches/45_libcamel_providers_version.patch:
    - use the upstream versioning, not a Debian-specific one 
  + debian/libedata-book1.2-dev.install, debian/libebackend-1.2-dev.install,
    debian/libcamel1.2-dev.install, debian/libedataserverui1.2-dev.install:
    - install html documentation
  + debian/rules:
    - don't build documentation it's shipped with the tarball

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
 
29
29
#include <config.h>
30
30
 
 
31
#include <ctype.h>
 
32
#include <stdio.h>
 
33
#include <stdlib.h>
31
34
#include <string.h>
32
 
#include <stdlib.h>
33
35
 
34
36
#include <glib.h>
35
37
#include <glib/gi18n-lib.h>
392
394
        return 0;
393
395
}
394
396
 
 
397
/* checks whether string 'where' contains whole word 'what',
 
398
   case insensitively (ascii, not utf8, same as 'LIKE' in SQLite3)
 
399
*/
 
400
static void
 
401
cdb_match_func (sqlite3_context *ctx, int nArgs, sqlite3_value **values)
 
402
{
 
403
        gboolean matches = FALSE;
 
404
        const gchar *what, *where;
 
405
 
 
406
        g_return_if_fail (ctx != NULL);
 
407
        g_return_if_fail (nArgs == 2);
 
408
        g_return_if_fail (values != NULL);
 
409
 
 
410
        what = (const gchar *) sqlite3_value_text (values[0]);
 
411
        where = (const gchar *) sqlite3_value_text (values[1]);
 
412
 
 
413
        if (what && where && !*what) {
 
414
                matches = TRUE;
 
415
        } else if (what && where) {
 
416
                gboolean word = TRUE;
 
417
                gint i, j;
 
418
 
 
419
                for (i = 0, j = 0; where[i] && !matches; i++) {
 
420
                        char c = where[i];
 
421
 
 
422
                        if (c == ' ') {
 
423
                                word = TRUE;
 
424
                                j = 0;
 
425
                        } else if (word && tolower (c) == tolower(what[j])) {
 
426
                                j++;
 
427
                                if (what[j] == 0 && (where[i + 1] == 0 || isspace (where[i + 1])))
 
428
                                        matches = TRUE;
 
429
                        } else {
 
430
                                word = FALSE;
 
431
                        }
 
432
                }
 
433
        }
 
434
 
 
435
        sqlite3_result_int (ctx, matches ? 1 : 0);
 
436
}
 
437
 
 
438
/**
 
439
 * camel_db_open:
 
440
 *
 
441
 * Since: 2.24
 
442
 **/
395
443
CamelDB *
396
444
camel_db_open (const gchar *path, CamelException *ex)
397
445
{
398
446
        static GOnce vfs_once = G_ONCE_INIT;
399
447
        CamelDB *cdb;
400
448
        sqlite3 *db;
401
 
        gchar *cache=NULL;
402
449
        gint ret;
403
450
 
404
451
        g_once (&vfs_once, (GThreadFunc) init_sqlite_vfs, NULL);
428
475
        cdb->priv->timer = NULL;
429
476
        d(g_print ("\nDatabase succesfully opened  \n"));
430
477
 
 
478
        sqlite3_create_function (db, "MATCH", 2, SQLITE_UTF8, NULL, cdb_match_func, NULL, NULL);
 
479
 
431
480
        /* Which is big / costlier ? A Stack frame or a pointer */
432
 
        if (g_getenv("CAMEL_SQLITE_DEFAULT_CACHE_SIZE")!=NULL)
 
481
        if (g_getenv("CAMEL_SQLITE_DEFAULT_CACHE_SIZE")!=NULL) {
 
482
                gchar *cache = NULL;
 
483
 
433
484
                cache = g_strdup_printf ("PRAGMA cache_size=%s", g_getenv("CAMEL_SQLITE_DEFAULT_CACHE_SIZE"));
434
 
 
435
 
        camel_db_command (cdb, cache, NULL);
436
 
        g_free (cache);
 
485
                camel_db_command (cdb, cache, NULL);
 
486
                g_free (cache);
 
487
        }
437
488
 
438
489
        camel_db_command (cdb, "ATTACH DATABASE ':memory:' AS mem", NULL);
439
490
 
448
499
        return cdb;
449
500
}
450
501
 
 
502
/**
 
503
 * camel_db_clone:
 
504
 *
 
505
 * Since: 2.26
 
506
 **/
451
507
CamelDB *
452
508
camel_db_clone (CamelDB *cdb, CamelException *ex)
453
509
{
454
510
        return camel_db_open(cdb->priv->file_name, ex);
455
511
}
456
512
 
 
513
/**
 
514
 * camel_db_close:
 
515
 *
 
516
 * Since: 2.24
 
517
 **/
457
518
void
458
519
camel_db_close (CamelDB *cdb)
459
520
{
465
526
        }
466
527
}
467
528
 
 
529
/**
 
530
 * camel_db_set_collate:
 
531
 *
 
532
 * Since: 2.24
 
533
 **/
468
534
gint
469
535
camel_db_set_collate (CamelDB *cdb, const gchar *col, const gchar *collate, CamelDBCollate func)
470
536
{
482
548
                return ret;
483
549
}
484
550
 
485
 
/* Should this be really exposed ? */
 
551
/**
 
552
 * camel_db_command:
 
553
 *
 
554
 * Since: 2.24
 
555
 **/
486
556
gint
487
557
camel_db_command (CamelDB *cdb, const gchar *stmt, CamelException *ex)
488
558
{
489
 
                gint ret;
490
 
 
491
 
                if (!cdb)
492
 
                        return TRUE;
493
 
                g_mutex_lock (cdb->lock);
494
 
 
495
 
                START(stmt);
496
 
                ret = cdb_sql_exec (cdb->db, stmt, ex);
497
 
                END;
498
 
                g_mutex_unlock (cdb->lock);
499
 
 
500
 
                return ret;
 
559
        gint ret;
 
560
 
 
561
        /* XXX Should this be really exposed ? */
 
562
 
 
563
        if (!cdb)
 
564
                return TRUE;
 
565
        g_mutex_lock (cdb->lock);
 
566
 
 
567
        START(stmt);
 
568
        ret = cdb_sql_exec (cdb->db, stmt, ex);
 
569
        END;
 
570
        g_mutex_unlock (cdb->lock);
 
571
 
 
572
        return ret;
501
573
}
502
574
 
 
575
/**
 
576
 * camel_db_begin_transaction:
 
577
 *
 
578
 * Since: 2.24
 
579
 **/
503
580
gint
504
581
camel_db_begin_transaction (CamelDB *cdb, CamelException *ex)
505
582
{
514
591
        return (cdb_sql_exec (cdb->db, "BEGIN", ex));
515
592
}
516
593
 
 
594
/**
 
595
 * camel_db_end_transaction:
 
596
 *
 
597
 * Since: 2.24
 
598
 **/
517
599
gint
518
600
camel_db_end_transaction (CamelDB *cdb, CamelException *ex)
519
601
{
532
614
        return ret;
533
615
}
534
616
 
 
617
/**
 
618
 * camel_db_abort_transaction:
 
619
 *
 
620
 * Since: 2.24
 
621
 **/
535
622
gint
536
623
camel_db_abort_transaction (CamelDB *cdb, CamelException *ex)
537
624
{
546
633
        return ret;
547
634
}
548
635
 
 
636
/**
 
637
 * camel_db_add_to_transaction:
 
638
 *
 
639
 * Since: 2.24
 
640
 **/
549
641
gint
550
642
camel_db_add_to_transaction (CamelDB *cdb, const gchar *stmt, CamelException *ex)
551
643
{
555
647
        return (cdb_sql_exec (cdb->db, stmt, ex));
556
648
}
557
649
 
 
650
/**
 
651
 * camel_db_transaction_command:
 
652
 *
 
653
 * Since: 2.24
 
654
 **/
558
655
gint
559
656
camel_db_transaction_command (CamelDB *cdb, GSList *qry_list, CamelException *ex)
560
657
{
599
696
        return 0;
600
697
}
601
698
 
 
699
/**
 
700
 * camel_db_count_message_info:
 
701
 *
 
702
 * Since: 2.26
 
703
 **/
602
704
gint
603
705
camel_db_count_message_info (CamelDB *cdb, const gchar *query, guint32 *count, CamelException *ex)
604
706
{
640
742
        return ret;
641
743
}
642
744
 
 
745
/**
 
746
 * camel_db_count_junk_message_info:
 
747
 *
 
748
 * Since: 2.24
 
749
 **/
643
750
gint
644
751
camel_db_count_junk_message_info (CamelDB *cdb, const gchar *table_name, guint32 *count, CamelException *ex)
645
752
{
657
764
        return ret;
658
765
}
659
766
 
 
767
/**
 
768
 * camel_db_count_unread_message_info:
 
769
 *
 
770
 * Since: 2.24
 
771
 **/
660
772
gint
661
773
camel_db_count_unread_message_info (CamelDB *cdb, const gchar *table_name, guint32 *count, CamelException *ex)
662
774
{
674
786
        return ret;
675
787
}
676
788
 
 
789
/**
 
790
 * camel_db_count_visible_unread_message_info:
 
791
 *
 
792
 * Since: 2.24
 
793
 **/
677
794
gint
678
795
camel_db_count_visible_unread_message_info (CamelDB *cdb, const gchar *table_name, guint32 *count, CamelException *ex)
679
796
{
691
808
        return ret;
692
809
}
693
810
 
 
811
/**
 
812
 * camel_db_count_visible_message_info:
 
813
 *
 
814
 * Since: 2.24
 
815
 **/
694
816
gint
695
817
camel_db_count_visible_message_info (CamelDB *cdb, const gchar *table_name, guint32 *count, CamelException *ex)
696
818
{
708
830
        return ret;
709
831
}
710
832
 
 
833
/**
 
834
 * camel_db_count_junk_not-deleted_message_info:
 
835
 *
 
836
 * Since: 2.24
 
837
 **/
711
838
gint
712
839
camel_db_count_junk_not_deleted_message_info (CamelDB *cdb, const gchar *table_name, guint32 *count, CamelException *ex)
713
840
{
725
852
        return ret;
726
853
}
727
854
 
 
855
/**
 
856
 * camel_db_count_deleted_message_info:
 
857
 *
 
858
 * Since: 2.24
 
859
 **/
728
860
gint
729
861
camel_db_count_deleted_message_info (CamelDB *cdb, const gchar *table_name, guint32 *count, CamelException *ex)
730
862
{
742
874
        return ret;
743
875
}
744
876
 
 
877
/**
 
878
 * camel_db_count_total_message_info:
 
879
 *
 
880
 * Since: 2.24
 
881
 **/
745
882
gint
746
883
camel_db_count_total_message_info (CamelDB *cdb, const gchar *table_name, guint32 *count, CamelException *ex)
747
884
{
760
897
        return ret;
761
898
}
762
899
 
 
900
/**
 
901
 * camel_db_select:
 
902
 *
 
903
 * Since: 2.24
 
904
 **/
763
905
gint
764
906
camel_db_select (CamelDB *cdb, const gchar * stmt, CamelDBSelectCB callback, gpointer data, CamelException *ex)
765
907
{
805
947
        return ret;
806
948
}
807
949
 
 
950
/**
 
951
 * camel_db_create_vfolder:
 
952
 *
 
953
 * Since: 2.24
 
954
 **/
808
955
gint
809
956
camel_db_create_vfolder (CamelDB *db, const gchar *folder_name, CamelException *ex)
810
957
{
828
975
        return ret;
829
976
}
830
977
 
 
978
/**
 
979
 * camel_db_recreate_vfolder:
 
980
 *
 
981
 * Since: 2.24
 
982
 **/
831
983
gint
832
984
camel_db_recreate_vfolder (CamelDB *db, const gchar *folder_name, CamelException *ex)
833
985
{
843
995
        return camel_db_create_vfolder (db, folder_name, ex);
844
996
}
845
997
 
 
998
/**
 
999
 * camel_db_delete_uid_from_vfolder:
 
1000
 *
 
1001
 * Since: 2.24
 
1002
 **/
846
1003
gint
847
1004
camel_db_delete_uid_from_vfolder (CamelDB *db, gchar *folder_name, gchar *vuid, CamelException *ex)
848
1005
{
858
1015
         return ret;
859
1016
}
860
1017
 
 
1018
/**
 
1019
 * camel_db_delete_uid_from_vfolder_transaction:
 
1020
 *
 
1021
 * Since: 2.24
 
1022
 **/
861
1023
gint
862
1024
camel_db_delete_uid_from_vfolder_transaction (CamelDB *db, const gchar *folder_name, const gchar *vuid, CamelException *ex)
863
1025
{
893
1055
         return 0;
894
1056
}
895
1057
 
 
1058
/**
 
1059
 * camel_db_get_folder_uids_flags:
 
1060
 *
 
1061
 * Since: 2.26
 
1062
 **/
896
1063
gint
897
1064
camel_db_get_folder_uids_flags (CamelDB *db, const gchar *folder_name, const gchar *sort_by, const gchar *collate, GPtrArray *summary, GHashTable *table, CamelException *ex)
898
1065
{
937
1104
         return 0;
938
1105
}
939
1106
 
 
1107
/**
 
1108
 * camel_db_get_folder_uids:
 
1109
 *
 
1110
 * Since: 2.24
 
1111
 **/
940
1112
gint
941
1113
camel_db_get_folder_uids (CamelDB *db, const gchar *folder_name, const gchar *sort_by, const gchar *collate, GPtrArray *array, CamelException *ex)
942
1114
{
951
1123
         return ret;
952
1124
}
953
1125
 
 
1126
/**
 
1127
 * camel_db_get_folder_junk_uids:
 
1128
 *
 
1129
 * Since: 2.24
 
1130
 **/
954
1131
GPtrArray *
955
1132
camel_db_get_folder_junk_uids (CamelDB *db, gchar *folder_name, CamelException *ex)
956
1133
{
971
1148
         return array;
972
1149
}
973
1150
 
 
1151
/**
 
1152
 * camel_db_get_folder_deleted_uids:
 
1153
 *
 
1154
 * Since: 2.24
 
1155
 **/
974
1156
GPtrArray *
975
1157
camel_db_get_folder_deleted_uids (CamelDB *db, gchar *folder_name, CamelException *ex)
976
1158
{
1011
1193
        return 0;
1012
1194
}
1013
1195
 
 
1196
/**
 
1197
 * camel_db_get_folder_preview:
 
1198
 *
 
1199
 * Since: 2.28
 
1200
 **/
1014
1201
GHashTable *
1015
1202
camel_db_get_folder_preview (CamelDB *db, gchar *folder_name, CamelException *ex)
1016
1203
{
1031
1218
         return hash;
1032
1219
}
1033
1220
 
 
1221
/**
 
1222
 * camel_db_write_preview_record:
 
1223
 *
 
1224
 * Since: 2.28
 
1225
 **/
1034
1226
gint
1035
1227
camel_db_write_preview_record (CamelDB *db, gchar *folder_name, const gchar *uid, const gchar *msg, CamelException *ex)
1036
1228
{
1064
1256
         return 0;
1065
1257
}
1066
1258
 
 
1259
/**
 
1260
 * camel_db_get_vuids_from_vfolder:
 
1261
 *
 
1262
 * Since: 2.24
 
1263
 **/
1067
1264
GPtrArray *
1068
1265
camel_db_get_vuids_from_vfolder (CamelDB *db, gchar *folder_name, gchar *filter, CamelException *ex)
1069
1266
{
1093
1290
         return array;
1094
1291
}
1095
1292
 
 
1293
/**
 
1294
 * camel_db_add_to_vfolder:
 
1295
 *
 
1296
 * Since: 2.24
 
1297
 **/
1096
1298
gint
1097
1299
camel_db_add_to_vfolder (CamelDB *db, gchar *folder_name, gchar *vuid, CamelException *ex)
1098
1300
{
1108
1310
         return ret;
1109
1311
}
1110
1312
 
 
1313
/**
 
1314
 * camel_db_add_to_vfolder_transaction:
 
1315
 *
 
1316
 * Since: 2.24
 
1317
 **/
1111
1318
gint
1112
 
camel_db_add_to_vfolder_transaction (CamelDB *db, gchar *folder_name, gchar *vuid, CamelException *ex)
 
1319
camel_db_add_to_vfolder_transaction (CamelDB *db, const gchar *folder_name, const gchar *vuid, CamelException *ex)
1113
1320
{
1114
1321
         gchar *ins_query;
1115
1322
         gint ret;
1123
1330
         return ret;
1124
1331
}
1125
1332
 
 
1333
/**
 
1334
 * camel_db_create_folders_table:
 
1335
 *
 
1336
 * Since: 2.24
 
1337
 **/
1126
1338
gint
1127
1339
camel_db_create_folders_table (CamelDB *cdb, CamelException *ex)
1128
1340
{
1138
1350
        gchar *table_creation_query, *safe_index;
1139
1351
 
1140
1352
        /* README: It is possible to compress all system flags into a single column and use just as userflags but that makes querying for other applications difficult an d bloats the parsing code. Instead, it is better to bloat the tables. Sqlite should have some optimizations for sparse columns etc. */
1141
 
        table_creation_query = sqlite3_mprintf ("CREATE TABLE IF NOT EXISTS %Q (  uid TEXT PRIMARY KEY , flags INTEGER , msg_type INTEGER , read INTEGER , deleted INTEGER , replied INTEGER , important INTEGER , junk INTEGER , attachment INTEGER , dirty INTEGER , size INTEGER , dsent NUMERIC , dreceived NUMERIC , subject TEXT , mail_from TEXT , mail_to TEXT , mail_cc TEXT , mlist TEXT , followup_flag TEXT , followup_completed_on TEXT , followup_due_by TEXT , part TEXT , labels TEXT , usertags TEXT , cinfo TEXT , bdata TEXT, created TEXT, modified TEXT )", folder_name);
 
1353
        table_creation_query = sqlite3_mprintf ("CREATE TABLE IF NOT EXISTS %Q (  uid TEXT PRIMARY KEY , flags INTEGER , msg_type INTEGER , read INTEGER , deleted INTEGER , replied INTEGER , important INTEGER , junk INTEGER , attachment INTEGER , dirty INTEGER , size INTEGER , dsent NUMERIC , dreceived NUMERIC , subject TEXT , mail_from TEXT , mail_to TEXT , mail_cc TEXT , mlist TEXT , followup_flag TEXT , followup_completed_on TEXT , followup_due_by TEXT , part TEXT , labels TEXT , usertags TEXT , cinfo TEXT , bdata TEXT, created TEXT, modified TEXT)", folder_name);
 
1354
        ret = camel_db_add_to_transaction (cdb, table_creation_query, ex);
 
1355
        sqlite3_free (table_creation_query);
 
1356
 
 
1357
        table_creation_query = sqlite3_mprintf ("CREATE TABLE IF NOT EXISTS '%q_bodystructure' (  uid TEXT PRIMARY KEY , bodystructure TEXT )", folder_name);
1142
1358
        ret = camel_db_add_to_transaction (cdb, table_creation_query, ex);
1143
1359
        sqlite3_free (table_creation_query);
1144
1360
 
1194
1410
        /* Migration stage one: storing the old data */
1195
1411
 
1196
1412
        if (version < 1) {
 
1413
 
1197
1414
                /* Between version 0-1 the following things are changed
1198
1415
                 * ADDED: created: time
1199
1416
                 * ADDED: modified: time
1233
1450
 
1234
1451
        /* Migration stage two: writing back the old data */
1235
1452
 
1236
 
        if (version < 1) {
 
1453
        if (version < 2) {
1237
1454
                table_creation_query = sqlite3_mprintf ("INSERT INTO %Q SELECT uid , flags , msg_type , read , deleted , replied , important , junk , attachment , dirty , size , dsent , dreceived , subject , mail_from , mail_to , mail_cc , mlist , followup_flag , followup_completed_on , followup_due_by , part , labels , usertags , cinfo , bdata, created, modified FROM 'mem.%q'", folder_name, folder_name);
1238
1455
                ret = camel_db_add_to_transaction (cdb, table_creation_query, ex);
1239
1456
                sqlite3_free (table_creation_query);
1248
1465
        return ret;
1249
1466
}
1250
1467
 
 
1468
/**
 
1469
 * camel_db_reset_folder_version:
 
1470
 *
 
1471
 * Since: 2.28
 
1472
 **/
1251
1473
gint
1252
1474
camel_db_reset_folder_version (CamelDB *cdb, const gchar *folder_name, gint reset_version, CamelException *ex)
1253
1475
{
1282
1504
        version_creation_query = sqlite3_mprintf ("CREATE TABLE IF NOT EXISTS '%q_version' ( version TEXT )", folder_name);
1283
1505
 
1284
1506
        if (old_version == -1)
1285
 
                version_insert_query = sqlite3_mprintf ("INSERT INTO '%q_version' VALUES ('1')", folder_name);
 
1507
                version_insert_query = sqlite3_mprintf ("INSERT INTO '%q_version' VALUES ('2')", folder_name);
1286
1508
        else
1287
 
                version_insert_query = sqlite3_mprintf ("UPDATE '%q_version' SET version='1'", folder_name);
 
1509
                version_insert_query = sqlite3_mprintf ("UPDATE '%q_version' SET version='2'", folder_name);
1288
1510
 
1289
1511
        ret = camel_db_add_to_transaction (cdb, version_creation_query, ex);
1290
1512
        ret = camel_db_add_to_transaction (cdb, version_insert_query, ex);
1318
1540
        return version;
1319
1541
}
1320
1542
 
 
1543
/**
 
1544
 * camel_db_prepare_message_info_table:
 
1545
 *
 
1546
 * Since: 2.24
 
1547
 **/
1321
1548
gint
1322
1549
camel_db_prepare_message_info_table (CamelDB *cdb, const gchar *folder_name, CamelException *ex)
1323
1550
{
1341
1568
        return ret;
1342
1569
}
1343
1570
 
 
1571
/**
 
1572
 * camel_db_write_fresh_message_info_record:
 
1573
 *
 
1574
 * Since: 2.26
 
1575
 **/
1344
1576
gint
1345
1577
camel_db_write_fresh_message_info_record (CamelDB *cdb, const gchar *folder_name, CamelMIRecord *record, CamelException *ex)
1346
1578
{
1347
1579
        return write_mir (cdb, folder_name, record, ex, FALSE);
1348
1580
}
1349
1581
 
 
1582
/**
 
1583
 * camel_db_write_message_info_record:
 
1584
 *
 
1585
 * Since: 2.24
 
1586
 **/
1350
1587
gint
1351
1588
camel_db_write_message_info_record (CamelDB *cdb, const gchar *folder_name, CamelMIRecord *record, CamelException *ex)
1352
1589
{
1396
1633
                        sqlite3_free (del_query); */
1397
1634
        sqlite3_free (ins_query);
1398
1635
 
 
1636
        if (ret == 0) {
 
1637
                ins_query = sqlite3_mprintf ("INSERT OR REPLACE INTO '%q_bodystructure' VALUES (%Q, %Q )",
 
1638
                                folder_name, record->uid, record->bodystructure);
 
1639
                ret = camel_db_add_to_transaction (cdb, ins_query, ex);
 
1640
                sqlite3_free (ins_query);
 
1641
        }
 
1642
 
1399
1643
        return ret;
1400
1644
}
1401
1645
 
 
1646
/**
 
1647
 * camel_db_write_folder_info_record:
 
1648
 *
 
1649
 * Since: 2.24
 
1650
 **/
1402
1651
gint
1403
1652
camel_db_write_folder_info_record (CamelDB *cdb, CamelFIRecord *record, CamelException *ex)
1404
1653
{
1487
1736
        return 0;
1488
1737
}
1489
1738
 
 
1739
/**
 
1740
 * camel_db_read_folder_info_record:
 
1741
 *
 
1742
 * Since: 2.24
 
1743
 **/
1490
1744
gint
1491
1745
camel_db_read_folder_info_record (CamelDB *cdb, const gchar *folder_name, CamelFIRecord **record, CamelException *ex)
1492
1746
{
1500
1754
        return (ret);
1501
1755
}
1502
1756
 
 
1757
/**
 
1758
 * camel_db_read_message_info_record_with_uid:
 
1759
 *
 
1760
 * Since: 2.24
 
1761
 **/
1503
1762
gint
1504
1763
camel_db_read_message_info_record_with_uid (CamelDB *cdb, const gchar *folder_name, const gchar *uid, gpointer p, CamelDBSelectCB read_mir_callback, CamelException *ex)
1505
1764
{
1513
1772
        return (ret);
1514
1773
}
1515
1774
 
 
1775
/**
 
1776
 * camel_db_read_message_info_records:
 
1777
 *
 
1778
 * Since: 2.24
 
1779
 **/
1516
1780
gint
1517
1781
camel_db_read_message_info_records (CamelDB *cdb, const gchar *folder_name, gpointer p, CamelDBSelectCB read_mir_callback, CamelException *ex)
1518
1782
{
1526
1790
        return (ret);
1527
1791
}
1528
1792
 
 
1793
/**
 
1794
 * camel_db_create_deleted_table:
 
1795
 *
 
1796
 * Since: 2.24
 
1797
 **/
1529
1798
static gint
1530
1799
camel_db_create_deleted_table (CamelDB *cdb, CamelException *ex)
1531
1800
{
1549
1818
        return ret;
1550
1819
}
1551
1820
 
 
1821
/**
 
1822
 * camel_db_delete_uid:
 
1823
 *
 
1824
 * Since: 2.24
 
1825
 **/
1552
1826
gint
1553
1827
camel_db_delete_uid (CamelDB *cdb, const gchar *folder, const gchar *uid, CamelException *ex)
1554
1828
{
1565
1839
 
1566
1840
        ret = camel_db_trim_deleted_table (cdb, ex);
1567
1841
 
 
1842
        tab = sqlite3_mprintf ("DELETE FROM '%q_bodystructure' WHERE uid = %Q", folder, uid);
 
1843
        ret = camel_db_add_to_transaction (cdb, tab, ex);
 
1844
        sqlite3_free (tab);
 
1845
 
1568
1846
        tab = sqlite3_mprintf ("DELETE FROM %Q WHERE uid = %Q", folder, uid);
1569
1847
        ret = camel_db_add_to_transaction (cdb, tab, ex);
1570
1848
        sqlite3_free (tab);
1646
1924
        return ret;
1647
1925
}
1648
1926
 
 
1927
/**
 
1928
 * camel_db_delete_uids:
 
1929
 *
 
1930
 * Since: 2.24
 
1931
 **/
1649
1932
gint
1650
1933
camel_db_delete_uids (CamelDB *cdb, const gchar * folder_name, GSList *uids, CamelException *ex)
1651
1934
{
1655
1938
        return cdb_delete_ids (cdb, folder_name, uids, "", "uid", ex);
1656
1939
}
1657
1940
 
 
1941
/**
 
1942
 * camel_db_delete_vuids:
 
1943
 *
 
1944
 * Since: 2.26
 
1945
 **/
1658
1946
gint
1659
1947
camel_db_delete_vuids (CamelDB *cdb, const gchar * folder_name, const gchar *hash, GSList *uids, CamelException *ex)
1660
1948
{
1661
1949
        return cdb_delete_ids (cdb, folder_name, uids, hash, "vuid", ex);
1662
1950
}
1663
1951
 
 
1952
/**
 
1953
 * camel_db_clear_folder_summary:
 
1954
 *
 
1955
 * Since: 2.24
 
1956
 **/
1664
1957
gint
1665
1958
camel_db_clear_folder_summary (CamelDB *cdb, gchar *folder, CamelException *ex)
1666
1959
{
1668
1961
 
1669
1962
        gchar *folders_del;
1670
1963
        gchar *msginfo_del;
 
1964
        gchar *bstruct_del;
1671
1965
        gchar *tab;
1672
1966
 
1673
1967
        folders_del = sqlite3_mprintf ("DELETE FROM folders WHERE folder_name = %Q", folder);
1674
1968
        msginfo_del = sqlite3_mprintf ("DELETE FROM %Q ", folder);
 
1969
        bstruct_del = sqlite3_mprintf ("DELETE FROM '%q_bodystructure' ", folder);
1675
1970
 
1676
1971
        camel_db_begin_transaction (cdb, ex);
1677
1972
 
1685
1980
 
1686
1981
        camel_db_add_to_transaction (cdb, msginfo_del, ex);
1687
1982
        camel_db_add_to_transaction (cdb, folders_del, ex);
 
1983
        camel_db_add_to_transaction (cdb, bstruct_del, ex);
1688
1984
 
1689
1985
        ret = camel_db_end_transaction (cdb, ex);
1690
1986
 
1691
1987
        sqlite3_free (folders_del);
1692
1988
        sqlite3_free (msginfo_del);
 
1989
        sqlite3_free (bstruct_del);
1693
1990
 
1694
1991
        return ret;
1695
1992
}
1696
1993
 
 
1994
/**
 
1995
 * camel_db_delete_folder:
 
1996
 *
 
1997
 * Since: 2.24
 
1998
 **/
1697
1999
gint
1698
2000
camel_db_delete_folder (CamelDB *cdb, const gchar *folder, CamelException *ex)
1699
2001
{
1719
2021
        ret = camel_db_add_to_transaction (cdb, del, ex);
1720
2022
        sqlite3_free (del);
1721
2023
 
 
2024
        del = sqlite3_mprintf ("DROP TABLE '%q_bodystructure' ", folder);
 
2025
        ret = camel_db_add_to_transaction (cdb, del, ex);
 
2026
        sqlite3_free (del);
 
2027
 
1722
2028
        ret = camel_db_end_transaction (cdb, ex);
1723
2029
 
1724
2030
        CAMEL_DB_RELEASE_SQLITE_MEMORY;
1725
2031
        return ret;
1726
2032
}
1727
2033
 
 
2034
/**
 
2035
 * camel_db_rename_folder:
 
2036
 *
 
2037
 * Since: 2.24
 
2038
 **/
1728
2039
gint
1729
2040
camel_db_rename_folder (CamelDB *cdb, const gchar *old_folder, const gchar *new_folder, CamelException *ex)
1730
2041
{
1763
2074
        return ret;
1764
2075
}
1765
2076
 
 
2077
/**
 
2078
 * camel_db_camel_mir_free:
 
2079
 *
 
2080
 * Since: 2.24
 
2081
 **/
1766
2082
void
1767
2083
camel_db_camel_mir_free (CamelMIRecord *record)
1768
2084
{
1781
2097
                g_free (record->usertags);
1782
2098
                g_free (record->cinfo);
1783
2099
                g_free (record->bdata);
 
2100
                g_free (record->bodystructure);
1784
2101
 
1785
2102
                g_free (record);
1786
2103
        }
1787
2104
}
1788
2105
 
 
2106
/**
 
2107
 * camel_db_sqlize_string:
 
2108
 *
 
2109
 * Since: 2.24
 
2110
 **/
1789
2111
gchar *
1790
2112
camel_db_sqlize_string (const gchar *string)
1791
2113
{
1792
2114
        return sqlite3_mprintf ("%Q", string);
1793
2115
}
1794
2116
 
 
2117
/**
 
2118
 * camel_db_free_sqlized_string:
 
2119
 *
 
2120
 * Since: 2.24
 
2121
 **/
1795
2122
void
1796
2123
camel_db_free_sqlized_string (gchar *string)
1797
2124
{
1813
2140
followup_completed_on TEXT ,
1814
2141
followup_due_by TEXT ," */
1815
2142
 
 
2143
/**
 
2144
 * camel_db_get_column_name:
 
2145
 *
 
2146
 * Since: 2.24
 
2147
 **/
1816
2148
gchar *
1817
2149
camel_db_get_column_name (const gchar *raw_name)
1818
2150
{
1847
2179
 
1848
2180
}
1849
2181
 
 
2182
/**
 
2183
 * camel_db_migrate_vfolders_to_14:
 
2184
 *
 
2185
 * Since: 2.24
 
2186
 **/
1850
2187
gint
1851
2188
camel_db_migrate_vfolders_to_14 (CamelDB *cdb, const gchar *folder, CamelException *ex)
1852
2189
{
1860
2197
        return ret;
1861
2198
}
1862
2199
 
1863
 
gint camel_db_start_in_memory_transactions (CamelDB *cdb, CamelException *ex)
 
2200
/**
 
2201
 * camel_db_start_in_memory_transactions:
 
2202
 *
 
2203
 * Since: 2.26
 
2204
 **/
 
2205
gint
 
2206
camel_db_start_in_memory_transactions (CamelDB *cdb, CamelException *ex)
1864
2207
{
1865
2208
        gint ret;
1866
2209
        gchar *cmd = sqlite3_mprintf ("ATTACH DATABASE ':memory:' AS %s", CAMEL_DB_IN_MEMORY_DB);
1877
2220
        return ret;
1878
2221
}
1879
2222
 
1880
 
gint camel_db_flush_in_memory_transactions (CamelDB *cdb, const gchar * folder_name, CamelException *ex)
 
2223
/**
 
2224
 * camel_db_flush_in_memory_transactions:
 
2225
 *
 
2226
 * Since: 2.26
 
2227
 **/
 
2228
gint
 
2229
camel_db_flush_in_memory_transactions (CamelDB *cdb, const gchar * folder_name, CamelException *ex)
1881
2230
{
1882
2231
        gint ret;
1883
2232
        gchar *cmd = sqlite3_mprintf ("INSERT INTO %Q SELECT * FROM %Q", folder_name, CAMEL_DB_IN_MEMORY_TABLE);