summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/delphi/m_db_int.inc3
-rw-r--r--include/m_db_int.h1
-rw-r--r--plugins/Db3x_mmap/src/dbintf.h3
-rw-r--r--plugins/Dbx_kv/src/dbintf.h1
-rw-r--r--plugins/Dbx_kyoto/src/dbintf.h1
-rw-r--r--plugins/Dbx_mdb/src/dbintf.h1
-rw-r--r--plugins/Import/src/import.cpp29
7 files changed, 32 insertions, 7 deletions
diff --git a/include/delphi/m_db_int.inc b/include/delphi/m_db_int.inc
index 29ffc6844e..9511534cae 100644
--- a/include/delphi/m_db_int.inc
+++ b/include/delphi/m_db_int.inc
@@ -71,6 +71,7 @@ type
TMIDatabase = record
m_cache: PMIDatabaseCache;
+ IsRelational:function():long; stdcall;
SetCacheSafetyMode:procedure(val:bool); stdcall;
GetContactCount:function():long; stdcall;
@@ -162,7 +163,7 @@ const
EGROKPRF_UNKHEADER = 2; // header not supported, not a supported profile
EGROKPRF_VERNEWER = 3; // header correct, version in profile newer than reader/writer
EGROKPRF_DAMAGED = 4; // header/version fine, other internal data missing, damaged.
- EGROKPRF_OBSOLETE = 5; // obsolete database version detected, requiring conversion
+ EGROKPRF_OBSOLETE = 5; // obsolete database version detected, requiring conversion
// makeDatabase() error codes
EMKPRF_CREATEFAILED = 1; // for some reason CreateFile() didnt like something
diff --git a/include/m_db_int.h b/include/m_db_int.h
index a38c07f140..07dbc871fe 100644
--- a/include/m_db_int.h
+++ b/include/m_db_int.h
@@ -84,6 +84,7 @@ interface MIDatabase
{
MIDatabaseCache* m_cache;
+ STDMETHOD_(BOOL, IsRelational)(void) PURE;
STDMETHOD_(void, SetCacheSafetyMode)(BOOL) PURE;
STDMETHOD_(LONG, GetContactCount)(void) PURE;
diff --git a/plugins/Db3x_mmap/src/dbintf.h b/plugins/Db3x_mmap/src/dbintf.h
index 761c28ede9..509f8209e4 100644
--- a/plugins/Db3x_mmap/src/dbintf.h
+++ b/plugins/Db3x_mmap/src/dbintf.h
@@ -208,7 +208,8 @@ struct CDb3Mmap : public MIDatabase, public MIDatabaseChecker, public MZeroedObj
__forceinline bool usesPassword() const { return m_bUsesPassword; }
public:
- STDMETHODIMP_(void) SetCacheSafetyMode(BOOL);
+ STDMETHODIMP_(BOOL) IsRelational(void) { return FALSE; }
+ STDMETHODIMP_(void) SetCacheSafetyMode(BOOL);
STDMETHODIMP_(LONG) GetContactCount(void);
STDMETHODIMP_(MCONTACT) FindFirstContact(const char *szProto = NULL);
diff --git a/plugins/Dbx_kv/src/dbintf.h b/plugins/Dbx_kv/src/dbintf.h
index b9decbc0c3..97c8c507d9 100644
--- a/plugins/Dbx_kv/src/dbintf.h
+++ b/plugins/Dbx_kv/src/dbintf.h
@@ -148,6 +148,7 @@ struct CDbxKV : public MIDatabase, public MIDatabaseChecker, public MZeroedObjec
__forceinline bool usesPassword() const { return m_bUsesPassword; }
public:
+ STDMETHODIMP_(BOOL) IsRelational(void) { return TRUE; }
STDMETHODIMP_(void) SetCacheSafetyMode(BOOL);
STDMETHODIMP_(LONG) GetContactCount(void);
diff --git a/plugins/Dbx_kyoto/src/dbintf.h b/plugins/Dbx_kyoto/src/dbintf.h
index e78aaff6cb..8e8dd0f7c6 100644
--- a/plugins/Dbx_kyoto/src/dbintf.h
+++ b/plugins/Dbx_kyoto/src/dbintf.h
@@ -149,6 +149,7 @@ struct CDbxKyoto : public MIDatabase, public MIDatabaseChecker, public MZeroedOb
__forceinline bool usesPassword() const { return m_bUsesPassword; }
public:
+ STDMETHODIMP_(BOOL) IsRelational(void) { return TRUE; }
STDMETHODIMP_(void) SetCacheSafetyMode(BOOL);
STDMETHODIMP_(LONG) GetContactCount(void);
diff --git a/plugins/Dbx_mdb/src/dbintf.h b/plugins/Dbx_mdb/src/dbintf.h
index 4183e6cd18..c3736f6bda 100644
--- a/plugins/Dbx_mdb/src/dbintf.h
+++ b/plugins/Dbx_mdb/src/dbintf.h
@@ -151,6 +151,7 @@ struct CDbxMdb : public MIDatabase, public MIDatabaseChecker, public MZeroedObje
__forceinline bool usesPassword() const { return m_bUsesPassword; }
public:
+ STDMETHODIMP_(BOOL) IsRelational(void) { return TRUE; }
STDMETHODIMP_(void) SetCacheSafetyMode(BOOL);
STDMETHODIMP_(LONG) GetContactCount(void);
diff --git a/plugins/Import/src/import.cpp b/plugins/Import/src/import.cpp
index d3b70833e7..c9ca158b54 100644
--- a/plugins/Import/src/import.cpp
+++ b/plugins/Import/src/import.cpp
@@ -876,15 +876,30 @@ static int CopySystemSettings(const char *szModuleName, DWORD, LPARAM param)
static void ImportHistory(MCONTACT hContact, PROTOACCOUNT **protocol, int protoCount)
{
MCONTACT hDst;
+ bool bIsMeta = false;
+ bool bIsRelational = srcDb->IsRelational() != 0;
// Is it contact's history import?
if (hContact) {
// we ignore history import for metacontacts
// the metahistory will be generated automatically by gathering subs' histories
DBCachedContact *cc = srcDb->m_cache->GetCachedContact(hContact);
- if (cc == NULL || cc->IsMeta())
+ if (cc == NULL)
return;
+ // for k/v databases we read history for subs only
+ if (bIsRelational) {
+ if (cc->IsMeta())
+ return;
+ }
+ // for mmap we read history for metas only
+ else {
+ if (cc->IsSub())
+ return;
+
+ bIsMeta = cc->IsMeta();
+ }
+
if ((hDst = MapContact(hContact)) == INVALID_CONTACT_ID) {
nSkippedContacts++;
return;
@@ -967,10 +982,14 @@ static void ImportHistory(MCONTACT hContact, PROTOACCOUNT **protocol, int protoC
dbei.flags |= DBEF_READ;
// add dbevent
- if (dstDb->AddEvent(hDst, &dbei) != NULL)
- nMessagesCount++;
- else
- AddMessage(LPGENT("Failed to add message"));
+ MCONTACT hOwner = (bIsMeta) ? MapContact(srcDb->GetEventContact(hEvent)) : hDst;
+ if (hOwner != INVALID_CONTACT_ID) {
+ // add dbevent
+ if (dstDb->AddEvent(hOwner, &dbei) != NULL)
+ nMessagesCount++;
+ else
+ AddMessage(LPGENT("Failed to add message"));
+ }
}
else nDupes++;
}