Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
BC
public
liblinphone
Commits
6110b30f
Commit
6110b30f
authored
Oct 16, 2017
by
Ronan
Browse files
feat(MainDb): add a private header
parent
dc0da30d
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
177 additions
and
148 deletions
+177
-148
src/CMakeLists.txt
src/CMakeLists.txt
+1
-0
src/db/main-db-p.h
src/db/main-db-p.h
+71
-0
src/db/main-db.cpp
src/db/main-db.cpp
+105
-148
No files found.
src/CMakeLists.txt
View file @
6110b30f
...
...
@@ -82,6 +82,7 @@ set(LINPHONE_CXX_OBJECTS_PRIVATE_HEADER_FILES
core/core.h
db/abstract/abstract-db-p.h
db/abstract/abstract-db.h
db/main-db-p.h
db/main-db.h
db/session/db-session-p.h
db/session/db-session-provider.h
...
...
src/db/main-db-p.h
0 → 100644
View file @
6110b30f
/*
* main-db-p.h
* Copyright (C) 2010-2017 Belledonne Communications SARL
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef _MAIN_DB_P_H_
#define _MAIN_DB_P_H_
#include "abstract/abstract-db-p.h"
#include "chat/chat-message/chat-message.h"
#include "event-log/event-log.h"
#include "main-db.h"
// =============================================================================
LINPHONE_BEGIN_NAMESPACE
class
ChatRoom
;
class
Content
;
struct
MessageEventReferences
{
long
eventId
;
long
localSipAddressId
;
long
remoteSipAddressId
;
long
chatRoomId
;
};
class
MainDbPrivate
:
public
AbstractDbPrivate
{
public:
private:
long
insertSipAddress
(
const
std
::
string
&
sipAddress
);
void
insertContent
(
long
messageEventId
,
const
Content
&
content
);
long
insertContentType
(
const
std
::
string
&
contentType
);
long
insertEvent
(
EventLog
::
Type
type
,
const
tm
&
date
);
long
insertChatRoom
(
long
sipAddressId
,
int
capabilities
,
const
tm
&
date
);
void
insertChatRoomParticipant
(
long
chatRoomId
,
long
sipAddressId
,
bool
isAdmin
);
long
insertMessageEvent
(
const
MessageEventReferences
&
references
,
ChatMessage
::
State
state
,
ChatMessage
::
Direction
direction
,
const
std
::
string
&
imdnMessageId
,
bool
isSecured
,
const
std
::
list
<
Content
>
&
contents
);
void
insertMessageParticipant
(
long
messageEventId
,
long
sipAddressId
,
ChatMessage
::
State
state
);
std
::
unordered_map
<
std
::
string
,
std
::
weak_ptr
<
ChatRoom
>>
chatRooms
;
L_DECLARE_PUBLIC
(
MainDb
);
};
LINPHONE_END_NAMESPACE
#endif // ifndef _MAIN_DB_P_H_
src/db/main-db.cpp
View file @
6110b30f
...
...
@@ -26,8 +26,6 @@
#include "linphone/utils/utils.h"
#include "abstract/abstract-db-p.h"
#include "chat/chat-message/chat-message.h"
#include "chat/chat-room/chat-room.h"
#include "conference/participant.h"
#include "content/content-type.h"
...
...
@@ -37,8 +35,7 @@
#include "event-log/chat-message-event.h"
#include "event-log/event-log-p.h"
#include "logger/logger.h"
#include "main-db.h"
#include "main-db-p.h"
// =============================================================================
...
...
@@ -46,45 +43,6 @@ using namespace std;
LINPHONE_BEGIN_NAMESPACE
struct
MessageEventReferences
{
#ifdef SOCI_ENABLED
long
eventId
;
long
localSipAddressId
;
long
remoteSipAddressId
;
long
chatRoomId
;
#endif
};
class
MainDbPrivate
:
public
AbstractDbPrivate
{
#ifdef SOCI_ENABLED
public:
long
insertSipAddress
(
const
string
&
sipAddress
);
void
insertContent
(
long
messageEventId
,
const
Content
&
content
);
long
insertContentType
(
const
string
&
contentType
);
long
insertEvent
(
EventLog
::
Type
type
,
const
tm
&
date
);
long
insertChatRoom
(
long
sipAddressId
,
int
capabilities
,
const
tm
&
date
);
void
insertChatRoomParticipant
(
long
chatRoomId
,
long
sipAddressId
,
bool
isAdmin
);
long
insertMessageEvent
(
const
MessageEventReferences
&
references
,
ChatMessage
::
State
state
,
ChatMessage
::
Direction
direction
,
const
string
&
imdnMessageId
,
bool
isSecured
,
const
list
<
Content
>
&
contents
);
void
insertMessageParticipant
(
long
messageEventId
,
long
sipAddressId
,
ChatMessage
::
State
state
);
void
importLegacyMessages
(
const
soci
::
rowset
<
soci
::
row
>
&
messages
);
#endif
private:
unordered_map
<
string
,
weak_ptr
<
ChatRoom
>>
chatRooms
;
L_DECLARE_PUBLIC
(
MainDb
);
};
// -----------------------------------------------------------------------------
MainDb
::
MainDb
()
:
AbstractDb
(
*
new
MainDbPrivate
)
{}
...
...
@@ -306,95 +264,6 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
return
T
();
}
void
MainDbPrivate
::
importLegacyMessages
(
const
soci
::
rowset
<
soci
::
row
>
&
messages
)
{
soci
::
session
*
session
=
dbSession
.
getBackendSession
<
soci
::
session
>
();
soci
::
transaction
tr
(
*
session
);
for
(
const
auto
&
message
:
messages
)
{
const
int
direction
=
message
.
get
<
int
>
(
LEGACY_MESSAGE_COL_DIRECTION
);
if
(
direction
!=
0
&&
direction
!=
1
)
{
lWarning
()
<<
"Unable to import legacy message with invalid direction."
;
continue
;
}
const
int
state
=
message
.
get
<
int
>
(
LEGACY_MESSAGE_COL_STATE
,
static_cast
<
int
>
(
ChatMessage
::
State
::
Displayed
)
);
if
(
state
<
0
||
state
>
static_cast
<
int
>
(
ChatMessage
::
State
::
Displayed
))
{
lWarning
()
<<
"Unable to import legacy message with invalid state."
;
continue
;
}
const
tm
date
=
Utils
::
getLongAsTm
(
message
.
get
<
int
>
(
LEGACY_MESSAGE_COL_DATE
,
0
));
bool
isNull
;
const
string
url
=
getValueFromLegacyMessage
<
string
>
(
message
,
LEGACY_MESSAGE_COL_URL
,
isNull
);
const
int
contentId
=
message
.
get
<
int
>
(
LEGACY_MESSAGE_COL_CONTENT_ID
,
-
1
);
ContentType
contentType
(
message
.
get
<
string
>
(
LEGACY_MESSAGE_COL_CONTENT_TYPE
,
""
));
if
(
!
contentType
.
isValid
())
contentType
=
contentId
!=
-
1
?
ContentType
::
FileTransfer
:
(
isNull
?
ContentType
::
PlainText
:
ContentType
::
ExternalBody
);
if
(
contentType
==
ContentType
::
ExternalBody
)
{
lInfo
()
<<
"Import of external body content is skipped."
;
continue
;
}
const
string
text
=
getValueFromLegacyMessage
<
string
>
(
message
,
LEGACY_MESSAGE_COL_TEXT
,
isNull
);
Content
content
;
content
.
setContentType
(
contentType
);
if
(
contentType
==
ContentType
::
PlainText
)
{
if
(
isNull
)
{
lWarning
()
<<
"Unable to import legacy message with no text."
;
continue
;
}
content
.
setBody
(
text
);
}
else
{
if
(
contentType
!=
ContentType
::
FileTransfer
)
{
lWarning
()
<<
"Unable to import unsupported legacy content."
;
continue
;
}
const
string
appData
=
getValueFromLegacyMessage
<
string
>
(
message
,
LEGACY_MESSAGE_COL_APP_DATA
,
isNull
);
if
(
isNull
)
{
lWarning
()
<<
"Unable to import legacy file message without app data."
;
continue
;
}
content
.
setAppData
(
"legacy"
,
appData
);
}
struct
MessageEventReferences
references
;
references
.
eventId
=
insertEvent
(
EventLog
::
Type
::
ChatMessage
,
date
);
references
.
localSipAddressId
=
insertSipAddress
(
message
.
get
<
string
>
(
LEGACY_MESSAGE_COL_LOCAL_ADDRESS
));
references
.
remoteSipAddressId
=
insertSipAddress
(
message
.
get
<
string
>
(
LEGACY_MESSAGE_COL_REMOTE_ADDRESS
));
references
.
chatRoomId
=
insertChatRoom
(
references
.
remoteSipAddressId
,
static_cast
<
int
>
(
ChatRoom
::
Capabilities
::
Basic
),
date
);
insertChatRoomParticipant
(
references
.
chatRoomId
,
references
.
remoteSipAddressId
,
false
);
long
messageEventId
=
insertMessageEvent
(
references
,
static_cast
<
ChatMessage
::
State
>
(
state
),
static_cast
<
ChatMessage
::
Direction
>
(
direction
),
message
.
get
<
string
>
(
LEGACY_MESSAGE_COL_IMDN_MESSAGE_ID
,
""
),
!!
message
.
get
<
int
>
(
LEGACY_MESSAGE_COL_IS_SECURED
,
0
),
{
move
(
content
)
}
);
if
(
state
!=
static_cast
<
int
>
(
ChatMessage
::
State
::
Displayed
))
insertMessageParticipant
(
messageEventId
,
references
.
remoteSipAddressId
,
static_cast
<
ChatMessage
::
State
>
(
state
));
}
tr
.
commit
();
}
// -----------------------------------------------------------------------------
void
MainDb
::
init
()
{
...
...
@@ -786,25 +655,26 @@ shared_ptr<ChatRoom> MainDb::findChatRoom (const string &peerAddress) const {
}
catch
(
const
exception
&
)
{
lError
()
<<
"Cannot lock chat room: `"
+
peerAddress
+
"`"
;
}
}
else
{
L_BEGIN_LOG_EXCEPTION
return
shared_ptr
<
ChatRoom
>
();
}
soci
::
session
*
session
=
d
->
dbSession
.
getBackendSession
<
soci
::
session
>
();
L_BEGIN_LOG_EXCEPTION
tm
creationDate
;
tm
lastUpdateDate
;
int
capabilities
;
string
subject
;
soci
::
session
*
session
=
d
->
dbSession
.
getBackendSession
<
soci
::
session
>
();
*
session
<<
"SELECT creation_date, last_update_date, capabilities, subject "
" FROM chat_room"
" WHERE peer_sip_address_id = ("
" SELECT id from sip_address WHERE value = :peerAddress"
" )"
,
soci
::
use
(
peerAddress
),
soci
::
into
(
creationDate
),
soci
::
into
(
lastUpdateDate
),
soci
::
use
(
capabilities
),
soci
::
use
(
subject
);
tm
creationDate
;
tm
lastUpdateDate
;
int
capabilities
;
string
subject
;
L_END_LOG_EXCEPTION
}
*
session
<<
"SELECT creation_date, last_update_date, capabilities, subject "
" FROM chat_room"
" WHERE peer_sip_address_id = ("
" SELECT id from sip_address WHERE value = :peerAddress"
" )"
,
soci
::
use
(
peerAddress
),
soci
::
into
(
creationDate
),
soci
::
into
(
lastUpdateDate
),
soci
::
use
(
capabilities
),
soci
::
use
(
subject
);
L_END_LOG_EXCEPTION
return
shared_ptr
<
ChatRoom
>
();
}
...
...
@@ -834,7 +704,94 @@ shared_ptr<ChatRoom> MainDb::findChatRoom (const string &peerAddress) const {
try
{
soci
::
rowset
<
soci
::
row
>
messages
=
(
inSession
->
prepare
<<
"SELECT * FROM history"
);
try
{
d
->
importLegacyMessages
(
messages
);
soci
::
transaction
tr
(
*
d
->
dbSession
.
getBackendSession
<
soci
::
session
>
());
for
(
const
auto
&
message
:
messages
)
{
const
int
direction
=
message
.
get
<
int
>
(
LEGACY_MESSAGE_COL_DIRECTION
);
if
(
direction
!=
0
&&
direction
!=
1
)
{
lWarning
()
<<
"Unable to import legacy message with invalid direction."
;
continue
;
}
const
int
state
=
message
.
get
<
int
>
(
LEGACY_MESSAGE_COL_STATE
,
static_cast
<
int
>
(
ChatMessage
::
State
::
Displayed
)
);
if
(
state
<
0
||
state
>
static_cast
<
int
>
(
ChatMessage
::
State
::
Displayed
))
{
lWarning
()
<<
"Unable to import legacy message with invalid state."
;
continue
;
}
const
tm
date
=
Utils
::
getLongAsTm
(
message
.
get
<
int
>
(
LEGACY_MESSAGE_COL_DATE
,
0
));
bool
isNull
;
const
string
url
=
getValueFromLegacyMessage
<
string
>
(
message
,
LEGACY_MESSAGE_COL_URL
,
isNull
);
const
int
contentId
=
message
.
get
<
int
>
(
LEGACY_MESSAGE_COL_CONTENT_ID
,
-
1
);
ContentType
contentType
(
message
.
get
<
string
>
(
LEGACY_MESSAGE_COL_CONTENT_TYPE
,
""
));
if
(
!
contentType
.
isValid
())
contentType
=
contentId
!=
-
1
?
ContentType
::
FileTransfer
:
(
isNull
?
ContentType
::
PlainText
:
ContentType
::
ExternalBody
);
if
(
contentType
==
ContentType
::
ExternalBody
)
{
lInfo
()
<<
"Import of external body content is skipped."
;
continue
;
}
const
string
text
=
getValueFromLegacyMessage
<
string
>
(
message
,
LEGACY_MESSAGE_COL_TEXT
,
isNull
);
Content
content
;
content
.
setContentType
(
contentType
);
if
(
contentType
==
ContentType
::
PlainText
)
{
if
(
isNull
)
{
lWarning
()
<<
"Unable to import legacy message with no text."
;
continue
;
}
content
.
setBody
(
text
);
}
else
{
if
(
contentType
!=
ContentType
::
FileTransfer
)
{
lWarning
()
<<
"Unable to import unsupported legacy content."
;
continue
;
}
const
string
appData
=
getValueFromLegacyMessage
<
string
>
(
message
,
LEGACY_MESSAGE_COL_APP_DATA
,
isNull
);
if
(
isNull
)
{
lWarning
()
<<
"Unable to import legacy file message without app data."
;
continue
;
}
content
.
setAppData
(
"legacy"
,
appData
);
}
struct
MessageEventReferences
references
;
references
.
eventId
=
d
->
insertEvent
(
EventLog
::
Type
::
ChatMessage
,
date
);
references
.
localSipAddressId
=
d
->
insertSipAddress
(
message
.
get
<
string
>
(
LEGACY_MESSAGE_COL_LOCAL_ADDRESS
));
references
.
remoteSipAddressId
=
d
->
insertSipAddress
(
message
.
get
<
string
>
(
LEGACY_MESSAGE_COL_REMOTE_ADDRESS
));
references
.
chatRoomId
=
d
->
insertChatRoom
(
references
.
remoteSipAddressId
,
static_cast
<
int
>
(
ChatRoom
::
Capabilities
::
Basic
),
date
);
d
->
insertChatRoomParticipant
(
references
.
chatRoomId
,
references
.
remoteSipAddressId
,
false
);
long
messageEventId
=
d
->
insertMessageEvent
(
references
,
static_cast
<
ChatMessage
::
State
>
(
state
),
static_cast
<
ChatMessage
::
Direction
>
(
direction
),
message
.
get
<
string
>
(
LEGACY_MESSAGE_COL_IMDN_MESSAGE_ID
,
""
),
!!
message
.
get
<
int
>
(
LEGACY_MESSAGE_COL_IS_SECURED
,
0
),
{
move
(
content
)
}
);
if
(
state
!=
static_cast
<
int
>
(
ChatMessage
::
State
::
Displayed
))
d
->
insertMessageParticipant
(
messageEventId
,
references
.
remoteSipAddressId
,
static_cast
<
ChatMessage
::
State
>
(
state
)
);
}
tr
.
commit
();
}
catch
(
const
exception
&
e
)
{
lInfo
()
<<
"Failed to import legacy messages from: `"
<<
uri
<<
"`. ("
<<
e
.
what
()
<<
")"
;
return
false
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment