fix: allow concurrent access to dc_sqlite3_t

This commit is contained in:
dignifiedquire
2019-05-02 23:33:00 +02:00
parent 1a0808e243
commit e187f0f250
26 changed files with 383 additions and 440 deletions

View File

@@ -32,7 +32,7 @@ pub struct dc_contact_t<'a> {
pub unsafe fn dc_marknoticed_contact(context: &dc_context_t, contact_id: uint32_t) {
let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare(
context,
&mut context.sql.clone().lock().unwrap(),
&context.sql.clone().read().unwrap(),
b"UPDATE msgs SET state=13 WHERE from_id=? AND state=10;\x00" as *const u8
as *const libc::c_char,
);
@@ -77,7 +77,7 @@ pub unsafe fn dc_lookup_contact_id_by_addr(
addr_normalized = dc_addr_normalize(addr);
addr_self = dc_sqlite3_get_config(
context,
&mut context.sql.clone().lock().unwrap(),
&context.sql.clone().read().unwrap(),
b"configured_addr\x00" as *const u8 as *const libc::c_char,
b"\x00" as *const u8 as *const libc::c_char,
);
@@ -86,7 +86,7 @@ pub unsafe fn dc_lookup_contact_id_by_addr(
} else {
stmt =
dc_sqlite3_prepare(
context,&mut context.sql.clone().lock().unwrap(),
context,&context.sql.clone().read().unwrap(),
b"SELECT id FROM contacts WHERE addr=?1 COLLATE NOCASE AND id>?2 AND origin>=?3 AND blocked=0;\x00"
as *const u8 as *const libc::c_char);
sqlite3_bind_text(
@@ -161,15 +161,12 @@ pub unsafe fn dc_block_contact(
let mut contact: *mut dc_contact_t = dc_contact_new(context);
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
if !(contact_id <= 9i32 as libc::c_uint) {
if 0 != dc_contact_load_from_db(
contact,
&mut context.sql.clone().lock().unwrap(),
contact_id,
) && (*contact).blocked != new_blocking
if 0 != dc_contact_load_from_db(contact, &context.sql.clone().read().unwrap(), contact_id)
&& (*contact).blocked != new_blocking
{
stmt = dc_sqlite3_prepare(
context,
&mut context.sql.clone().lock().unwrap(),
&context.sql.clone().read().unwrap(),
b"UPDATE contacts SET blocked=? WHERE id=?;\x00" as *const u8
as *const libc::c_char,
);
@@ -182,7 +179,7 @@ pub unsafe fn dc_block_contact(
stmt = 0 as *mut sqlite3_stmt;
stmt =
dc_sqlite3_prepare(
context,&mut context.sql.clone().lock().unwrap(),
context,&context.sql.clone().read().unwrap(),
b"UPDATE chats SET blocked=? WHERE type=? AND id IN (SELECT chat_id FROM chats_contacts WHERE contact_id=?);\x00"
as *const u8 as
*const libc::c_char);
@@ -289,7 +286,7 @@ pub unsafe fn dc_contact_empty(mut contact: *mut dc_contact_t) {
/* contacts with at least this origin value start a new "normal" chat, defaults to off */
pub unsafe fn dc_contact_load_from_db(
contact: *mut dc_contact_t,
sql: &mut dc_sqlite3_t,
sql: &dc_sqlite3_t,
contact_id: uint32_t,
) -> libc::c_int {
let mut current_block: u64;
@@ -341,11 +338,7 @@ pub unsafe fn dc_is_contact_blocked(
) -> libc::c_int {
let mut is_blocked: libc::c_int = 0i32;
let mut contact: *mut dc_contact_t = dc_contact_new(context);
if 0 != dc_contact_load_from_db(
contact,
&mut context.sql.clone().lock().unwrap(),
contact_id,
) {
if 0 != dc_contact_load_from_db(contact, &context.sql.clone().read().unwrap(), contact_id) {
if 0 != (*contact).blocked {
is_blocked = 1i32
}
@@ -377,7 +370,7 @@ pub unsafe fn dc_add_or_lookup_contact(
addr = dc_addr_normalize(addr__);
addr_self = dc_sqlite3_get_config(
context,
&mut context.sql.clone().lock().unwrap(),
&context.sql.clone().read().unwrap(),
b"configured_addr\x00" as *const u8 as *const libc::c_char,
b"\x00" as *const u8 as *const libc::c_char,
);
@@ -398,7 +391,7 @@ pub unsafe fn dc_add_or_lookup_contact(
} else {
stmt =
dc_sqlite3_prepare(
context,&mut context.sql.clone().lock().unwrap(),
context,&context.sql.clone().read().unwrap(),
b"SELECT id, name, addr, origin, authname FROM contacts WHERE addr=? COLLATE NOCASE;\x00"
as *const u8 as *const libc::c_char);
sqlite3_bind_text(stmt, 1i32, addr as *const libc::c_char, -1i32, None);
@@ -436,7 +429,7 @@ pub unsafe fn dc_add_or_lookup_contact(
{
stmt = dc_sqlite3_prepare(
context,
&mut context.sql.clone().lock().unwrap(),
&context.sql.clone().read().unwrap(),
b"UPDATE contacts SET name=?, addr=?, origin=?, authname=? WHERE id=?;\x00"
as *const u8 as *const libc::c_char,
);
@@ -481,7 +474,7 @@ pub unsafe fn dc_add_or_lookup_contact(
if 0 != update_name {
stmt =
dc_sqlite3_prepare(
context,&mut context.sql.clone().lock().unwrap(),
context,&context.sql.clone().read().unwrap(),
b"UPDATE chats SET name=? WHERE type=? AND id IN(SELECT chat_id FROM chats_contacts WHERE contact_id=?);\x00"
as *const u8 as
*const libc::c_char);
@@ -497,7 +490,7 @@ pub unsafe fn dc_add_or_lookup_contact(
stmt = 0 as *mut sqlite3_stmt;
stmt = dc_sqlite3_prepare(
context,
&mut context.sql.clone().lock().unwrap(),
&context.sql.clone().read().unwrap(),
b"INSERT INTO contacts (name, addr, origin) VALUES(?, ?, ?);\x00" as *const u8
as *const libc::c_char,
);
@@ -517,7 +510,7 @@ pub unsafe fn dc_add_or_lookup_contact(
if sqlite3_step(stmt) == 101i32 {
row_id = dc_sqlite3_get_rowid(
context,
&mut context.sql.clone().lock().unwrap(),
&context.sql.clone().read().unwrap(),
b"contacts\x00" as *const u8 as *const libc::c_char,
b"addr\x00" as *const u8 as *const libc::c_char,
addr,
@@ -630,7 +623,7 @@ pub unsafe fn dc_get_contacts(
self_addr = dc_sqlite3_get_config(
context,
&mut context.sql.clone().lock().unwrap(),
&context.sql.clone().read().unwrap(),
b"configured_addr\x00" as *const u8 as *const libc::c_char,
b"\x00" as *const u8 as *const libc::c_char,
);
@@ -648,7 +641,7 @@ pub unsafe fn dc_get_contacts(
} else {
stmt =
dc_sqlite3_prepare(
context,&mut context.sql.clone().lock().unwrap(),
context,&context.sql.clone().read().unwrap(),
b"SELECT c.id FROM contacts c LEFT JOIN acpeerstates ps ON c.addr=ps.addr WHERE c.addr!=?1 AND c.id>?2 AND c.origin>=?3 AND c.blocked=0 AND (c.name LIKE ?4 OR c.addr LIKE ?5) AND (1=?6 OR LENGTH(ps.verified_key_fingerprint)!=0) ORDER BY LOWER(c.name||c.addr),c.id;\x00"
as *const u8 as
*const libc::c_char);
@@ -668,7 +661,7 @@ pub unsafe fn dc_get_contacts(
);
self_name = dc_sqlite3_get_config(
context,
&mut context.sql.clone().lock().unwrap(),
&context.sql.clone().read().unwrap(),
b"displayname\x00" as *const u8 as *const libc::c_char,
b"\x00" as *const u8 as *const libc::c_char,
);
@@ -685,7 +678,7 @@ pub unsafe fn dc_get_contacts(
} else {
stmt =
dc_sqlite3_prepare(
context,&mut context.sql.clone().lock().unwrap(),
context,&context.sql.clone().read().unwrap(),
b"SELECT id FROM contacts WHERE addr!=?1 AND id>?2 AND origin>=?3 AND blocked=0 ORDER BY LOWER(name||addr),id;\x00"
as *const u8 as *const libc::c_char);
sqlite3_bind_text(stmt, 1i32, self_addr, -1i32, None);
@@ -720,7 +713,7 @@ pub unsafe fn dc_get_blocked_cnt(context: &dc_context_t) -> libc::c_int {
stmt = dc_sqlite3_prepare(
context,
&mut context.sql.clone().lock().unwrap(),
&context.sql.clone().read().unwrap(),
b"SELECT COUNT(*) FROM contacts WHERE id>? AND blocked!=0\x00" as *const u8
as *const libc::c_char,
);
@@ -739,7 +732,7 @@ pub unsafe fn dc_get_blocked_contacts(mut context: &dc_context_t) -> *mut dc_arr
stmt = dc_sqlite3_prepare(
context,
&mut context.sql.clone().lock().unwrap(),
&context.sql.clone().read().unwrap(),
b"SELECT id FROM contacts WHERE id>? AND blocked!=0 ORDER BY LOWER(name||addr),id;\x00"
as *const u8 as *const libc::c_char,
);
@@ -777,29 +770,23 @@ pub unsafe fn dc_get_contact_encrinfo(
eos: 0 as *mut libc::c_char,
};
dc_strbuilder_init(&mut ret, 0i32);
if !(0
== dc_contact_load_from_db(
contact,
&mut context.sql.clone().lock().unwrap(),
contact_id,
))
{
if !(0 == dc_contact_load_from_db(contact, &context.sql.clone().read().unwrap(), contact_id)) {
dc_apeerstate_load_by_addr(
peerstate,
&mut context.sql.clone().lock().unwrap(),
&context.sql.clone().read().unwrap(),
(*contact).addr,
);
dc_loginparam_read(
context,
loginparam,
&mut context.sql.clone().lock().unwrap(),
&context.sql.clone().read().unwrap(),
b"configured_\x00" as *const u8 as *const libc::c_char,
);
dc_key_load_self_public(
context,
self_key,
(*loginparam).addr,
&mut context.sql.clone().lock().unwrap(),
&context.sql.clone().read().unwrap(),
);
if !dc_apeerstate_peek_key(peerstate, 0i32).is_null() {
p = dc_stock_str(
@@ -818,7 +805,7 @@ pub unsafe fn dc_get_contact_encrinfo(
context,
self_key,
(*loginparam).addr,
&mut context.sql.clone().lock().unwrap(),
&context.sql.clone().read().unwrap(),
);
}
dc_strbuilder_cat(&mut ret, b" \x00" as *const u8 as *const libc::c_char);
@@ -923,7 +910,7 @@ pub unsafe fn dc_delete_contact(
if !contact_id <= 9i32 as libc::c_uint {
stmt = dc_sqlite3_prepare(
context,
&mut context.sql.clone().lock().unwrap(),
&context.sql.clone().read().unwrap(),
b"SELECT COUNT(*) FROM chats_contacts WHERE contact_id=?;\x00" as *const u8
as *const libc::c_char,
);
@@ -933,7 +920,7 @@ pub unsafe fn dc_delete_contact(
stmt = 0 as *mut sqlite3_stmt;
stmt = dc_sqlite3_prepare(
context,
&mut context.sql.clone().lock().unwrap(),
&context.sql.clone().read().unwrap(),
b"SELECT COUNT(*) FROM msgs WHERE from_id=? OR to_id=?;\x00" as *const u8
as *const libc::c_char,
);
@@ -944,7 +931,7 @@ pub unsafe fn dc_delete_contact(
stmt = 0 as *mut sqlite3_stmt;
stmt = dc_sqlite3_prepare(
context,
&mut context.sql.clone().lock().unwrap(),
&context.sql.clone().read().unwrap(),
b"DELETE FROM contacts WHERE id=?;\x00" as *const u8 as *const libc::c_char,
);
sqlite3_bind_int(stmt, 1i32, contact_id as libc::c_int);
@@ -968,7 +955,7 @@ pub unsafe fn dc_get_contact(
mut contact_id: uint32_t,
) -> *mut dc_contact_t {
let mut ret: *mut dc_contact_t = dc_contact_new(context);
if 0 == dc_contact_load_from_db(ret, &mut context.sql.clone().lock().unwrap(), contact_id) {
if 0 == dc_contact_load_from_db(ret, &context.sql.clone().read().unwrap(), contact_id) {
dc_contact_unref(ret);
ret = 0 as *mut dc_contact_t
}
@@ -1085,7 +1072,7 @@ pub unsafe fn dc_contact_is_verified_ex<'a>(
peerstate_to_delete = dc_apeerstate_new((*contact).context);
if 0 == dc_apeerstate_load_by_addr(
peerstate_to_delete,
&mut (*contact).context.sql.clone().lock().unwrap(),
&mut (*contact).context.sql.clone().read().unwrap(),
(*contact).addr,
) {
current_block = 8667923638376902112;
@@ -1134,7 +1121,7 @@ pub unsafe fn dc_addr_equals_self(
normalized_addr = dc_addr_normalize(addr);
self_addr = dc_sqlite3_get_config(
context,
&mut context.sql.clone().lock().unwrap(),
&context.sql.clone().read().unwrap(),
b"configured_addr\x00" as *const u8 as *const libc::c_char,
0 as *const libc::c_char,
);
@@ -1158,11 +1145,7 @@ pub unsafe fn dc_addr_equals_contact(
let mut addr_are_equal: libc::c_int = 0i32;
if !addr.is_null() {
let mut contact: *mut dc_contact_t = dc_contact_new(context);
if 0 != dc_contact_load_from_db(
contact,
&mut context.sql.clone().lock().unwrap(),
contact_id,
) {
if 0 != dc_contact_load_from_db(contact, &context.sql.clone().read().unwrap(), contact_id) {
if !(*contact).addr.is_null() {
let mut normalized_addr: *mut libc::c_char = dc_addr_normalize(addr);
if strcasecmp((*contact).addr, normalized_addr) == 0i32 {
@@ -1179,10 +1162,10 @@ pub unsafe fn dc_addr_equals_contact(
pub unsafe fn dc_get_real_contact_cnt(mut context: &dc_context_t) -> size_t {
let mut ret: size_t = 0i32 as size_t;
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
if !context.sql.clone().lock().unwrap().cobj.is_null() {
if !context.sql.clone().read().unwrap().cobj.is_null() {
stmt = dc_sqlite3_prepare(
context,
&mut context.sql.clone().lock().unwrap(),
&context.sql.clone().read().unwrap(),
b"SELECT COUNT(*) FROM contacts WHERE id>?;\x00" as *const u8 as *const libc::c_char,
);
sqlite3_bind_int(stmt, 1i32, 9i32);
@@ -1205,13 +1188,7 @@ pub unsafe fn dc_get_contact_origin(
}
let mut contact: *mut dc_contact_t = dc_contact_new(context);
*ret_blocked = 0i32;
if !(0
== dc_contact_load_from_db(
contact,
&mut context.sql.clone().lock().unwrap(),
contact_id,
))
{
if !(0 == dc_contact_load_from_db(contact, &context.sql.clone().read().unwrap(), contact_id)) {
/* we could optimize this by loading only the needed fields */
if 0 != (*contact).blocked {
*ret_blocked = 1i32
@@ -1228,10 +1205,10 @@ pub unsafe fn dc_real_contact_exists(
) -> libc::c_int {
let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
let mut ret: libc::c_int = 0i32;
if !(context.sql.clone().lock().unwrap().cobj.is_null() || contact_id <= 9i32 as libc::c_uint) {
if !(context.sql.clone().read().unwrap().cobj.is_null() || contact_id <= 9i32 as libc::c_uint) {
stmt = dc_sqlite3_prepare(
context,
&mut context.sql.clone().lock().unwrap(),
&context.sql.clone().read().unwrap(),
b"SELECT id FROM contacts WHERE id=?;\x00" as *const u8 as *const libc::c_char,
);
sqlite3_bind_int(stmt, 1i32, contact_id as libc::c_int);
@@ -1249,7 +1226,7 @@ pub unsafe fn dc_scaleup_contact_origin(
) {
let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare(
context,
&mut context.sql.clone().lock().unwrap(),
&context.sql.clone().read().unwrap(),
b"UPDATE contacts SET origin=? WHERE id=? AND origin<?;\x00" as *const u8
as *const libc::c_char,
);