/*
* Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
*
* This library is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library. If not, see .
*
* Authors: Sankar P
* Srinivasa Ragavan
*/
#if !defined (__CAMEL_H_INSIDE__) && !defined (CAMEL_COMPILATION)
#error "Only can be included directly."
#endif
#ifndef CAMEL_DB_H
#define CAMEL_DB_H
#include
#include
/* Standard GObject macros */
#define CAMEL_TYPE_DB \
(camel_db_get_type ())
#define CAMEL_DB(obj) \
(G_TYPE_CHECK_INSTANCE_CAST \
((obj), CAMEL_TYPE_DB, CamelDB))
#define CAMEL_DB_CLASS(cls) \
(G_TYPE_CHECK_CLASS_CAST \
((cls), CAMEL_TYPE_DB, CamelDBClass))
#define CAMEL_IS_DB(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE \
((obj), CAMEL_TYPE_DB))
#define CAMEL_IS_DB_CLASS(obj) \
(G_TYPE_CHECK_CLASS_TYPE \
((cls), CAMEL_TYPE_DB))
#define CAMEL_DB_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS \
((obj), CAMEL_TYPE_DB, CamelDBClass))
G_BEGIN_DECLS
typedef struct _CamelDB CamelDB;
typedef struct _CamelDBClass CamelDBClass;
typedef struct _CamelDBPrivate CamelDBPrivate;
/**
* CamelDB:
*
* Since: 2.24
**/
struct _CamelDB {
/*< private >*/
GObject parent;
CamelDBPrivate *priv;
};
struct _CamelDBClass {
/*< private >*/
GObjectClass parent_class;
/* Padding for future expansion */
gpointer reserved[20];
};
/**
* CamelDBCollate:
* @enc: a used encoding (SQLITE_UTF8)
* @length1: length of the @data1
* @data1: the first value, of lenth @length1
* @length2: length of the @data2
* @data2: the second value, of lenth @length2
*
* A collation callback function.
*
* Returns: less than zero, zero, or greater than zero value, the same as for example strcmp() does.
*
* Since: 2.24
**/
typedef gint (* CamelDBCollate)(gpointer enc, gint length1, gconstpointer data1, gint length2, gconstpointer data2);
/**
* CAMEL_DB_FILE:
*
* Since: 2.24
**/
#define CAMEL_DB_FILE "folders.db"
/* Hopefully no one will create a folder named EVO_IN_meM_hAnDlE */
/**
* CAMEL_DB_IN_MEMORY_TABLE:
*
* Since: 2.26
**/
#define CAMEL_DB_IN_MEMORY_TABLE "EVO_IN_meM_hAnDlE.temp"
/**
* CAMEL_DB_IN_MEMORY_DB:
*
* Since: 2.26
**/
#define CAMEL_DB_IN_MEMORY_DB "EVO_IN_meM_hAnDlE"
/**
* CAMEL_DB_IN_MEMORY_TABLE_LIMIT:
*
* Since: 2.26
**/
#define CAMEL_DB_IN_MEMORY_TABLE_LIMIT 100000
/**
* CAMEL_DB_FREE_CACHE_SIZE:
*
* Since: 2.24
**/
#define CAMEL_DB_FREE_CACHE_SIZE 2 * 1024 * 1024
/**
* CAMEL_DB_SLEEP_INTERVAL:
*
* Since: 2.24
**/
#define CAMEL_DB_SLEEP_INTERVAL 1*10*10
/**
* CamelMIRecord:
* @uid: Message UID
* @flags: Camel Message info flags
* @msg_type: unused
* @dirty: whether the message info requires upload to the server; it corresponds to #CAMEL_MESSAGE_FOLDER_FLAGGED
* @read: boolean read status
* @deleted: boolean deleted status
* @replied: boolean replied status
* @important: boolean important status
* @junk: boolean junk status
* @attachment: boolean attachment status
* @size: size of the mail
* @dsent: date sent
* @dreceived: date received
* @subject: subject of the mail
* @from: sender
* @to: recipient
* @cc: CC members
* @mlist: message list headers
* @followup_flag: followup flag / also can be queried to see for followup or not
* @followup_completed_on: completed date, can be used to see if completed
* @followup_due_by: to see the due by date
* @part: part / references / thread id
* @labels: labels of mails also called as userflags
* @usertags: composite string of user tags
* @cinfo: content info string - composite string
* @bdata: provider specific data
* @userheaders: value for user-defined message headers; Since: 3.42
* @preview: message body preview; Since: 3.42
*
* The extensive DB format, supporting basic searching and sorting.
*
* Since: 2.24
**/
typedef struct _CamelMIRecord {
const gchar *uid; /* stored in the string pool */
guint32 flags;
guint32 msg_type;
guint32 dirty;
gboolean read;
gboolean deleted;
gboolean replied;
gboolean important;
gboolean junk;
gboolean attachment;
guint32 size;
gint64 dsent; /* time_t */
gint64 dreceived; /* time_t */
const gchar *subject; /* stored in the string pool */
const gchar *from; /* stored in the string pool */
const gchar *to; /* stored in the string pool */
const gchar *cc; /* stored in the string pool */
const gchar *mlist; /* stored in the string pool */
gchar *followup_flag;
gchar *followup_completed_on;
gchar *followup_due_by;
gchar *part;
gchar *labels;
gchar *usertags;
gchar *cinfo;
gchar *bdata;
gchar *userheaders;
gchar *preview;
} CamelMIRecord;
/**
* CamelFIRecord:
* @folder_name: name of the folder
* @version: version of the saved information
* @flags: folder flags
* @nextuid: next free uid
* @timestamp: timestamp of the summary
* @saved_count: count of all messages
* @unread_count: count of unread messages
* @deleted_count: count of deleted messages
* @junk_count: count of junk messages
* @visible_count: count of visible (not deleted and not junk) messages
* @jnd_count: count of junk and not deleted messages
* @bdata: custom data of the #CamelFolderSummary descendants
*
* Values to store/load for single folder's #CamelFolderSummary structure.
*
* Since: 2.24
**/
typedef struct _CamelFIRecord {
gchar *folder_name;
guint32 version;
guint32 flags;
guint32 nextuid;
gint64 timestamp;
guint32 saved_count;
guint32 unread_count;
guint32 deleted_count;
guint32 junk_count;
guint32 visible_count;
guint32 jnd_count; /* Junked not deleted */
gchar *bdata;
} CamelFIRecord;
/**
* CamelDBKnownColumnNames:
* @CAMEL_DB_COLUMN_UNKNOWN: unknown column name
* @CAMEL_DB_COLUMN_ATTACHMENT: attachment
* @CAMEL_DB_COLUMN_BDATA: bdata
* @CAMEL_DB_COLUMN_CINFO: cinfo
* @CAMEL_DB_COLUMN_DELETED: deleted
* @CAMEL_DB_COLUMN_DELETED_COUNT: deleted_count
* @CAMEL_DB_COLUMN_DRECEIVED: dreceived
* @CAMEL_DB_COLUMN_DSENT: dsent
* @CAMEL_DB_COLUMN_FLAGS: flags
* @CAMEL_DB_COLUMN_FOLDER_NAME: folder_name
* @CAMEL_DB_COLUMN_FOLLOWUP_COMPLETED_ON: followup_completed_on
* @CAMEL_DB_COLUMN_FOLLOWUP_DUE_BY: followup_due_by
* @CAMEL_DB_COLUMN_FOLLOWUP_FLAG: followup_flag
* @CAMEL_DB_COLUMN_IMPORTANT: important
* @CAMEL_DB_COLUMN_JND_COUNT: jnd_count
* @CAMEL_DB_COLUMN_JUNK: junk
* @CAMEL_DB_COLUMN_JUNK_COUNT: junk_count
* @CAMEL_DB_COLUMN_LABELS: labels
* @CAMEL_DB_COLUMN_MAIL_CC: mail_cc
* @CAMEL_DB_COLUMN_MAIL_FROM: mail_from
* @CAMEL_DB_COLUMN_MAIL_TO: mail_to
* @CAMEL_DB_COLUMN_MLIST: mlist
* @CAMEL_DB_COLUMN_NEXTUID: nextuid
* @CAMEL_DB_COLUMN_PART: part
* @CAMEL_DB_COLUMN_PREVIEW: preview
* @CAMEL_DB_COLUMN_READ: read
* @CAMEL_DB_COLUMN_REPLIED: replied
* @CAMEL_DB_COLUMN_SAVED_COUNT: saved_count
* @CAMEL_DB_COLUMN_SIZE: size
* @CAMEL_DB_COLUMN_SUBJECT: subject
* @CAMEL_DB_COLUMN_TIME: time
* @CAMEL_DB_COLUMN_UID: uid
* @CAMEL_DB_COLUMN_UNREAD_COUNT: unread_count
* @CAMEL_DB_COLUMN_USERHEADERS: userheaders
* @CAMEL_DB_COLUMN_USERTAGS: usertags
* @CAMEL_DB_COLUMN_VERSION: version
* @CAMEL_DB_COLUMN_VISIBLE_COUNT: visible_count
* @CAMEL_DB_COLUMN_VUID: vuid
*
* An enum of all the known columns, which can be used for a quick column lookups.
*
* Since: 3.4
**/
typedef enum {
CAMEL_DB_COLUMN_UNKNOWN = -1,
CAMEL_DB_COLUMN_ATTACHMENT,
CAMEL_DB_COLUMN_BDATA,
CAMEL_DB_COLUMN_CINFO,
CAMEL_DB_COLUMN_DELETED,
CAMEL_DB_COLUMN_DELETED_COUNT,
CAMEL_DB_COLUMN_DRECEIVED,
CAMEL_DB_COLUMN_DSENT,
CAMEL_DB_COLUMN_FLAGS,
CAMEL_DB_COLUMN_FOLDER_NAME,
CAMEL_DB_COLUMN_FOLLOWUP_COMPLETED_ON,
CAMEL_DB_COLUMN_FOLLOWUP_DUE_BY,
CAMEL_DB_COLUMN_FOLLOWUP_FLAG,
CAMEL_DB_COLUMN_IMPORTANT,
CAMEL_DB_COLUMN_JND_COUNT,
CAMEL_DB_COLUMN_JUNK,
CAMEL_DB_COLUMN_JUNK_COUNT,
CAMEL_DB_COLUMN_LABELS,
CAMEL_DB_COLUMN_MAIL_CC,
CAMEL_DB_COLUMN_MAIL_FROM,
CAMEL_DB_COLUMN_MAIL_TO,
CAMEL_DB_COLUMN_MLIST,
CAMEL_DB_COLUMN_NEXTUID,
CAMEL_DB_COLUMN_PART,
CAMEL_DB_COLUMN_PREVIEW,
CAMEL_DB_COLUMN_READ,
CAMEL_DB_COLUMN_REPLIED,
CAMEL_DB_COLUMN_SAVED_COUNT,
CAMEL_DB_COLUMN_SIZE,
CAMEL_DB_COLUMN_SUBJECT,
CAMEL_DB_COLUMN_TIME,
CAMEL_DB_COLUMN_UID,
CAMEL_DB_COLUMN_UNREAD_COUNT,
CAMEL_DB_COLUMN_USERHEADERS,
CAMEL_DB_COLUMN_USERTAGS,
CAMEL_DB_COLUMN_VERSION,
CAMEL_DB_COLUMN_VISIBLE_COUNT,
CAMEL_DB_COLUMN_VUID
} CamelDBKnownColumnNames;
CamelDBKnownColumnNames camel_db_get_column_ident (GHashTable **hash, gint index, gint ncols, gchar **col_names);
/**
* CamelDBSelectCB:
* @user_data: a callback user data
* @ncol: how many columns is provided
* @colvalues: (array length=ncol): array of column values, as UTF-8 strings
* @colnames: (array length=ncol): array of column names
*
* A callback called for the SELECT statements. The items at the same index of @colvalues
* and @colnames correspond to each other.
*
* Returns: 0 to continue the SELECT execution, non-zero to abort the execution.
*
* Since: 2.24
**/
typedef gint (* CamelDBSelectCB) (gpointer user_data, gint ncol, gchar **colvalues, gchar **colnames);
GType camel_db_get_type (void) G_GNUC_CONST;
CamelDB * camel_db_new (const gchar *filename,
GError **error);
const gchar * camel_db_get_filename (CamelDB *cdb);
gint camel_db_command (CamelDB *cdb,
const gchar *stmt,
GError **error);
gint camel_db_transaction_command (CamelDB *cdb,
const GList *qry_list,
GError **error);
gint camel_db_begin_transaction (CamelDB *cdb,
GError **error);
gint camel_db_add_to_transaction (CamelDB *cdb,
const gchar *query,
GError **error);
gint camel_db_end_transaction (CamelDB *cdb,
GError **error);
gint camel_db_abort_transaction (CamelDB *cdb,
GError **error);
gint camel_db_clear_folder_summary (CamelDB *cdb,
const gchar *folder_name,
GError **error);
gint camel_db_rename_folder (CamelDB *cdb,
const gchar *old_folder_name,
const gchar *new_folder_name,
GError **error);
gint camel_db_delete_folder (CamelDB *cdb,
const gchar *folder_name,
GError **error);
gint camel_db_delete_uid (CamelDB *cdb,
const gchar *folder_name,
const gchar *uid,
GError **error);
gint camel_db_delete_uids (CamelDB *cdb,
const gchar *folder_name,
const GList *uids,
GError **error);
gint camel_db_create_folders_table (CamelDB *cdb,
GError **error);
gint camel_db_select (CamelDB *cdb,
const gchar *stmt,
CamelDBSelectCB callback,
gpointer user_data,
GError **error);
gint camel_db_write_folder_info_record
(CamelDB *cdb,
CamelFIRecord *record,
GError **error);
gint camel_db_read_folder_info_record
(CamelDB *cdb,
const gchar *folder_name,
CamelFIRecord *record,
GError **error);
gint camel_db_prepare_message_info_table
(CamelDB *cdb,
const gchar *folder_name,
GError **error);
gint camel_db_write_message_info_record
(CamelDB *cdb,
const gchar *folder_name,
CamelMIRecord *record,
GError **error);
gint camel_db_read_message_info_records
(CamelDB *cdb,
const gchar *folder_name,
gpointer user_data,
CamelDBSelectCB callback,
GError **error);
gint camel_db_read_message_info_record_with_uid
(CamelDB *cdb,
const gchar *folder_name,
const gchar *uid,
gpointer user_data,
CamelDBSelectCB callback,
GError **error);
gint camel_db_count_junk_message_info
(CamelDB *cdb,
const gchar *table_name,
guint32 *count,
GError **error);
gint camel_db_count_unread_message_info
(CamelDB *cdb,
const gchar *table_name,
guint32 *count,
GError **error);
gint camel_db_count_deleted_message_info
(CamelDB *cdb,
const gchar *table_name,
guint32 *count,
GError **error);
gint camel_db_count_total_message_info
(CamelDB *cdb,
const gchar *table_name,
guint32 *count,
GError **error);
gint camel_db_count_visible_message_info
(CamelDB *cdb,
const gchar *table_name,
guint32 *count,
GError **error);
gint camel_db_count_visible_unread_message_info
(CamelDB *cdb,
const gchar *table_name,
guint32 *count,
GError **error);
gint camel_db_count_junk_not_deleted_message_info
(CamelDB *cdb,
const gchar *table_name,
guint32 *count,
GError **error);
gint camel_db_count_message_info (CamelDB *cdb,
const gchar *query,
guint32 *count,
GError **error);
gint camel_db_get_folder_uids (CamelDB *cdb,
const gchar *folder_name,
const gchar *sort_by,
const gchar *collate,
GHashTable *hash,
GError **error);
GPtrArray * camel_db_get_folder_junk_uids (CamelDB *cdb,
const gchar *folder_name,
GError **error);
GPtrArray * camel_db_get_folder_deleted_uids
(CamelDB *cdb,
const gchar *folder_name,
GError **error);
gint camel_db_set_collate (CamelDB *cdb,
const gchar *col,
const gchar *collate,
CamelDBCollate func);
gint camel_db_start_in_memory_transactions
(CamelDB *cdb,
GError **error);
gint camel_db_flush_in_memory_transactions
(CamelDB *cdb,
const gchar *folder_name,
GError **error);
gint camel_db_reset_folder_version (CamelDB *cdb,
const gchar *folder_name,
gint reset_version,
GError **error);
gboolean camel_db_maybe_run_maintenance (CamelDB *cdb,
GError **error);
void camel_db_release_cache_memory (void);
gchar * camel_db_sqlize_string (const gchar *string);
void camel_db_free_sqlized_string (gchar *string);
gchar * camel_db_get_column_name (const gchar *raw_name);
void camel_db_camel_mir_free (CamelMIRecord *record);
G_END_DECLS
#endif