|
|
|
@ -341,7 +341,7 @@ DYNAMIC_API PEP_STATUS trustword(
|
|
|
|
|
sqlite3_bind_text(session->trustword, 1, lang, -1, SQLITE_STATIC);
|
|
|
|
|
sqlite3_bind_int(session->trustword, 2, value);
|
|
|
|
|
|
|
|
|
|
const int result = sqlite3_step(session->trustword);
|
|
|
|
|
const int result = pEp_sqlite3_step_nonbusy(session, session->trustword);
|
|
|
|
|
if (result == SQLITE_ROW) {
|
|
|
|
|
*word = strdup((const char *) sqlite3_column_text(session->trustword,
|
|
|
|
|
1));
|
|
|
|
@ -527,7 +527,7 @@ DYNAMIC_API PEP_STATUS get_default_own_userid(
|
|
|
|
|
|
|
|
|
|
sql_reset_and_clear_bindings(session->get_default_own_userid);
|
|
|
|
|
|
|
|
|
|
const int result = sqlite3_step(session->get_default_own_userid);
|
|
|
|
|
const int result = pEp_sqlite3_step_nonbusy(session, session->get_default_own_userid);
|
|
|
|
|
const char* id;
|
|
|
|
|
|
|
|
|
|
switch (result) {
|
|
|
|
@ -569,7 +569,7 @@ DYNAMIC_API PEP_STATUS get_userid_alias_default(
|
|
|
|
|
|
|
|
|
|
const char* tempid;
|
|
|
|
|
|
|
|
|
|
const int result = sqlite3_step(session->get_userid_alias_default);
|
|
|
|
|
const int result = pEp_sqlite3_step_nonbusy(session, session->get_userid_alias_default);
|
|
|
|
|
switch (result) {
|
|
|
|
|
case SQLITE_ROW:
|
|
|
|
|
tempid = (const char *) sqlite3_column_text(session->get_userid_alias_default, 0);
|
|
|
|
@ -597,7 +597,7 @@ DYNAMIC_API PEP_STATUS set_userid_alias (
|
|
|
|
|
|
|
|
|
|
int result;
|
|
|
|
|
|
|
|
|
|
sqlite3_exec(session->db, "BEGIN TRANSACTION ;", NULL, NULL, NULL);
|
|
|
|
|
PEP_SQL_BEGIN_EXCLUSIVE_TRANSACTION();
|
|
|
|
|
|
|
|
|
|
sql_reset_and_clear_bindings(session->add_userid_alias);
|
|
|
|
|
sqlite3_bind_text(session->add_userid_alias, 1, default_id, -1,
|
|
|
|
@ -606,13 +606,14 @@ DYNAMIC_API PEP_STATUS set_userid_alias (
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
|
|
|
|
|
result = sqlite3_step(session->add_userid_alias);
|
|
|
|
|
PEP_ASSERT(result != SQLITE_BUSY && result != SQLITE_LOCKED); // we are inside an EXCLUSIVE transaction
|
|
|
|
|
|
|
|
|
|
sql_reset_and_clear_bindings(session->add_userid_alias);
|
|
|
|
|
if (result != SQLITE_DONE) {
|
|
|
|
|
sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
|
|
|
|
|
PEP_SQL_ROLLBACK_TRANSACTION();
|
|
|
|
|
return PEP_CANNOT_SET_ALIAS;
|
|
|
|
|
}
|
|
|
|
|
sqlite3_exec(session->db, "COMMIT ;", NULL, NULL, NULL);
|
|
|
|
|
PEP_SQL_COMMIT_TRANSACTION();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return PEP_STATUS_OK;
|
|
|
|
@ -635,7 +636,7 @@ DYNAMIC_API PEP_STATUS get_identity(
|
|
|
|
|
sqlite3_bind_text(session->get_identity, 1, address, -1, SQLITE_STATIC);
|
|
|
|
|
sqlite3_bind_text(session->get_identity, 2, user_id, -1, SQLITE_STATIC);
|
|
|
|
|
|
|
|
|
|
const int result = sqlite3_step(session->get_identity);
|
|
|
|
|
const int result = pEp_sqlite3_step_nonbusy(session, session->get_identity);
|
|
|
|
|
switch (result) {
|
|
|
|
|
case SQLITE_ROW:
|
|
|
|
|
_identity = new_identity(
|
|
|
|
@ -701,7 +702,7 @@ PEP_STATUS get_identities_by_userid(
|
|
|
|
|
sqlite3_bind_text(session->get_identities_by_userid, 1, user_id, -1, SQLITE_STATIC);
|
|
|
|
|
|
|
|
|
|
int result = -1;
|
|
|
|
|
while ((result = sqlite3_step(session->get_identities_by_userid)) == SQLITE_ROW) {
|
|
|
|
|
while ((result = pEp_sqlite3_step_nonbusy(session, session->get_identities_by_userid)) == SQLITE_ROW) {
|
|
|
|
|
// "select address, identity.main_key_id, username, comm_type, lang,"
|
|
|
|
|
// " identity.flags | pgp_keypair.flags,"
|
|
|
|
|
// " is_own"
|
|
|
|
@ -784,7 +785,7 @@ PEP_STATUS get_identities_by_main_key_id(
|
|
|
|
|
|
|
|
|
|
int result = -1;
|
|
|
|
|
|
|
|
|
|
while ((result = sqlite3_step(session->get_identities_by_main_key_id)) == SQLITE_ROW) {
|
|
|
|
|
while ((result = pEp_sqlite3_step_nonbusy(session, session->get_identities_by_main_key_id)) == SQLITE_ROW) {
|
|
|
|
|
ident = new_identity(
|
|
|
|
|
(const char *) sqlite3_column_text(session->get_identities_by_main_key_id, 0),
|
|
|
|
|
fpr,
|
|
|
|
@ -853,7 +854,7 @@ PEP_STATUS get_identity_without_trust_check(
|
|
|
|
|
sqlite3_bind_text(session->get_identity_without_trust_check, 1, address, -1, SQLITE_STATIC);
|
|
|
|
|
sqlite3_bind_text(session->get_identity_without_trust_check, 2, user_id, -1, SQLITE_STATIC);
|
|
|
|
|
|
|
|
|
|
const int result = sqlite3_step(session->get_identity_without_trust_check);
|
|
|
|
|
const int result = pEp_sqlite3_step_nonbusy(session, session->get_identity_without_trust_check);
|
|
|
|
|
switch (result) {
|
|
|
|
|
case SQLITE_ROW:
|
|
|
|
|
_identity = new_identity(
|
|
|
|
@ -916,7 +917,7 @@ PEP_STATUS get_identities_by_address(
|
|
|
|
|
sqlite3_bind_text(session->get_identities_by_address, 1, address, -1, SQLITE_STATIC);
|
|
|
|
|
int result;
|
|
|
|
|
|
|
|
|
|
while ((result = sqlite3_step(session->get_identities_by_address)) == SQLITE_ROW) {
|
|
|
|
|
while ((result = pEp_sqlite3_step_nonbusy(session, session->get_identities_by_address)) == SQLITE_ROW) {
|
|
|
|
|
//"select user_id, main_key_id, username, comm_type, lang,"
|
|
|
|
|
//" identity.flags, is_own"
|
|
|
|
|
pEp_identity *ident = new_identity(
|
|
|
|
@ -1000,7 +1001,7 @@ PEP_STATUS exists_identity_entry(PEP_SESSION session, pEp_identity* identity,
|
|
|
|
|
sqlite3_bind_text(session->exists_identity_entry, 2, identity->user_id, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
|
|
|
|
|
int result = sqlite3_step(session->exists_identity_entry);
|
|
|
|
|
int result = pEp_sqlite3_step_nonbusy(session, session->exists_identity_entry);
|
|
|
|
|
|
|
|
|
|
switch (result) {
|
|
|
|
|
case SQLITE_ROW: {
|
|
|
|
@ -1031,7 +1032,7 @@ PEP_STATUS exists_trust_entry(PEP_SESSION session, pEp_identity* identity,
|
|
|
|
|
sqlite3_bind_text(session->exists_trust_entry, 2, identity->fpr, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
|
|
|
|
|
int result = sqlite3_step(session->exists_trust_entry);
|
|
|
|
|
int result = pEp_sqlite3_step_nonbusy(session, session->exists_trust_entry);
|
|
|
|
|
switch (result) {
|
|
|
|
|
case SQLITE_ROW: {
|
|
|
|
|
// yeah yeah, I know, we could be lazy here, but it looks bad.
|
|
|
|
@ -1054,7 +1055,7 @@ PEP_STATUS set_pgp_keypair(PEP_SESSION session, const char* fpr) {
|
|
|
|
|
sql_reset_and_clear_bindings(session->set_pgp_keypair);
|
|
|
|
|
sqlite3_bind_text(session->set_pgp_keypair, 1, fpr, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
result = sqlite3_step(session->set_pgp_keypair);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, session->set_pgp_keypair);
|
|
|
|
|
sql_reset_and_clear_bindings(session->set_pgp_keypair);
|
|
|
|
|
if (result != SQLITE_DONE) {
|
|
|
|
|
return PEP_CANNOT_SET_PGP_KEYPAIR;
|
|
|
|
@ -1075,7 +1076,7 @@ PEP_STATUS clear_trust_info(PEP_SESSION session,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
sqlite3_bind_text(session->clear_trust_info, 2, fpr, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
result = sqlite3_step(session->clear_trust_info);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, session->clear_trust_info);
|
|
|
|
|
sql_reset_and_clear_bindings(session->clear_trust_info);
|
|
|
|
|
if (result != SQLITE_DONE) {
|
|
|
|
|
return PEP_UNKNOWN_ERROR;
|
|
|
|
@ -1118,7 +1119,7 @@ static PEP_STATUS _set_or_update_trust(PEP_SESSION session,
|
|
|
|
|
sqlite3_bind_text(set_or_update, 2, identity->fpr, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
sqlite3_bind_int(set_or_update, 3, identity->comm_type);
|
|
|
|
|
result = sqlite3_step(set_or_update);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, set_or_update);
|
|
|
|
|
sql_reset_and_clear_bindings(set_or_update);
|
|
|
|
|
PEP_WEAK_ASSERT_ORELSE_RETURN(result == SQLITE_DONE, PEP_CANNOT_SET_TRUST);
|
|
|
|
|
|
|
|
|
@ -1161,7 +1162,7 @@ static PEP_STATUS _set_or_update_identity_entry(PEP_SESSION session,
|
|
|
|
|
sqlite3_bind_int(set_or_update, 7, identity->major_ver);
|
|
|
|
|
sqlite3_bind_int(set_or_update, 8, identity->minor_ver);
|
|
|
|
|
|
|
|
|
|
int result = sqlite3_step(set_or_update);
|
|
|
|
|
int result = pEp_sqlite3_step_nonbusy(session, set_or_update);
|
|
|
|
|
sql_reset_and_clear_bindings(set_or_update);
|
|
|
|
|
if (result != SQLITE_DONE)
|
|
|
|
|
return PEP_CANNOT_SET_IDENTITY;
|
|
|
|
@ -1203,7 +1204,7 @@ static PEP_STATUS _set_or_update_person(PEP_SESSION session,
|
|
|
|
|
sqlite3_bind_null(set_or_update, 3);
|
|
|
|
|
sqlite3_bind_text(set_or_update, 4, EMPTYSTR(identity->fpr) ? NULL : identity->fpr, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
int result = sqlite3_step(set_or_update);
|
|
|
|
|
int result = pEp_sqlite3_step_nonbusy(session, set_or_update);
|
|
|
|
|
sql_reset_and_clear_bindings(set_or_update);
|
|
|
|
|
|
|
|
|
|
if (result != SQLITE_DONE)
|
|
|
|
@ -1221,9 +1222,8 @@ PEP_STATUS set_or_update_with_identity(PEP_SESSION session,
|
|
|
|
|
bool guard_transaction) {
|
|
|
|
|
PEP_REQUIRE(session && identity && set_function && exists_function);
|
|
|
|
|
|
|
|
|
|
if (guard_transaction) {
|
|
|
|
|
sqlite3_exec(session->db, "BEGIN TRANSACTION ;", NULL, NULL, NULL);
|
|
|
|
|
}
|
|
|
|
|
if (guard_transaction)
|
|
|
|
|
PEP_SQL_BEGIN_EXCLUSIVE_TRANSACTION();
|
|
|
|
|
bool exists = false;
|
|
|
|
|
PEP_STATUS status = exists_function(session, identity, &exists);
|
|
|
|
|
|
|
|
|
@ -1237,9 +1237,9 @@ PEP_STATUS set_or_update_with_identity(PEP_SESSION session,
|
|
|
|
|
}
|
|
|
|
|
if (guard_transaction) {
|
|
|
|
|
if (status != PEP_STATUS_OK)
|
|
|
|
|
sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
|
|
|
|
|
else
|
|
|
|
|
sqlite3_exec(session->db, "COMMIT ;", NULL, NULL, NULL);
|
|
|
|
|
PEP_SQL_ROLLBACK_TRANSACTION();
|
|
|
|
|
else
|
|
|
|
|
PEP_SQL_COMMIT_TRANSACTION();
|
|
|
|
|
}
|
|
|
|
|
return status;
|
|
|
|
|
}
|
|
|
|
@ -1333,7 +1333,7 @@ DYNAMIC_API PEP_STATUS set_identity(
|
|
|
|
|
|
|
|
|
|
bool has_fpr = (!EMPTYSTR(identity->fpr));
|
|
|
|
|
|
|
|
|
|
sqlite3_exec(session->db, "BEGIN TRANSACTION ;", NULL, NULL, NULL);
|
|
|
|
|
PEP_SQL_BEGIN_EXCLUSIVE_TRANSACTION();
|
|
|
|
|
|
|
|
|
|
if (identity->lang[0]) {
|
|
|
|
|
PEP_ASSERT(identity->lang[0] >= 'a' && identity->lang[0] <= 'z');
|
|
|
|
@ -1346,9 +1346,10 @@ DYNAMIC_API PEP_STATUS set_identity(
|
|
|
|
|
sqlite3_bind_text(session->set_pgp_keypair, 1, identity->fpr, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
result = sqlite3_step(session->set_pgp_keypair);
|
|
|
|
|
PEP_ASSERT(result != SQLITE_BUSY && result != SQLITE_LOCKED); // we are inside an EXCLUSIVE transaction
|
|
|
|
|
sql_reset_and_clear_bindings(session->set_pgp_keypair);
|
|
|
|
|
if (result != SQLITE_DONE) {
|
|
|
|
|
sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
|
|
|
|
|
PEP_SQL_ROLLBACK_TRANSACTION();
|
|
|
|
|
return PEP_CANNOT_SET_PGP_KEYPAIR;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -1362,35 +1363,32 @@ DYNAMIC_API PEP_STATUS set_identity(
|
|
|
|
|
// For now, we ALWAYS set the person.username.
|
|
|
|
|
status = set_person(session, ident_copy, false);
|
|
|
|
|
if (status != PEP_STATUS_OK) {
|
|
|
|
|
sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
|
|
|
|
|
PEP_SQL_ROLLBACK_TRANSACTION();
|
|
|
|
|
goto pEp_free;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
status = set_identity_entry(session, ident_copy, false);
|
|
|
|
|
if (status != PEP_STATUS_OK) {
|
|
|
|
|
sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
|
|
|
|
|
PEP_SQL_ROLLBACK_TRANSACTION();
|
|
|
|
|
goto pEp_free;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (has_fpr) {
|
|
|
|
|
status = _set_trust_internal(session, ident_copy, false);
|
|
|
|
|
if (status != PEP_STATUS_OK) {
|
|
|
|
|
sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
|
|
|
|
|
PEP_SQL_ROLLBACK_TRANSACTION();
|
|
|
|
|
goto pEp_free;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
status = set_protocol_version(session, ident_copy, ident_copy->major_ver, ident_copy->minor_ver);
|
|
|
|
|
if (status != PEP_STATUS_OK) {
|
|
|
|
|
sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
|
|
|
|
|
PEP_SQL_ROLLBACK_TRANSACTION();
|
|
|
|
|
goto pEp_free;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
result = sqlite3_exec(session->db, "COMMIT ;", NULL, NULL, NULL);
|
|
|
|
|
if (result == SQLITE_OK)
|
|
|
|
|
status = PEP_STATUS_OK;
|
|
|
|
|
else
|
|
|
|
|
status = PEP_COMMIT_FAILED;
|
|
|
|
|
PEP_SQL_COMMIT_TRANSACTION();
|
|
|
|
|
status = PEP_STATUS_OK;
|
|
|
|
|
|
|
|
|
|
pEp_free:
|
|
|
|
|
free_identity(ident_copy);
|
|
|
|
@ -1424,7 +1422,7 @@ PEP_STATUS force_set_identity_username(PEP_SESSION session, pEp_identity* ident,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
sqlite3_bind_text(session->force_set_identity_username, 3, username, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
int result = sqlite3_step(session->force_set_identity_username);
|
|
|
|
|
int result = pEp_sqlite3_step_nonbusy(session, session->force_set_identity_username);
|
|
|
|
|
|
|
|
|
|
sql_reset_and_clear_bindings(session->force_set_identity_username);
|
|
|
|
|
|
|
|
|
@ -1455,7 +1453,7 @@ PEP_STATUS update_pEp_user_trust_vals(PEP_SESSION session,
|
|
|
|
|
sql_reset_and_clear_bindings(session->update_trust_to_pEp);
|
|
|
|
|
sqlite3_bind_text(session->update_trust_to_pEp, 1, user->user_id, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
int result = sqlite3_step(session->update_trust_to_pEp);
|
|
|
|
|
int result = pEp_sqlite3_step_nonbusy(session, session->update_trust_to_pEp);
|
|
|
|
|
sql_reset_and_clear_bindings(session->update_trust_to_pEp);
|
|
|
|
|
if (result != SQLITE_DONE)
|
|
|
|
|
return PEP_CANNOT_SET_TRUST;
|
|
|
|
@ -1488,7 +1486,7 @@ DYNAMIC_API PEP_STATUS set_as_pEp_user(PEP_SESSION session, pEp_identity* user)
|
|
|
|
|
sql_reset_and_clear_bindings(session->set_as_pEp_user);
|
|
|
|
|
sqlite3_bind_text(session->set_as_pEp_user, 1, user->user_id, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
int result = sqlite3_step(session->set_as_pEp_user);
|
|
|
|
|
int result = pEp_sqlite3_step_nonbusy(session, session->set_as_pEp_user);
|
|
|
|
|
sql_reset_and_clear_bindings(session->set_as_pEp_user);
|
|
|
|
|
|
|
|
|
|
if (result != SQLITE_DONE)
|
|
|
|
@ -1512,7 +1510,7 @@ PEP_STATUS set_protocol_version(PEP_SESSION session, pEp_identity* ident, unsign
|
|
|
|
|
sqlite3_bind_text(session->set_protocol_version, 4, ident->user_id, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
|
|
|
|
|
int result = sqlite3_step(session->set_protocol_version);
|
|
|
|
|
int result = pEp_sqlite3_step_nonbusy(session, session->set_protocol_version);
|
|
|
|
|
sql_reset_and_clear_bindings(session->set_protocol_version);
|
|
|
|
|
|
|
|
|
|
if (result != SQLITE_DONE)
|
|
|
|
@ -1536,7 +1534,7 @@ PEP_STATUS upgrade_protocol_version_by_user_id(PEP_SESSION session,
|
|
|
|
|
sqlite3_bind_text(session->upgrade_protocol_version_by_user_id, 3, ident->user_id, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
|
|
|
|
|
int result = sqlite3_step(session->upgrade_protocol_version_by_user_id);
|
|
|
|
|
int result = pEp_sqlite3_step_nonbusy(session, session->upgrade_protocol_version_by_user_id);
|
|
|
|
|
sql_reset_and_clear_bindings(session->upgrade_protocol_version_by_user_id);
|
|
|
|
|
|
|
|
|
|
if (result != SQLITE_DONE)
|
|
|
|
@ -1560,7 +1558,7 @@ PEP_STATUS exists_person(PEP_SESSION session, pEp_identity* identity,
|
|
|
|
|
sql_reset_and_clear_bindings(session->exists_person);
|
|
|
|
|
sqlite3_bind_text(session->exists_person, 1, user_id, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
int result = sqlite3_step(session->exists_person);
|
|
|
|
|
int result = pEp_sqlite3_step_nonbusy(session, session->exists_person);
|
|
|
|
|
switch (result) {
|
|
|
|
|
case SQLITE_ROW: {
|
|
|
|
|
// yeah yeah, I know, we could be lazy here, but it looks bad.
|
|
|
|
@ -1609,7 +1607,7 @@ PEP_STATUS delete_person(PEP_SESSION session, const char* user_id) {
|
|
|
|
|
sqlite3_bind_text(session->delete_person, 1, user_id, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
|
|
|
|
|
int result = sqlite3_step(session->delete_person);
|
|
|
|
|
int result = pEp_sqlite3_step_nonbusy(session, session->delete_person);
|
|
|
|
|
|
|
|
|
|
if (result != SQLITE_DONE)
|
|
|
|
|
status = PEP_UNKNOWN_ERROR;
|
|
|
|
@ -1638,7 +1636,7 @@ DYNAMIC_API PEP_STATUS is_pEp_user(PEP_SESSION session, pEp_identity *identity,
|
|
|
|
|
sql_reset_and_clear_bindings(session->is_pEp_user);
|
|
|
|
|
sqlite3_bind_text(session->is_pEp_user, 1, user_id, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
int result = sqlite3_step(session->is_pEp_user);
|
|
|
|
|
int result = pEp_sqlite3_step_nonbusy(session, session->is_pEp_user);
|
|
|
|
|
switch (result) {
|
|
|
|
|
case SQLITE_ROW: {
|
|
|
|
|
// yeah yeah, I know, we could be lazy here, but it looks bad.
|
|
|
|
@ -1666,7 +1664,7 @@ PEP_STATUS is_own_address(PEP_SESSION session, const char* address, bool* is_own
|
|
|
|
|
sql_reset_and_clear_bindings(session->is_own_address);
|
|
|
|
|
sqlite3_bind_text(session->is_own_address, 1, address, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
int result = sqlite3_step(session->is_own_address);
|
|
|
|
|
int result = pEp_sqlite3_step_nonbusy(session, session->is_own_address);
|
|
|
|
|
switch (result) {
|
|
|
|
|
case SQLITE_ROW: {
|
|
|
|
|
// yeah yeah, I know, we could be lazy here, but it looks bad.
|
|
|
|
@ -1699,7 +1697,7 @@ PEP_STATUS bind_own_ident_with_contact_ident(PEP_SESSION session,
|
|
|
|
|
sqlite3_bind_text(session->add_into_social_graph, 3, contact_ident->user_id, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
|
|
|
|
|
int result = sqlite3_step(session->add_into_social_graph);
|
|
|
|
|
int result = pEp_sqlite3_step_nonbusy(session, session->add_into_social_graph);
|
|
|
|
|
sql_reset_and_clear_bindings(session->add_into_social_graph);
|
|
|
|
|
|
|
|
|
|
if (result != SQLITE_DONE)
|
|
|
|
@ -1724,7 +1722,7 @@ PEP_STATUS has_partner_contacted_address(PEP_SESSION session, const char* partne
|
|
|
|
|
sqlite3_bind_text(session->has_id_contacted_address, 2, partner_id, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
|
|
|
|
|
int result = sqlite3_step(session->has_id_contacted_address);
|
|
|
|
|
int result = pEp_sqlite3_step_nonbusy(session, session->has_id_contacted_address);
|
|
|
|
|
switch (result) {
|
|
|
|
|
case SQLITE_ROW: {
|
|
|
|
|
// yeah yeah, I know, we could be lazy here, but it looks bad.
|
|
|
|
@ -1760,7 +1758,7 @@ PEP_STATUS get_own_ident_for_contact_id(PEP_SESSION session,
|
|
|
|
|
sqlite3_bind_text(session->get_own_address_binding_from_contact, 2, contact->user_id, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
|
|
|
|
|
int result = sqlite3_step(session->get_own_address_binding_from_contact);
|
|
|
|
|
int result = pEp_sqlite3_step_nonbusy(session, session->get_own_address_binding_from_contact);
|
|
|
|
|
|
|
|
|
|
const char* own_address = NULL;
|
|
|
|
|
|
|
|
|
@ -1779,6 +1777,7 @@ PEP_STATUS get_own_ident_for_contact_id(PEP_SESSION session,
|
|
|
|
|
default:
|
|
|
|
|
status = PEP_CANNOT_FIND_IDENTITY;
|
|
|
|
|
}
|
|
|
|
|
sql_reset_and_clear_bindings(session->get_own_address_binding_from_contact);
|
|
|
|
|
|
|
|
|
|
free(own_user_id);
|
|
|
|
|
return status;
|
|
|
|
@ -1793,7 +1792,7 @@ PEP_STATUS remove_fpr_as_default(PEP_SESSION session,
|
|
|
|
|
sqlite3_bind_text(session->remove_fpr_as_identity_default, 1, fpr, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
|
|
|
|
|
int result = sqlite3_step(session->remove_fpr_as_identity_default);
|
|
|
|
|
int result = pEp_sqlite3_step_nonbusy(session, session->remove_fpr_as_identity_default);
|
|
|
|
|
sql_reset_and_clear_bindings(session->remove_fpr_as_identity_default);
|
|
|
|
|
|
|
|
|
|
if (result != SQLITE_DONE)
|
|
|
|
@ -1803,7 +1802,7 @@ PEP_STATUS remove_fpr_as_default(PEP_SESSION session,
|
|
|
|
|
sqlite3_bind_text(session->remove_fpr_as_user_default, 1, fpr, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
|
|
|
|
|
result = sqlite3_step(session->remove_fpr_as_user_default);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, session->remove_fpr_as_user_default);
|
|
|
|
|
sql_reset_and_clear_bindings(session->remove_fpr_as_user_default);
|
|
|
|
|
|
|
|
|
|
if (result != SQLITE_DONE)
|
|
|
|
@ -1825,7 +1824,7 @@ PEP_STATUS replace_identities_fpr(PEP_SESSION session,
|
|
|
|
|
sqlite3_bind_text(session->replace_identities_fpr, 2, old_fpr, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
|
|
|
|
|
int result = sqlite3_step(session->replace_identities_fpr);
|
|
|
|
|
int result = pEp_sqlite3_step_nonbusy(session, session->replace_identities_fpr);
|
|
|
|
|
sql_reset_and_clear_bindings(session->replace_identities_fpr);
|
|
|
|
|
|
|
|
|
|
if (result != SQLITE_DONE)
|
|
|
|
@ -1844,7 +1843,7 @@ PEP_STATUS update_trust_for_fpr(PEP_SESSION session,
|
|
|
|
|
sqlite3_bind_int(session->update_trust_for_fpr, 1, comm_type);
|
|
|
|
|
sqlite3_bind_text(session->update_trust_for_fpr, 2, fpr, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
int result = sqlite3_step(session->update_trust_for_fpr);
|
|
|
|
|
int result = pEp_sqlite3_step_nonbusy(session, session->update_trust_for_fpr);
|
|
|
|
|
sql_reset_and_clear_bindings(session->update_trust_for_fpr);
|
|
|
|
|
if (result != SQLITE_DONE) {
|
|
|
|
|
return PEP_CANNOT_SET_TRUST;
|
|
|
|
@ -1871,7 +1870,7 @@ DYNAMIC_API PEP_STATUS set_identity_flags(
|
|
|
|
|
sqlite3_bind_text(session->set_identity_flags, 3, identity->user_id, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
|
|
|
|
|
result = sqlite3_step(session->set_identity_flags);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, session->set_identity_flags);
|
|
|
|
|
|
|
|
|
|
sql_reset_and_clear_bindings(session->set_identity_flags);
|
|
|
|
|
if (result != SQLITE_DONE)
|
|
|
|
@ -1897,7 +1896,7 @@ DYNAMIC_API PEP_STATUS unset_identity_flags(
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
sqlite3_bind_text(session->unset_identity_flags, 3, identity->user_id, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
result = sqlite3_step(session->unset_identity_flags);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, session->unset_identity_flags);
|
|
|
|
|
sql_reset_and_clear_bindings(session->unset_identity_flags);
|
|
|
|
|
if (result != SQLITE_DONE)
|
|
|
|
|
return PEP_CANNOT_SET_IDENTITY;
|
|
|
|
@ -1924,7 +1923,7 @@ DYNAMIC_API PEP_STATUS set_ident_enc_format(
|
|
|
|
|
sqlite3_bind_text(session->set_ident_enc_format, 3, identity->user_id, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
|
|
|
|
|
result = sqlite3_step(session->set_ident_enc_format);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, session->set_ident_enc_format);
|
|
|
|
|
|
|
|
|
|
sql_reset_and_clear_bindings(session->set_ident_enc_format);
|
|
|
|
|
if (result != SQLITE_DONE)
|
|
|
|
@ -1960,7 +1959,7 @@ PEP_STATUS get_trust_by_userid(PEP_SESSION session, const char* user_id,
|
|
|
|
|
sql_reset_and_clear_bindings(session->get_trust_by_userid);
|
|
|
|
|
sqlite3_bind_text(session->get_trust_by_userid, 1, user_id, -1, SQLITE_STATIC);
|
|
|
|
|
|
|
|
|
|
while ((result = sqlite3_step(session->get_trust_by_userid)) == SQLITE_ROW) {
|
|
|
|
|
while ((result = pEp_sqlite3_step_nonbusy(session, session->get_trust_by_userid)) == SQLITE_ROW) {
|
|
|
|
|
if (!t_list)
|
|
|
|
|
t_list = new_labeled_int_list(sqlite3_column_int(session->get_trust_by_userid, 1),
|
|
|
|
|
(const char *) sqlite3_column_text(session->get_trust_by_userid, 0));
|
|
|
|
@ -2372,7 +2371,7 @@ PEP_STATUS replace_userid(PEP_SESSION session, const char* old_uid,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
sqlite3_bind_text(session->replace_userid, 2, old_uid, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
result = sqlite3_step(session->replace_userid);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, session->replace_userid);
|
|
|
|
|
if (result != SQLITE_DONE) {
|
|
|
|
|
const char *errmsg = sqlite3_errmsg(session->db);
|
|
|
|
|
LOG_ERROR("SQLite3 error: replace_userid failed: %s", errmsg);
|
|
|
|
@ -2391,7 +2390,7 @@ PEP_STATUS remove_key(PEP_SESSION session, const char* fpr) {
|
|
|
|
|
sql_reset_and_clear_bindings(session->delete_key);
|
|
|
|
|
sqlite3_bind_text(session->delete_key, 1, fpr, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
result = sqlite3_step(session->delete_key);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, session->delete_key);
|
|
|
|
|
sql_reset_and_clear_bindings(session->delete_key);
|
|
|
|
|
if (result != SQLITE_DONE)
|
|
|
|
|
return PEP_CANNOT_SET_PGP_KEYPAIR;
|
|
|
|
@ -2407,7 +2406,7 @@ PEP_STATUS refresh_userid_default_key(PEP_SESSION session, const char* user_id)
|
|
|
|
|
sql_reset_and_clear_bindings(session->refresh_userid_default_key);
|
|
|
|
|
sqlite3_bind_text(session->refresh_userid_default_key, 1, user_id, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
result = sqlite3_step(session->refresh_userid_default_key);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, session->refresh_userid_default_key);
|
|
|
|
|
sql_reset_and_clear_bindings(session->refresh_userid_default_key);
|
|
|
|
|
if (result != SQLITE_DONE)
|
|
|
|
|
return PEP_CANNOT_SET_PERSON;
|
|
|
|
@ -2425,7 +2424,7 @@ PEP_STATUS replace_main_user_fpr(PEP_SESSION session, const char* user_id,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
sqlite3_bind_text(session->replace_main_user_fpr, 2, user_id, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
result = sqlite3_step(session->replace_main_user_fpr);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, session->replace_main_user_fpr);
|
|
|
|
|
sql_reset_and_clear_bindings(session->replace_main_user_fpr);
|
|
|
|
|
if (result != SQLITE_DONE)
|
|
|
|
|
return PEP_CANNOT_SET_PERSON;
|
|
|
|
@ -2453,7 +2452,7 @@ PEP_STATUS replace_main_user_fpr_if_equal(PEP_SESSION session, const char* user_
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
sqlite3_bind_text(session->replace_main_user_fpr_if_equal, 3, compare_fpr, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
result = sqlite3_step(session->replace_main_user_fpr_if_equal);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, session->replace_main_user_fpr_if_equal);
|
|
|
|
|
sql_reset_and_clear_bindings(session->replace_main_user_fpr_if_equal);
|
|
|
|
|
if (result != SQLITE_DONE)
|
|
|
|
|
return PEP_CANNOT_SET_PERSON;
|
|
|
|
@ -2474,7 +2473,7 @@ PEP_STATUS get_main_user_fpr(PEP_SESSION session,
|
|
|
|
|
sql_reset_and_clear_bindings(session->get_main_user_fpr);
|
|
|
|
|
sqlite3_bind_text(session->get_main_user_fpr, 1, user_id, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
result = sqlite3_step(session->get_main_user_fpr);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, session->get_main_user_fpr);
|
|
|
|
|
switch (result) {
|
|
|
|
|
case SQLITE_ROW: {
|
|
|
|
|
const char* _fpr =
|
|
|
|
@ -2519,7 +2518,7 @@ PEP_STATUS set_default_identity_fpr(PEP_SESSION session,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
sqlite3_bind_text(session->set_default_identity_fpr, 3, fpr, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
result = sqlite3_step(session->set_default_identity_fpr);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, session->set_default_identity_fpr);
|
|
|
|
|
sql_reset_and_clear_bindings(session->set_default_identity_fpr);
|
|
|
|
|
if (result != SQLITE_DONE)
|
|
|
|
|
return PEP_CANNOT_SET_PGP_KEYPAIR;
|
|
|
|
@ -2546,7 +2545,7 @@ PEP_STATUS get_default_identity_fpr(PEP_SESSION session,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
sqlite3_bind_text(session->get_default_identity_fpr, 2, user_id, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
result = sqlite3_step(session->get_default_identity_fpr);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, session->get_default_identity_fpr);
|
|
|
|
|
switch (result) {
|
|
|
|
|
case SQLITE_ROW: {
|
|
|
|
|
const char* _fpr =
|
|
|
|
@ -2593,7 +2592,7 @@ DYNAMIC_API PEP_STATUS mark_as_compromised(
|
|
|
|
|
sql_reset_and_clear_bindings(session->mark_compromised);
|
|
|
|
|
sqlite3_bind_text(session->mark_compromised, 1, fpr, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
result = sqlite3_step(session->mark_compromised);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, session->mark_compromised);
|
|
|
|
|
sql_reset_and_clear_bindings(session->mark_compromised);
|
|
|
|
|
|
|
|
|
|
if (result != SQLITE_DONE)
|
|
|
|
@ -2626,7 +2625,7 @@ DYNAMIC_API PEP_STATUS get_trust(PEP_SESSION session, pEp_identity *identity)
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
sqlite3_bind_text(session->get_trust, 2, identity->fpr, -1, SQLITE_STATIC);
|
|
|
|
|
|
|
|
|
|
result = sqlite3_step(session->get_trust);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, session->get_trust);
|
|
|
|
|
switch (result) {
|
|
|
|
|
case SQLITE_ROW: {
|
|
|
|
|
int comm_type = (PEP_comm_type) sqlite3_column_int(session->get_trust,
|
|
|
|
@ -2660,7 +2659,7 @@ DYNAMIC_API PEP_STATUS least_trust(
|
|
|
|
|
sql_reset_and_clear_bindings(session->least_trust);
|
|
|
|
|
sqlite3_bind_text(session->least_trust, 1, fpr, -1, SQLITE_STATIC);
|
|
|
|
|
|
|
|
|
|
result = sqlite3_step(session->least_trust);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, session->least_trust);
|
|
|
|
|
switch (result) {
|
|
|
|
|
case SQLITE_ROW: {
|
|
|
|
|
int _comm_type = sqlite3_column_int(session->least_trust, 0);
|
|
|
|
@ -3132,7 +3131,7 @@ DYNAMIC_API PEP_STATUS get_crashdump_log(
|
|
|
|
|
int result;
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
result = sqlite3_step(session->crashdump);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, session->crashdump);
|
|
|
|
|
switch (result) {
|
|
|
|
|
case SQLITE_ROW:
|
|
|
|
|
timestamp = (const char *) sqlite3_column_text(session->crashdump,
|
|
|
|
@ -3219,7 +3218,7 @@ DYNAMIC_API PEP_STATUS get_languagelist(
|
|
|
|
|
int result;
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
result = sqlite3_step(session->languagelist);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, session->languagelist);
|
|
|
|
|
switch (result) {
|
|
|
|
|
case SQLITE_ROW:
|
|
|
|
|
lang = (const char *) sqlite3_column_text(session->languagelist,
|
|
|
|
@ -3287,7 +3286,7 @@ DYNAMIC_API PEP_STATUS get_phrase(
|
|
|
|
|
const char *_phrase = NULL;
|
|
|
|
|
int result;
|
|
|
|
|
|
|
|
|
|
result = sqlite3_step(session->i18n_token);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, session->i18n_token);
|
|
|
|
|
switch (result) {
|
|
|
|
|
case SQLITE_ROW:
|
|
|
|
|
_phrase = (const char *) sqlite3_column_text(session->i18n_token, 0);
|
|
|
|
@ -3342,7 +3341,7 @@ static PEP_STATUS _get_sequence_value(PEP_SESSION session, const char *name,
|
|
|
|
|
sql_reset_and_clear_bindings(session->sequence_value2);
|
|
|
|
|
sqlite3_bind_text(session->sequence_value2, 1, name, -1,
|
|
|
|
|
SQLITE_STATIC);
|
|
|
|
|
int result = sqlite3_step(session->sequence_value2);
|
|
|
|
|
int result = pEp_sqlite3_step_nonbusy(session, session->sequence_value2);
|
|
|
|
|
switch (result) {
|
|
|
|
|
case SQLITE_ROW: {
|
|
|
|
|
int32_t _value = (int32_t)
|
|
|
|
@ -3383,7 +3382,7 @@ static PEP_STATUS _increment_sequence_value(PEP_SESSION session,
|
|
|
|
|
|
|
|
|
|
sql_reset_and_clear_bindings(session->sequence_value1);
|
|
|
|
|
sqlite3_bind_text(session->sequence_value1, 1, name, -1, SQLITE_STATIC);
|
|
|
|
|
int result = sqlite3_step(session->sequence_value1);
|
|
|
|
|
int result = pEp_sqlite3_step_nonbusy(session, session->sequence_value1);
|
|
|
|
|
sql_reset_and_clear_bindings(session->sequence_value1);
|
|
|
|
|
PEP_WEAK_ASSERT_ORELSE_RETURN(result == SQLITE_DONE,
|
|
|
|
|
PEP_CANNOT_INCREASE_SEQUENCE);
|
|
|
|
@ -3400,24 +3399,20 @@ DYNAMIC_API PEP_STATUS sequence_value(
|
|
|
|
|
|
|
|
|
|
PEP_STATUS status = PEP_STATUS_OK;
|
|
|
|
|
*value = 0;
|
|
|
|
|
sqlite3_exec(session->db, "BEGIN TRANSACTION ;", NULL, NULL, NULL);
|
|
|
|
|
PEP_SQL_BEGIN_EXCLUSIVE_TRANSACTION();
|
|
|
|
|
status = _increment_sequence_value(session, name);
|
|
|
|
|
if (status == PEP_STATUS_OK)
|
|
|
|
|
status = _get_sequence_value(session, name, value);
|
|
|
|
|
|
|
|
|
|
if (status == PEP_STATUS_OK) {
|
|
|
|
|
int result = sqlite3_exec(session->db, "COMMIT ;", NULL, NULL, NULL);
|
|
|
|
|
if (result == SQLITE_OK){
|
|
|
|
|
assert(*value < INT32_MAX);
|
|
|
|
|
if (*value == INT32_MAX){
|
|
|
|
|
return PEP_CANNOT_INCREASE_SEQUENCE;
|
|
|
|
|
}
|
|
|
|
|
return status;
|
|
|
|
|
} else {
|
|
|
|
|
return PEP_COMMIT_FAILED;
|
|
|
|
|
PEP_SQL_COMMIT_TRANSACTION();
|
|
|
|
|
PEP_ASSERT(*value < INT32_MAX);
|
|
|
|
|
if (*value == INT32_MAX){
|
|
|
|
|
return PEP_CANNOT_INCREASE_SEQUENCE;
|
|
|
|
|
}
|
|
|
|
|
return status;
|
|
|
|
|
} else {
|
|
|
|
|
sqlite3_exec(session->db, "ROLLBACK ;", NULL, NULL, NULL);
|
|
|
|
|
PEP_SQL_ROLLBACK_TRANSACTION();
|
|
|
|
|
return status;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -3482,7 +3477,7 @@ DYNAMIC_API PEP_STATUS set_revoked(
|
|
|
|
|
|
|
|
|
|
int result;
|
|
|
|
|
|
|
|
|
|
result = sqlite3_step(session->set_revoked);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, session->set_revoked);
|
|
|
|
|
switch (result) {
|
|
|
|
|
case SQLITE_DONE:
|
|
|
|
|
status = PEP_STATUS_OK;
|
|
|
|
@ -3514,7 +3509,7 @@ DYNAMIC_API PEP_STATUS get_revoked(
|
|
|
|
|
|
|
|
|
|
int result;
|
|
|
|
|
|
|
|
|
|
result = sqlite3_step(session->get_revoked);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, session->get_revoked);
|
|
|
|
|
switch (result) {
|
|
|
|
|
case SQLITE_ROW: {
|
|
|
|
|
*revoked_fpr = strdup((const char *)
|
|
|
|
@ -3556,7 +3551,7 @@ DYNAMIC_API PEP_STATUS get_replacement_fpr(
|
|
|
|
|
|
|
|
|
|
int result;
|
|
|
|
|
|
|
|
|
|
result = sqlite3_step(session->get_replacement_fpr);
|
|
|
|
|
result = pEp_sqlite3_step_nonbusy(session, session->get_replacement_fpr);
|
|
|
|
|
switch (result) {
|
|
|
|
|
case SQLITE_ROW: {
|
|
|
|
|
*revoked_fpr = strdup((const char *)
|
|
|
|
@ -3591,7 +3586,7 @@ PEP_STATUS get_last_contacted(
|
|
|
|
|
sql_reset_and_clear_bindings(session->get_last_contacted);
|
|
|
|
|
int result;
|
|
|
|
|
|
|
|
|
|
while ((result = sqlite3_step(session->get_last_contacted)) == SQLITE_ROW) {
|
|
|
|
|
while ((result = pEp_sqlite3_step_nonbusy(session, session->get_last_contacted)) == SQLITE_ROW) {
|
|
|
|
|
pEp_identity *ident = new_identity(
|
|
|
|
|
(const char *) sqlite3_column_text(session->get_last_contacted, 1),
|
|
|
|
|
NULL,
|
|
|
|
|