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.
|
||||
******************************************************************************/
|
||||
|
@ -254,25 +163,31 @@ char* MrMailbox::GetInfo()
|
|||
{
|
||||
const char unset[] = "<unset>";
|
||||
const char set[] = "<set>";
|
||||
#define BUF_BYTES 4096
|
||||
#define BUF_BYTES 10000
|
||||
char* buf = (char*)malloc(BUF_BYTES+1);
|
||||
if( buf == NULL ) {
|
||||
return NULL; // error
|
||||
}
|
||||
|
||||
// read data (all pointers may be NULL!)
|
||||
char* dbfile = GetDbFile();
|
||||
char* email = GetConfig("email", NULL);
|
||||
char *dbfile, *email, *mail_server, *mail_port, *mail_user, *mail_pw, *send_server, *send_port, *send_user, *send_pw;
|
||||
{
|
||||
MrSqlite3Locker locker(m_sql);
|
||||
|
||||
char* mail_server = GetConfig("mail_server", NULL);
|
||||
char* mail_port = GetConfig("mail_port", NULL);
|
||||
char* mail_user = GetConfig("mail_user", NULL);
|
||||
char* mail_pw = GetConfig("mail_pw", NULL);
|
||||
dbfile = m_sql.GetDbFile();
|
||||
email = m_sql.GetConfig("email", 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 messages = GetMsgCnt();
|
||||
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
|
||||
|
||||
// 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);
|
||||
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) { 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) { MrSqlite3Locker l(m_sql); return m_sql.GetConfigInt(key, def); }
|
||||
|
||||
// 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
|
||||
|
||||
private:
|
||||
|
|
|
@ -220,3 +220,91 @@ table_exists_Error:
|
|||
|
||||
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 ();
|
||||
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
|
||||
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