// set up empty tables, dbFolderInfo, etc. nsresult nsMsgFolderCache::InitNewDB() { nsresult err = InitMDBInfo(); if (NS_SUCCEEDED(err)) { nsIMdbStore *store = GetStore(); // create the unique table for the dbFolderInfo. mdb_err mdberr; mdberr = (nsresult) store->NewTable(GetEnv(), m_folderRowScopeToken, m_folderTableKindToken, PR_FALSE, nsnull, &m_mdbAllFoldersTable); } return err; }
// set up empty tables, dbFolderInfo, etc. nsresult nsMsgFolderCache::InitNewDB() { nsresult err = InitMDBInfo(); if (NS_SUCCEEDED(err)) { nsIMdbStore *store = GetStore(); // create the unique table for the dbFolderInfo. mdb_err mdberr; // TODO: this error assignment is suspicious and never checked. mdberr = (nsresult) store->NewTable(GetEnv(), m_folderRowScopeToken, m_folderTableKindToken, false, nullptr, &m_mdbAllFoldersTable); } return err; }
nsresult nsMsgFolderCache::InitExistingDB() { nsresult err = InitMDBInfo(); if (NS_FAILED(err)) return err; err = GetStore()->GetTable(GetEnv(), &m_allFoldersTableOID, &m_mdbAllFoldersTable); if (NS_SUCCEEDED(err) && m_mdbAllFoldersTable) { nsIMdbTableRowCursor* rowCursor = nsnull; err = m_mdbAllFoldersTable->GetTableRowCursor(GetEnv(), -1, &rowCursor); if (NS_SUCCEEDED(err) && rowCursor) { // iterate over the table rows and create nsMsgFolderCacheElements for each. while (PR_TRUE) { nsresult rv; nsIMdbRow* hdrRow; mdb_pos rowPos; rv = rowCursor->NextRow(GetEnv(), &hdrRow, &rowPos); if (NS_FAILED(rv) || !hdrRow) break; rv = AddCacheElement(EmptyCString(), hdrRow, nsnull); hdrRow->Release(); if (NS_FAILED(rv)) return rv; } rowCursor->Release(); } } else err = NS_ERROR_FAILURE; return err; }
nsDBFolderInfo::nsDBFolderInfo(nsMsgDatabase *mdb) : m_flags(0), m_expiredMark(0), m_expiredMarkColumnToken(0) { m_mdbTable = NULL; m_mdbRow = NULL; m_version = 1; // for upgrading... m_IMAPHierarchySeparator = 0; // imap path separator // mail only (for now) m_folderSize = 0; m_folderDate = 0; m_expungedBytes = 0; // sum of size of deleted messages in folder m_highWaterMessageKey = 0; m_numUnreadMessages = 0; m_numMessages = 0; // IMAP only m_ImapUidValidity = kUidUnknown; m_totalPendingMessages =0; m_unreadPendingMessages = 0; m_mdbTokensInitialized = false; m_charSetOverride = false; if (!gFolderCharsetObserver) { nsresult rv; nsCOMPtr<nsIPrefService> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID, &rv); nsCOMPtr<nsIPrefBranch> prefBranch; if (NS_SUCCEEDED(rv)) { rv = prefs->GetBranch(nsnull, getter_AddRefs(prefBranch)); } if (NS_SUCCEEDED(rv)) { nsCOMPtr<nsIPrefLocalizedString> pls; rv = prefBranch->GetComplexValue(kMAILNEWS_VIEW_DEFAULT_CHARSET, NS_GET_IID(nsIPrefLocalizedString), getter_AddRefs(pls)); if (NS_SUCCEEDED(rv)) { nsString ucsval; pls->ToString(getter_Copies(ucsval)); if (!ucsval.IsEmpty()) { if (!gDefaultCharacterSet) gDefaultCharacterSet = new nsCString; if (gDefaultCharacterSet) CopyUTF16toUTF8(ucsval, *gDefaultCharacterSet); } } rv = prefBranch->GetBoolPref(kMAILNEWS_DEFAULT_CHARSET_OVERRIDE, &gDefaultCharacterOverride); gFolderCharsetObserver = new nsFolderCharsetObserver(); NS_ASSERTION(gFolderCharsetObserver, "failed to create observer"); // register prefs callbacks if (gFolderCharsetObserver) { NS_ADDREF(gFolderCharsetObserver); rv = prefBranch->AddObserver(kMAILNEWS_VIEW_DEFAULT_CHARSET, gFolderCharsetObserver, false); rv = prefBranch->AddObserver(kMAILNEWS_DEFAULT_CHARSET_OVERRIDE, gFolderCharsetObserver, false); // also register for shutdown nsCOMPtr<nsIObserverService> observerService = mozilla::services::GetObserverService(); if (observerService) { rv = observerService->AddObserver(gFolderCharsetObserver, NS_XPCOM_SHUTDOWN_OBSERVER_ID, false); } } } } m_mdb = mdb; if (mdb) { mdb_err err; // mdb->AddRef(); err = m_mdb->GetStore()->StringToToken(mdb->GetEnv(), kDBFolderInfoScope, &m_rowScopeToken); if (err == NS_OK) { err = m_mdb->GetStore()->StringToToken(mdb->GetEnv(), kDBFolderInfoTableKind, &m_tableKindToken); if (err == NS_OK) { gDBFolderInfoOID.mOid_Scope = m_rowScopeToken; gDBFolderInfoOID.mOid_Id = 1; } } InitMDBInfo(); } }