1
0
Fork 0
mirror of https://github.com/deltachat/deltachat-core.git synced 2025-10-05 10:39:27 +02:00

Add config get/set routines that can be locked manually so that several calls can be locked together.

This commit is contained in:
B. Petersen 2016-07-16 23:54:27 +02:00
parent 8554ef264d
commit 1b64eaaeda
4 changed files with 114 additions and 106 deletions

View file

@ -154,97 +154,6 @@ size_t MrMailbox::GetMsgCnt()
} }
/*******************************************************************************
* Handle configuration
******************************************************************************/
bool MrMailbox::SetConfig(const char* key, const char* value)
{
MrSqlite3Locker locker(m_sql);
int state;
if( key == NULL || !m_sql.Ok() ) {
return false;
}
if( value )
{
// insert/update key=value
sqlite3_reset (m_sql.m_SELECT_value_FROM_config_k);
sqlite3_bind_text (m_sql.m_SELECT_value_FROM_config_k, 1, key, -1, SQLITE_STATIC);
state=sqlite3_step(m_sql.m_SELECT_value_FROM_config_k);
if( state == SQLITE_DONE ) {
sqlite3_reset (m_sql.m_INSERT_INTO_config_kv);
sqlite3_bind_text (m_sql.m_INSERT_INTO_config_kv, 1, key, -1, SQLITE_STATIC);
sqlite3_bind_text (m_sql.m_INSERT_INTO_config_kv, 2, value, -1, SQLITE_STATIC);
state=sqlite3_step(m_sql.m_INSERT_INTO_config_kv);
}
else if( state == SQLITE_ROW ) {
sqlite3_reset (m_sql.m_UPDATE_config_vk);
sqlite3_bind_text (m_sql.m_UPDATE_config_vk, 1, value, -1, SQLITE_STATIC);
sqlite3_bind_text (m_sql.m_UPDATE_config_vk, 2, key, -1, SQLITE_STATIC);
state=sqlite3_step(m_sql.m_UPDATE_config_vk);
}
else {
return false;
}
}
else
{
// delete key
sqlite3_reset (m_sql.m_DELETE_FROM_config_k);
sqlite3_bind_text (m_sql.m_DELETE_FROM_config_k, 1, key, -1, SQLITE_STATIC);
state=sqlite3_step(m_sql.m_DELETE_FROM_config_k);
}
if( state != SQLITE_DONE ) {
return false;
}
return true;
}
char* MrMailbox::GetConfig(const char* key, const char* def) // the returned string must be free()'d
{
MrSqlite3Locker locker(m_sql);
if( key == NULL || !m_sql.Ok() ) {
return false;
}
sqlite3_reset (m_sql.m_SELECT_value_FROM_config_k);
sqlite3_bind_text(m_sql.m_SELECT_value_FROM_config_k, 1, key, -1, SQLITE_STATIC);
if( sqlite3_step(m_sql.m_SELECT_value_FROM_config_k) == SQLITE_ROW )
{
const unsigned char* ptr = sqlite3_column_text(m_sql.m_SELECT_value_FROM_config_k, 0); // Do not pass the pointers returned from sqlite3_column_text(), etc. into sqlite3_free().
if( ptr )
{
// success, fall through below to free objects
return strdup((const char*)ptr);
}
}
// return the default value
if( def ) {
return strdup(def);
}
return NULL;
}
int32_t MrMailbox::GetConfigInt(const char* key, int32_t def)
{
char* str = GetConfig(key, NULL);
if( str == NULL ) {
return def;
}
return atol(str);
}
/******************************************************************************* /*******************************************************************************
* Misc. * Misc.
******************************************************************************/ ******************************************************************************/
@ -254,25 +163,31 @@ char* MrMailbox::GetInfo()
{ {
const char unset[] = "<unset>"; const char unset[] = "<unset>";
const char set[] = "<set>"; const char set[] = "<set>";
#define BUF_BYTES 4096 #define BUF_BYTES 10000
char* buf = (char*)malloc(BUF_BYTES+1); char* buf = (char*)malloc(BUF_BYTES+1);
if( buf == NULL ) { if( buf == NULL ) {
return NULL; // error return NULL; // error
} }
// read data (all pointers may be NULL!) // read data (all pointers may be NULL!)
char* dbfile = GetDbFile(); char *dbfile, *email, *mail_server, *mail_port, *mail_user, *mail_pw, *send_server, *send_port, *send_user, *send_pw;
char* email = GetConfig("email", NULL); {
MrSqlite3Locker locker(m_sql);
char* mail_server = GetConfig("mail_server", NULL); dbfile = m_sql.GetDbFile();
char* mail_port = GetConfig("mail_port", NULL); email = m_sql.GetConfig("email", NULL);
char* mail_user = GetConfig("mail_user", NULL);
char* mail_pw = GetConfig("mail_pw", NULL); mail_server = m_sql.GetConfig("mail_server", NULL);
mail_port = m_sql.GetConfig("mail_port", NULL);
mail_user = m_sql.GetConfig("mail_user", NULL);
mail_pw = m_sql.GetConfig("mail_pw", NULL);
send_server = m_sql.GetConfig("send_server", NULL);
send_port = m_sql.GetConfig("send_port", NULL);
send_user = m_sql.GetConfig("send_user", NULL);
send_pw = m_sql.GetConfig("send_pw", NULL);
}
char* send_server = GetConfig("send_server", NULL);
char* send_port = GetConfig("send_port", NULL);
char* send_user = GetConfig("send_user", NULL);
char* send_pw = GetConfig("send_pw", NULL);
int chats = GetChatCnt(); int chats = GetChatCnt();
int messages = GetMsgCnt(); int messages = GetMsgCnt();
int contacts = GetContactCnt(); int contacts = GetContactCnt();

View file

@ -72,12 +72,12 @@ public:
size_t GetMsgCnt (); // total number of messages, just for statistics, normally not needed for the program flow size_t GetMsgCnt (); // total number of messages, just for statistics, normally not needed for the program flow
// handle configurations // handle configurations
bool SetConfig (const char* key, const char* value); bool SetConfig (const char* key, const char* value) { MrSqlite3Locker l(m_sql); return m_sql.SetConfig(key, value); }
char* GetConfig (const char* key, const char* def); // the returned string must be free()'d, returns NULL on errors char* GetConfig (const char* key, const char* def) { MrSqlite3Locker l(m_sql); return m_sql.GetConfig(key, def); } // the returned string must be free()'d, returns NULL on errors
int32_t GetConfigInt (const char* key, int32_t def); int32_t GetConfigInt (const char* key, int32_t def) { MrSqlite3Locker l(m_sql); return m_sql.GetConfigInt(key, def); }
// misc // misc
char* GetDbFile () { return m_sql.GetDbFile(); } // the returned string must be free()'d, returns NULL on errors or if no database is open char* GetDbFile () { MrSqlite3Locker l(m_sql); return m_sql.GetDbFile(); } // the returned string must be free()'d, returns NULL on errors or if no database is open
char* GetInfo (); // multi-line output; the returned string must be free()'d, returns NULL on errors char* GetInfo (); // multi-line output; the returned string must be free()'d, returns NULL on errors
private: private:

View file

@ -220,3 +220,91 @@ table_exists_Error:
return ret; return ret;
} }
/*******************************************************************************
* Handle configuration
******************************************************************************/
bool MrSqlite3::SetConfig(const char* key, const char* value)
{
int state;
if( key == NULL || !Ok() ) {
return false;
}
if( value )
{
// insert/update key=value
sqlite3_reset (m_SELECT_value_FROM_config_k);
sqlite3_bind_text (m_SELECT_value_FROM_config_k, 1, key, -1, SQLITE_STATIC);
state=sqlite3_step(m_SELECT_value_FROM_config_k);
if( state == SQLITE_DONE ) {
sqlite3_reset (m_INSERT_INTO_config_kv);
sqlite3_bind_text (m_INSERT_INTO_config_kv, 1, key, -1, SQLITE_STATIC);
sqlite3_bind_text (m_INSERT_INTO_config_kv, 2, value, -1, SQLITE_STATIC);
state=sqlite3_step(m_INSERT_INTO_config_kv);
}
else if( state == SQLITE_ROW ) {
sqlite3_reset (m_UPDATE_config_vk);
sqlite3_bind_text (m_UPDATE_config_vk, 1, value, -1, SQLITE_STATIC);
sqlite3_bind_text (m_UPDATE_config_vk, 2, key, -1, SQLITE_STATIC);
state=sqlite3_step(m_UPDATE_config_vk);
}
else {
return false;
}
}
else
{
// delete key
sqlite3_reset (m_DELETE_FROM_config_k);
sqlite3_bind_text (m_DELETE_FROM_config_k, 1, key, -1, SQLITE_STATIC);
state=sqlite3_step(m_DELETE_FROM_config_k);
}
if( state != SQLITE_DONE ) {
return false;
}
return true;
}
char* MrSqlite3::GetConfig(const char* key, const char* def) // the returned string must be free()'d
{
if( key == NULL || !Ok() ) {
return NULL;
}
sqlite3_reset (m_SELECT_value_FROM_config_k);
sqlite3_bind_text(m_SELECT_value_FROM_config_k, 1, key, -1, SQLITE_STATIC);
if( sqlite3_step(m_SELECT_value_FROM_config_k) == SQLITE_ROW )
{
const unsigned char* ptr = sqlite3_column_text(m_SELECT_value_FROM_config_k, 0); // Do not pass the pointers returned from sqlite3_column_text(), etc. into sqlite3_free().
if( ptr )
{
// success, fall through below to free objects
return strdup((const char*)ptr);
}
}
// return the default value
if( def ) {
return strdup(def);
}
return NULL;
}
int32_t MrSqlite3::GetConfigInt(const char* key, int32_t def)
{
char* str = GetConfig(key, NULL);
if( str == NULL ) {
return def;
}
return atol(str);
}

View file

@ -43,6 +43,11 @@ public:
void Close (); void Close ();
bool Ok () const { return (m_cobj!=NULL); } bool Ok () const { return (m_cobj!=NULL); }
// handle configurations
bool SetConfig (const char* key, const char* value);
char* GetConfig (const char* key, const char* def); // the returned string must be free()'d, returns NULL on errors
int32_t GetConfigInt (const char* key, int32_t def);
// misc // misc
char* GetDbFile (); // the returned string must be free()'d, returns NULL on errors or if no database is open char* GetDbFile (); // the returned string must be free()'d, returns NULL on errors or if no database is open