Delta Chat Core C-API
mrsqlite3.h
1 /*******************************************************************************
2  *
3  * Delta Chat Core
4  * Copyright (C) 2017 Björn Petersen
5  * Contact: r10s@b44t.com, http://b44t.com
6  *
7  * This program is free software: you can redistribute it and/or modify it under
8  * the terms of the GNU General Public License as published by the Free Software
9  * Foundation, either version 3 of the License, or (at your option) any later
10  * version.
11  *
12  * This program is distributed in the hope that it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
15  * details.
16  *
17  * You should have received a copy of the GNU General Public License along with
18  * this program. If not, see http://www.gnu.org/licenses/ .
19  *
20  ******************************************************************************/
21 
22 
23 #ifndef __MRSQLITE3_H__
24 #define __MRSQLITE3_H__
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
29 
30 /*** library-private **********************************************************/
31 
32 #include <sqlite3.h>
33 #include <libetpan/libetpan.h>
34 #include <pthread.h>
35 typedef struct mrmailbox_t mrmailbox_t;
36 
37 
38 /* predefined statements */
39 enum
40 {
41  BEGIN_transaction = 0 /* must be first */
42  ,ROLLBACK_transaction
43  ,COMMIT_transaction
44 
45  ,SELECT_v_FROM_config_k
46  ,INSERT_INTO_config_kv
47  ,UPDATE_config_vk
48  ,DELETE_FROM_config_k
49 
50  ,SELECT_COUNT_FROM_contacts
51  ,SELECT_naob_FROM_contacts_i
52  ,SELECT_inao_FROM_contacts_a
53  ,SELECT_id_FROM_contacts_WHERE_id
54  ,SELECT_na_FROM_chats_contacs_JOIN_contacts_WHERE_cc
55  ,SELECT_p_FROM_chats_contacs_JOIN_contacts_peerstates_WHERE_cc
56  ,SELECT_id_FROM_contacts_WHERE_chat_id
57  ,SELECT_id_FROM_contacts_ORDER_BY
58  ,SELECT_id_FROM_contacts_WHERE_query_ORDER_BY
59  ,SELECT_COUNT_FROM_contacts_WHERE_blocked
60  ,SELECT_id_FROM_contacts_WHERE_blocked
61  ,INSERT_INTO_contacts_neo
62  ,UPDATE_contacts_nao_WHERE_i
63  ,UPDATE_contacts_SET_origin_WHERE_id
64  ,UPDATE_contacts_SET_b_WHERE_i
65  ,DELETE_FROM_contacts_WHERE_id
66 
67  ,SELECT_COUNT_FROM_chats
68  ,SELECT_COUNT_FROM_chats_WHERE_archived
69  ,SELECT_ii_FROM_chats_LEFT_JOIN_msgs_WHERE_archived
70  ,SELECT_ii_FROM_chats_LEFT_JOIN_msgs_WHERE_unarchived
71  ,SELECT_ii_FROM_chats_LEFT_JOIN_msgs_WHERE_query
72  ,SELECT_itndd_FROM_chats_WHERE_i
73  ,SELECT_id_FROM_chats_WHERE_id
74  ,SELECT_id_FROM_chats_WHERE_contact_id
75  ,SELECT_id_FROM_CHATS_WHERE_grpid
76  ,SELECT_timestamp_FROM_msgs_WHERE_timestamp
77  ,SELECT_it_FROM_msgs_JOIN_chats_WHERE_rfc724
78  ,SELECT_MAX_timestamp_FROM_msgs
79  ,SELECT_rfc724_FROM_msgs_ORDER_BY_timestamp_LIMIT_1
80  ,UPDATE_chats_SET_draft_WHERE_id
81  ,UPDATE_chats_SET_n_WHERE_c
82  ,UPDATE_chats_SET_blocked
83  ,UPDATE_chats_SET_unarchived
84 
85  ,SELECT_a_FROM_chats_contacts_WHERE_i
86  ,SELECT_COUNT_FROM_chats_contacts_WHERE_chat_id
87  ,SELECT_COUNT_FROM_chats_contacts_WHERE_contact_id
88  ,SELECT_c_FROM_chats_contacts_WHERE_c
89  ,SELECT_c_FROM_chats_contacts_WHERE_c_ORDER_BY
90  ,SELECT_void_FROM_chats_contacts_WHERE_chat_id_AND_contact_id
91  ,INSERT_INTO_chats_contacts
92 
93  ,SELECT_COUNT_FROM_msgs_WHERE_assigned
94  ,SELECT_COUNT_FROM_msgs_WHERE_unassigned
95  ,SELECT_COUNT_FROM_msgs_WHERE_state_AND_chat_id
96  ,SELECT_COUNT_FROM_msgs_WHERE_chat_id
97  ,SELECT_COUNT_FROM_msgs_WHERE_rfc724_mid
98  ,SELECT_COUNT_FROM_msgs_WHERE_ft
99  ,SELECT_COUNT_DISTINCT_f_FROM_msgs_WHERE_c
100  ,SELECT_i_FROM_msgs_WHERE_ctt
101  ,SELECT_id_FROM_msgs_WHERE_cm
102  ,SELECT_id_FROM_msgs_WHERE_mcm
103  ,SELECT_id_FROM_msgs_WHERE_fresh_AND_deaddrop
104  ,SELECT_txt_raw_FROM_msgs_WHERE_id
105  ,SELECT_ircftttstpb_FROM_msg_WHERE_i
106  ,SELECT_ss_FROM_msgs_WHERE_m
107  ,SELECT_i_FROM_msgs_LEFT_JOIN_contacts_WHERE_c
108  ,SELECT_i_FROM_msgs_LEFT_JOIN_contacts_WHERE_starred
109  ,SELECT_i_FROM_msgs_LEFT_JOIN_contacts_WHERE_fresh
110  ,SELECT_i_FROM_msgs_WHERE_query
111  ,SELECT_i_FROM_msgs_WHERE_chat_id_AND_query
112  ,INSERT_INTO_msgs_msscftttsmttpb
113  ,INSERT_INTO_msgs_mcftttstpb
114  ,UPDATE_msgs_SET_chat_id_WHERE_id
115  ,UPDATE_msgs_SET_state_WHERE_id
116  ,UPDATE_msgs_SET_seen_WHERE_id_AND_chat_id_AND_freshORnoticed
117  ,UPDATE_msgs_SET_noticed_WHERE_id_AND_fresh
118  ,UPDATE_msgs_SET_state_WHERE_chat_id_AND_state
119  ,UPDATE_msgs_SET_state_WHERE_from_id_AND_state
120  ,UPDATE_msgs_SET_ss_WHERE_rfc724_mid
121  ,UPDATE_msgs_SET_param_WHERE_id
122  ,UPDATE_msgs_SET_starred_WHERE_id
123  ,DELETE_FROM_msgs_WHERE_id
124  ,DELETE_FROM_msgs_WHERE_rfc724_mid
125 
126  ,SELECT_c_FROM_msgs_mdns_WHERE_mc
127  ,INSERT_INTO_msgs_mdns
128  ,SELECT_COUNT_FROM_msgs_mdns_WHERE_m
129  ,DELETE_FROM_msgs_mdns_WHERE_m
130 
131  ,INSERT_INTO_jobs_aafp
132  ,SELECT_MIN_d_FROM_jobs
133  ,SELECT_iafp_FROM_jobs
134  ,DELETE_FROM_jobs_WHERE_id
135  ,DELETE_FROM_jobs_WHERE_action
136  ,UPDATE_jobs_SET_dp_WHERE_id
137 
138  ,SELECT_FROM_leftgrps_WHERE_grpid
139 
140  ,INSERT_INTO_acpeerstates_a
141  ,SELECT_aclpp_FROM_acpeerstates_WHERE_a
142  ,UPDATE_acpeerstates_SET_l_WHERE_a
143  ,UPDATE_acpeerstates_SET_lcpp_WHERE_a
144 
145  ,INSERT_INTO_keypairs_aippc
146  ,SELECT_private_key_FROM_keypairs_WHERE_default
147  ,SELECT_private_key_FROM_keypairs_ORDER_BY_default
148  ,SELECT_public_key_FROM_keypairs_WHERE_default
149 
150  ,PREDEFINED_CNT /* must be last */
151 };
152 
153 
162 typedef struct mrsqlite3_t
163 {
165  sqlite3_stmt* m_pd[PREDEFINED_CNT];
166  sqlite3* m_cobj;
167  int m_transactionCount;
168  mrmailbox_t* m_mailbox;
169  pthread_mutex_t m_critical_;
171 } mrsqlite3_t;
172 
173 
174 mrsqlite3_t* mrsqlite3_new (mrmailbox_t*);
175 void mrsqlite3_unref (mrsqlite3_t*);
176 
177 #define MR_OPEN_READONLY 0x01
178 int mrsqlite3_open__ (mrsqlite3_t*, const char* dbfile, int flags);
179 
180 void mrsqlite3_close__ (mrsqlite3_t*);
181 int mrsqlite3_is_open (const mrsqlite3_t*);
182 
183 /* handle configurations, private */
184 int mrsqlite3_set_config__ (mrsqlite3_t*, const char* key, const char* value);
185 int mrsqlite3_set_config_int__ (mrsqlite3_t*, const char* key, int32_t value);
186 char* mrsqlite3_get_config__ (mrsqlite3_t*, const char* key, const char* def); /* the returned string must be free()'d, returns NULL on errors */
187 int32_t mrsqlite3_get_config_int__ (mrsqlite3_t*, const char* key, int32_t def);
188 
189 /* tools, these functions are compatible to the corresponding sqlite3_* functions */
190 sqlite3_stmt* mrsqlite3_predefine__ (mrsqlite3_t*, size_t idx, const char* sql); /*the result is resetted as needed and must not be freed. CAVE: you must not call this function with different strings for the same index!*/
191 sqlite3_stmt* mrsqlite3_prepare_v2_ (mrsqlite3_t*, const char* sql); /* the result mus be freed using sqlite3_finalize() */
192 int mrsqlite3_execute__ (mrsqlite3_t*, const char* sql);
193 int mrsqlite3_table_exists__ (mrsqlite3_t*, const char* name);
194 void mrsqlite3_log_error (mrsqlite3_t*, const char* msg, ...);
195 
196 /* reset all predefined statements, this is needed only in very rare cases, eg. when dropping a table and there are pending statements */
197 void mrsqlite3_reset_all_predefinitions(mrsqlite3_t*);
198 
199 /* tools for locking, may be called nested, see also m_critical_ above.
200 the user of MrSqlite3 must make sure that the MrSqlite3-object is only used by one thread at the same time.
201 In general, we will lock the hightest level as possible - this avoids deadlocks and massive on/off lockings.
202 Low-level-functions, eg. the MrSqlite3-methods, do not lock. */
203 void mrsqlite3_lock (mrsqlite3_t*); /* lock or wait; these calls must not be nested in a single thread */
204 void mrsqlite3_unlock (mrsqlite3_t*);
205 
206 /* nestable transactions, only the outest is really used */
207 void mrsqlite3_begin_transaction__(mrsqlite3_t*);
208 void mrsqlite3_commit__ (mrsqlite3_t*);
209 void mrsqlite3_rollback__ (mrsqlite3_t*);
210 
211 #ifdef __cplusplus
212 } /* /extern "C" */
213 #endif
214 #endif /* __MRSQLITE3_H__ */
215 
An object representing a single mailbox.
Definition: mrmailbox.h:194