Change type of Context.dbfile to std::path::PathBuf

This change makes code more type-correct, but introduces copying: compiler
refuses to return reference to object behind Arc<RwLock>.
This commit is contained in:
Dmitry Bogatov
2019-08-13 22:51:50 +00:00
committed by holger krekel
parent cb0eb0e68e
commit f463fb3759
2 changed files with 37 additions and 22 deletions

View File

@@ -21,9 +21,11 @@ use crate::types::*;
use crate::x::*; use crate::x::*;
use std::ptr; use std::ptr;
use std::path::PathBuf;
pub struct Context { pub struct Context {
pub userdata: *mut libc::c_void, pub userdata: *mut libc::c_void,
pub dbfile: Arc<RwLock<*mut libc::c_char>>, pub dbfile: Arc<RwLock<Option<PathBuf>>>,
pub blobdir: Arc<RwLock<*mut libc::c_char>>, pub blobdir: Arc<RwLock<*mut libc::c_char>>,
pub sql: Sql, pub sql: Sql,
pub inbox: Arc<RwLock<Imap>>, pub inbox: Arc<RwLock<Imap>>,
@@ -55,15 +57,17 @@ pub struct RunningState {
impl Context { impl Context {
pub fn has_dbfile(&self) -> bool { pub fn has_dbfile(&self) -> bool {
!self.get_dbfile().is_null() self.get_dbfile().is_some()
} }
pub fn has_blobdir(&self) -> bool { pub fn has_blobdir(&self) -> bool {
!self.get_blobdir().is_null() !self.get_blobdir().is_null()
} }
pub fn get_dbfile(&self) -> *const libc::c_char { pub fn get_dbfile(&self) -> Option<PathBuf> {
*self.dbfile.clone().read().unwrap() (*self.dbfile.clone().read().unwrap())
.as_ref()
.map(|x| x.clone())
} }
pub fn get_blobdir(&self) -> *const libc::c_char { pub fn get_blobdir(&self) -> *const libc::c_char {
@@ -130,7 +134,7 @@ pub fn dc_context_new(
) -> Context { ) -> Context {
Context { Context {
blobdir: Arc::new(RwLock::new(std::ptr::null_mut())), blobdir: Arc::new(RwLock::new(std::ptr::null_mut())),
dbfile: Arc::new(RwLock::new(std::ptr::null_mut())), dbfile: Arc::new(RwLock::new(None)),
inbox: Arc::new(RwLock::new({ inbox: Arc::new(RwLock::new({
Imap::new( Imap::new(
cb_get_config, cb_get_config,
@@ -282,8 +286,7 @@ pub unsafe fn dc_close(context: &Context) {
context.sql.close(context); context.sql.close(context);
let mut dbfile = context.dbfile.write().unwrap(); let mut dbfile = context.dbfile.write().unwrap();
free(*dbfile as *mut libc::c_void); *dbfile = None;
*dbfile = ptr::null_mut();
let mut blobdir = context.blobdir.write().unwrap(); let mut blobdir = context.blobdir.write().unwrap();
free(*blobdir as *mut libc::c_void); free(*blobdir as *mut libc::c_void);
*blobdir = ptr::null_mut(); *blobdir = ptr::null_mut();
@@ -302,7 +305,7 @@ pub unsafe fn dc_open(context: &Context, dbfile: &str, blobdir: Option<&str>) ->
if 0 != dc_is_open(context) { if 0 != dc_is_open(context) {
return false; return false;
} }
*context.dbfile.write().unwrap() = dbfile.strdup(); *context.dbfile.write().unwrap() = Some(PathBuf::from(dbfile));
if blobdir.is_some() && !blobdir.unwrap().is_empty() { if blobdir.is_some() && !blobdir.unwrap().is_empty() {
let dir = dc_ensure_no_slash_safe(blobdir.unwrap()).strdup(); let dir = dc_ensure_no_slash_safe(blobdir.unwrap()).strdup();
*context.blobdir.write().unwrap() = dir; *context.blobdir.write().unwrap() = dir;
@@ -446,11 +449,10 @@ pub unsafe fn dc_get_info(context: &Context) -> *mut libc::c_char {
real_msgs, real_msgs,
deaddrop_msgs, deaddrop_msgs,
contacts, contacts,
if context.has_dbfile() { context
as_str(context.get_dbfile()) .get_dbfile()
} else { .as_ref()
unset .map_or(unset, |p| p.to_str().unwrap()),
},
dbversion, dbversion,
if context.has_blobdir() { if context.has_blobdir() {
as_str(context.get_blobdir()) as_str(context.get_blobdir())

View File

@@ -597,7 +597,10 @@ unsafe fn import_backup(context: &Context, backup_to_import: *const libc::c_char
0, 0,
"Import \"{}\" to \"{}\".", "Import \"{}\" to \"{}\".",
as_str(backup_to_import), as_str(backup_to_import),
as_str(context.get_dbfile()), context
.get_dbfile()
.as_ref()
.map_or("<<None>>", |p| p.to_str().unwrap())
); );
if 0 != dc_is_configured(context) { if 0 != dc_is_configured(context) {
@@ -605,8 +608,8 @@ unsafe fn import_backup(context: &Context, backup_to_import: *const libc::c_char
return 0; return 0;
} }
&context.sql.close(&context); &context.sql.close(&context);
dc_delete_file(context, as_path(context.get_dbfile())); dc_delete_file(context, context.get_dbfile().unwrap());
if dc_file_exist(context, as_path(context.get_dbfile())) { if dc_file_exist(context, context.get_dbfile().unwrap()) {
error!( error!(
context, context,
0, "Cannot import backups: Cannot delete the old file.", 0, "Cannot import backups: Cannot delete the old file.",
@@ -617,13 +620,16 @@ unsafe fn import_backup(context: &Context, backup_to_import: *const libc::c_char
if !dc_copy_file( if !dc_copy_file(
context, context,
as_path(backup_to_import), as_path(backup_to_import),
as_path(context.get_dbfile()), context.get_dbfile().unwrap(),
) { ) {
return 0; return 0;
} }
/* error already logged */ /* error already logged */
/* re-open copied database file */ /* re-open copied database file */
if !context.sql.open(&context, as_path(context.get_dbfile()), 0) { if !context
.sql
.open(&context, &context.get_dbfile().unwrap(), 0)
{
return 0; return 0;
} }
@@ -742,15 +748,20 @@ unsafe fn export_backup(context: &Context, dir: *const libc::c_char) -> libc::c_
context, context,
0, 0,
"Backup \"{}\" to \"{}\".", "Backup \"{}\" to \"{}\".",
as_str(context.get_dbfile()), context
.get_dbfile()
.as_ref()
.map_or("<<None>>", |p| p.to_str().unwrap()),
as_str(dest_pathNfilename), as_str(dest_pathNfilename),
); );
if dc_copy_file( if dc_copy_file(
context, context,
as_path(context.get_dbfile()), context.get_dbfile().unwrap(),
as_path(dest_pathNfilename), as_path(dest_pathNfilename),
) { ) {
context.sql.open(&context, as_path(context.get_dbfile()), 0); context
.sql
.open(&context, &context.get_dbfile().unwrap(), 0);
closed = false; closed = false;
/* add all files as blobs to the database copy (this does not require the source to be locked, neigher the destination as it is used only here) */ /* add all files as blobs to the database copy (this does not require the source to be locked, neigher the destination as it is used only here) */
/*for logging only*/ /*for logging only*/
@@ -906,7 +917,9 @@ unsafe fn export_backup(context: &Context, dir: *const libc::c_char) -> libc::c_
} }
} }
if closed { if closed {
context.sql.open(&context, as_path(context.get_dbfile()), 0); context
.sql
.open(&context, &context.get_dbfile().unwrap(), 0);
} }
if 0 != delete_dest_file { if 0 != delete_dest_file {
dc_delete_file(context, as_path(dest_pathNfilename)); dc_delete_file(context, as_path(dest_pathNfilename));