Kaydet (Commit) 042247b3 authored tarafından Michael Meeks's avatar Michael Meeks

Fixup legacy sleepycat db database usage for packages

Previously empty legacy registered_packages.db databases were created
unconditionally, at some efficiency and startup cost, despite these
being deprectated since before version 3.2.
We now handle version mismatches by warning on the console and ignoring
these files.
üst 6beeefab
......@@ -79,35 +79,20 @@ PersistentMap::~PersistentMap()
}
//______________________________________________________________________________
PersistentMap::PersistentMap( OUString const & url_, bool readOnly )
PersistentMap::PersistentMap( OUString const & url )
: m_db( 0, 0 )
{
try {
OUString url( expandUnoRcUrl(url_) );
if ( File::getSystemPathFromFileURL( url, m_sysPath ) != File::E_None )
{
rtl::OUString fileURL = expandUnoRcUrl(url);
if ( File::getSystemPathFromFileURL( fileURL, m_sysPath ) != File::E_None )
OSL_ASSERT( false );
}
OString cstr_sysPath(
OUStringToOString( m_sysPath, RTL_TEXTENCODING_UTF8 ) );
char const * pcstr_sysPath = cstr_sysPath.getStr();
u_int32_t flags = DB_CREATE;
if (readOnly) {
flags = DB_RDONLY;
if (! create_ucb_content(
0, url,
Reference<com::sun::star::ucb::XCommandEnvironment>(),
false /* no throw */ )) {
// ignore non-existent file in read-only mode: simulate empty db
pcstr_sysPath = 0;
flags = DB_CREATE;
}
}
int err = m_db.open(
// xxx todo: DB_THREAD, DB_DBT_MALLOC currently not used
0, pcstr_sysPath, 0, DB_HASH, flags/* | DB_THREAD*/, 0664 /* fs mode */ );
0, cstr_sysPath.getStr(), 0, DB_HASH,
DB_CREATE/* | DB_THREAD*/, 0664 /* fs mode */ );
if (err != 0)
throw_rtexc(err);
}
......
......@@ -41,7 +41,8 @@ namespace dp_misc
typedef ::boost::unordered_map<
::rtl::OString, ::rtl::OString, ::rtl::OStringHash > t_string2string_map;
//==============================================================================
// Class to read obsolete registered extensions
// should be removed for LibreOffice 4.0
class PersistentMap
{
::rtl::OUString m_sysPath;
......@@ -50,7 +51,7 @@ class PersistentMap
public:
~PersistentMap();
PersistentMap( ::rtl::OUString const & url, bool readOnly );
PersistentMap( ::rtl::OUString const & url );
/** in mem db */
PersistentMap();
......
......@@ -127,8 +127,7 @@ namespace dp_manager {
ActivePackages::ActivePackages() {}
ActivePackages::ActivePackages(::rtl::OUString const & url, bool readOnly):
m_map(url, readOnly) {}
ActivePackages::ActivePackages(::rtl::OUString const & url) : m_map(url) {}
ActivePackages::~ActivePackages() {}
......
......@@ -71,7 +71,7 @@ public:
ActivePackages();
ActivePackages(::rtl::OUString const & url, bool readOnly);
ActivePackages(::rtl::OUString const & url);
~ActivePackages();
......
......@@ -198,8 +198,7 @@ void PackageManagerImpl::initActivationLayer(
dbName = m_registrationData_expanded + OUSTR("/extensions.db");
}
//The data base can always be written because it it always in the user installation
m_activePackagesDB.reset(
new ActivePackages( dbName, false ) );
m_activePackagesDB.reset( new ActivePackages( dbName ) );
if (! m_readOnly && ! m_context.equals(OUSTR("bundled")))
{
......
......@@ -43,6 +43,7 @@
#include "osl/file.hxx"
#include "cppuhelper/exc_hlp.hxx"
#include "ucbhelper/content.hxx"
#include "unotools/ucbhelper.hxx"
#include "comphelper/anytostring.hxx"
#include "comphelper/servicedecl.hxx"
#include "xmlscript/xml_helper.hxx"
......@@ -120,8 +121,8 @@ class BackendImpl : public ::dp_registry::backend::PackageRegistryBackend
OUString const & identifier,
Reference<XCommandEnvironment> const & xCmdEnv );
// for backwards compatibility - nil if no (compatible) back-compat db present
::std::auto_ptr<PersistentMap> m_registeredPackages;
// for backwards compatibility
virtual void SAL_CALL disposing();
......@@ -209,7 +210,7 @@ BackendImpl::BackendImpl(
if (transientMode())
{
//TODO
// TODO
}
else
{
......@@ -224,12 +225,23 @@ BackendImpl::BackendImpl(
::std::list<OUString> folders = m_backendDb->getAllDataUrls();
deleteUnusedFolders(OUString(), folders);
configmgrini_verify_init( xCmdEnv );
m_registeredPackages.reset(
new PersistentMap(
makeURL( getCachePath(), OUSTR("registered_packages.db") ),
false ) );
::std::auto_ptr<PersistentMap> pMap;
rtl::OUString aCompatURL( makeURL( getCachePath(), OUSTR("registered_packages.db") ) );
// Don't create it if it doesn't exist already
if ( ::utl::UCBContentHelper::Exists( expandUnoRcUrl( aCompatURL ) ) )
{
try {
pMap = ::std::auto_ptr<PersistentMap>( new PersistentMap( aCompatURL ) );
} catch (Exception &e) { // const uno::RunTimeException &e) {
rtl::OStringBuffer aStr( "Exception loading legacy package database: '" );
aStr.append( rtl::OUStringToOString( e.Message, osl_getThreadTextEncoding() ) );
aStr.append( "' - ignoring file, please remove it.\n" );
dp_misc::writeConsole( aStr.getStr() );
}
}
m_registeredPackages = pMap;
}
}
......@@ -549,10 +561,12 @@ BackendImpl::PackageImpl::isRegistered_(
bool bReg = false;
if (that->hasActiveEntry(getURL()))
bReg = true;
if (!bReg)
//fallback for user extension registered in berkeley DB
if (!bReg && that->m_registeredPackages.get())
{
// fallback for user extension registered in berkeley DB
bReg = that->m_registeredPackages->has(
rtl::OUStringToOString( url, RTL_TEXTENCODING_UTF8 ));
}
return beans::Optional< beans::Ambiguous<sal_Bool> >(
true, beans::Ambiguous<sal_Bool>( bReg, false ) );
......@@ -735,7 +749,9 @@ void BackendImpl::PackageImpl::processPackage_(
}
else // revoke
{
if (!that->removeFromConfigmgrIni(m_isSchema, url, xCmdEnv)) {
if (!that->removeFromConfigmgrIni(m_isSchema, url, xCmdEnv) &&
that->m_registeredPackages.get()) {
// Obsolete package database handling - should be removed for LibreOffice 4.0
t_string2string_map entries(
that->m_registeredPackages->getEntries());
for (t_string2string_map::iterator i(entries.begin());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment