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:
parent
8554ef264d
commit
1b64eaaeda
4 changed files with 114 additions and 106 deletions
|
@ -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();
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue