public static void SaveDocument( Document doc )
{
bool hasLocalTransaction = false;
//------------------------------------------------------------//
//--- Only save to the database if the content is not null ---//
//------------------------------------------------------------//
BASEBean.eDataState stateId;
if (doc.DocumentContent != null)
{
if (String.IsNullOrEmpty( doc.uuid ))
doc.uuid = Guid.NewGuid().ToString();
//-------------------------------------------------//
//--- We will save to the database at this time ---//
//-------------------------------------------------//
DocumentDAO documentDAO = DataManager.getDocumentDAO();
try
{
if (!documentDAO.IsInTransaction)
{
documentDAO.StartTransaction();
hasLocalTransaction = true;
}
var document = new dbDocument();
bool hasDocumentByUuid = documentDAO.hasDocument( doc.uuid );
bool hasDocumentByName = documentDAO.hasDocument( doc.name, (int) doc.DocumentType );
if (hasDocumentByName != hasDocumentByUuid)
{
string msg =
"There is an inconsistancy with the document uuid and the internal uuid for the device, please correct.";
MessageBox.Show( msg, @"E R R O R" );
throw new Exception( msg );
}
if (hasDocumentByUuid)
{
document = documentDAO.openDatabaseDocument( doc.uuid );
stateId = document.DataState = ( doc.DataState == BASEBean.eDataState.DS_DELETE
? BASEBean.eDataState.DS_DELETE
: BASEBean.eDataState.DS_EDIT );
document.dateUpdated = DateTime.UtcNow;
}
else
{
stateId = document.DataState = BASEBean.eDataState.DS_ADD;
document.dateAdded = DateTime.UtcNow;
}
int assetsDeleted = 0;
if (stateId == BASEBean.eDataState.DS_DELETE)
{
if (documentDAO.HasAssets( doc.uuid ))
{
assetsDeleted = documentDAO.DeleteAssets( doc.uuid );
}
}
document.UUID = Guid.Parse( doc.uuid );
document.documentDescription = doc.Description;
document.documentTypeId = (int) doc.DocumentType;
document.documentContent = doc.DocumentContent;
document.documentName = doc.name;
document.documentSize = doc.DocumentContent.Length;
document.contentType = doc.ContentType;
document.crc = doc.Crc32;
document.save();
if (hasLocalTransaction )
documentDAO.CommitTransaction();
LogManager.Trace( "Document {0} has been {1}",
document.documentName,
stateId == BASEBean.eDataState.DS_ADD
? "Added"
: stateId == BASEBean.eDataState.DS_DELETE
? "Deleted"
: "Saved" );
if (assetsDeleted > 0)
LogManager.Trace( "Deleted {0} associated assets.", assetsDeleted );
if (document.DataState == BASEBean.eDataState.DS_ADD)
document.DataState = BASEBean.eDataState.DS_EDIT;
}
catch (Exception e)
{
if (hasLocalTransaction)
{
documentDAO.RollbackTransaction();
LogManager.Error(e);
}
else
{
throw;
}
}
}
}