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
fde89d36
Commit
fde89d36
authored
Oct 23, 2017
by
Ronan
Browse files
feat(MainDb): supports MySql types and rowid from sqlite
parent
a9418e19
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
132 additions
and
102 deletions
+132
-102
src/db/abstract/abstract-db.cpp
src/db/abstract/abstract-db.cpp
+24
-7
src/db/abstract/abstract-db.h
src/db/abstract/abstract-db.h
+3
-2
src/db/main-db-p.h
src/db/main-db-p.h
+21
-21
src/db/main-db.cpp
src/db/main-db.cpp
+80
-68
src/event-log/event-log-p.h
src/event-log/event-log-p.h
+1
-1
tester/db/linphone.db
tester/db/linphone.db
+0
-0
tester/main-db-tester.cpp
tester/main-db-tester.cpp
+3
-3
No files found.
src/db/abstract/abstract-db.cpp
View file @
fde89d36
...
...
@@ -77,21 +77,38 @@ void AbstractDb::init () {
// -----------------------------------------------------------------------------
string
AbstractDb
::
primaryKey
AutoIncrement
Str
(
const
string
&
type
)
const
{
string
AbstractDb
::
primaryKeyStr
(
const
string
&
type
)
const
{
L_D
();
switch
(
d
->
backend
)
{
case
Mysql
:
return
type
+
"
UNSIGNED
PRIMARY KEY AUTO_INCREMENT"
;
return
type
+
" PRIMARY KEY AUTO_INCREMENT"
;
case
Sqlite3
:
return
" INTEGER PRIMARY KEY AUTOINCREMENT"
;
// See: ROWIDs and the INTEGER PRIMARY KEY
// https://www.sqlite.org/lang_createtable.html
return
" INTEGER PRIMARY KEY ASC"
;
}
L_ASSERT
(
false
);
return
""
;
}
long
AbstractDb
::
getLastInsertId
()
const
{
long
result
=
0
;
string
AbstractDb
::
primaryKeyRefStr
(
const
string
&
type
)
const
{
L_D
();
switch
(
d
->
backend
)
{
case
Mysql
:
return
" "
+
type
;
case
Sqlite3
:
return
" INTEGER"
;
}
L_ASSERT
(
false
);
return
""
;
}
long
long
AbstractDb
::
getLastInsertId
()
const
{
long
long
id
=
0
;
#ifdef SOCI_ENABLED
L_D
();
...
...
@@ -110,10 +127,10 @@ long AbstractDb::getLastInsertId () const {
}
soci
::
session
*
session
=
d
->
dbSession
.
getBackendSession
<
soci
::
session
>
();
*
session
<<
sql
,
soci
::
into
(
result
);
*
session
<<
sql
,
soci
::
into
(
id
);
#endif // ifdef SOCI_ENABLED
return
result
;
return
id
;
}
LINPHONE_END_NAMESPACE
src/db/abstract/abstract-db.h
View file @
fde89d36
...
...
@@ -51,9 +51,10 @@ protected:
virtual
void
init
();
std
::
string
primaryKeyAutoIncrementStr
(
const
std
::
string
&
type
=
"INT"
)
const
;
std
::
string
primaryKeyStr
(
const
std
::
string
&
type
=
"INT"
)
const
;
std
::
string
primaryKeyRefStr
(
const
std
::
string
&
type
=
"INT"
)
const
;
long
getLastInsertId
()
const
;
long
long
getLastInsertId
()
const
;
private:
L_DECLARE_PRIVATE
(
AbstractDb
);
...
...
src/db/main-db-p.h
View file @
fde89d36
...
...
@@ -39,74 +39,74 @@ private:
// Low level API.
// ---------------------------------------------------------------------------
long
insertSipAddress
(
const
std
::
string
&
sipAddress
);
void
insertContent
(
long
messageEventId
,
const
Content
&
content
);
long
insertContentType
(
const
std
::
string
&
contentType
);
long
insertChatRoom
(
long
sipAddressId
,
int
capabilities
,
const
tm
&
date
);
void
insertChatRoomParticipant
(
long
chatRoomId
,
long
sipAddressId
,
bool
isAdmin
);
void
insertChatMessageParticipant
(
long
messageEventId
,
long
sipAddressId
,
int
state
);
long
long
insertSipAddress
(
const
std
::
string
&
sipAddress
);
void
insertContent
(
long
long
messageEventId
,
const
Content
&
content
);
long
long
insertContentType
(
const
std
::
string
&
contentType
);
long
long
insertChatRoom
(
long
long
sipAddressId
,
int
capabilities
,
const
tm
&
date
);
void
insertChatRoomParticipant
(
long
long
chatRoomId
,
long
long
sipAddressId
,
bool
isAdmin
);
void
insertChatMessageParticipant
(
long
long
messageEventId
,
long
long
sipAddressId
,
int
state
);
// ---------------------------------------------------------------------------
// Events API.
// ---------------------------------------------------------------------------
std
::
shared_ptr
<
EventLog
>
selectGenericConferenceEvent
(
long
eventId
,
long
long
eventId
,
EventLog
::
Type
type
,
time_t
date
,
const
std
::
string
&
peerAddress
)
const
;
std
::
shared_ptr
<
EventLog
>
selectConferenceEvent
(
long
eventId
,
long
long
eventId
,
EventLog
::
Type
type
,
time_t
date
,
const
std
::
string
&
peerAddress
)
const
;
std
::
shared_ptr
<
EventLog
>
selectConferenceCallEvent
(
long
eventId
,
long
long
eventId
,
EventLog
::
Type
type
,
time_t
date
,
const
std
::
string
&
peerAddress
)
const
;
std
::
shared_ptr
<
EventLog
>
selectConferenceChatMessageEvent
(
long
eventId
,
long
long
eventId
,
EventLog
::
Type
type
,
time_t
date
,
const
std
::
string
&
peerAddress
)
const
;
std
::
shared_ptr
<
EventLog
>
selectConferenceParticipantEvent
(
long
eventId
,
long
long
eventId
,
EventLog
::
Type
type
,
time_t
date
,
const
std
::
string
&
peerAddress
)
const
;
std
::
shared_ptr
<
EventLog
>
selectConferenceParticipantDeviceEvent
(
long
eventId
,
long
long
eventId
,
EventLog
::
Type
type
,
time_t
date
,
const
std
::
string
&
peerAddress
)
const
;
std
::
shared_ptr
<
EventLog
>
selectConferenceSubjectEvent
(
long
eventId
,
long
long
eventId
,
EventLog
::
Type
type
,
time_t
date
,
const
std
::
string
&
peerAddress
)
const
;
long
insertEvent
(
const
EventLog
&
eventLog
);
long
insertConferenceEvent
(
const
EventLog
&
eventLog
,
long
*
chatRoomId
=
nullptr
);
long
insertConferenceCallEvent
(
const
EventLog
&
eventLog
);
long
insertConferenceChatMessageEvent
(
const
EventLog
&
eventLog
);
long
insertConferenceNotifiedEvent
(
const
EventLog
&
eventLog
);
long
insertConferenceParticipantEvent
(
const
EventLog
&
eventLog
);
long
insertConferenceParticipantDeviceEvent
(
const
EventLog
&
eventLog
);
long
insertConferenceSubjectEvent
(
const
EventLog
&
eventLog
);
long
long
insertEvent
(
const
EventLog
&
eventLog
);
long
long
insertConferenceEvent
(
const
EventLog
&
eventLog
,
long
long
*
chatRoomId
=
nullptr
);
long
long
insertConferenceCallEvent
(
const
EventLog
&
eventLog
);
long
long
insertConferenceChatMessageEvent
(
const
EventLog
&
eventLog
);
long
long
insertConferenceNotifiedEvent
(
const
EventLog
&
eventLog
);
long
long
insertConferenceParticipantEvent
(
const
EventLog
&
eventLog
);
long
long
insertConferenceParticipantDeviceEvent
(
const
EventLog
&
eventLog
);
long
long
insertConferenceSubjectEvent
(
const
EventLog
&
eventLog
);
L_DECLARE_PUBLIC
(
MainDb
);
};
...
...
src/db/main-db.cpp
View file @
fde89d36
...
...
@@ -115,11 +115,11 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
// -----------------------------------------------------------------------------
long
MainDbPrivate
::
insertSipAddress
(
const
string
&
sipAddress
)
{
long
long
MainDbPrivate
::
insertSipAddress
(
const
string
&
sipAddress
)
{
L_Q
();
soci
::
session
*
session
=
dbSession
.
getBackendSession
<
soci
::
session
>
();
long
id
;
long
long
id
;
*
session
<<
"SELECT id FROM sip_address WHERE value = :sipAddress"
,
soci
::
use
(
sipAddress
),
soci
::
into
(
id
);
if
(
session
->
got_data
())
return
id
;
...
...
@@ -128,28 +128,28 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
return
q
->
getLastInsertId
();
}
void
MainDbPrivate
::
insertContent
(
long
eventId
,
const
Content
&
content
)
{
void
MainDbPrivate
::
insertContent
(
long
long
eventId
,
const
Content
&
content
)
{
L_Q
();
soci
::
session
*
session
=
dbSession
.
getBackendSession
<
soci
::
session
>
();
long
contentTypeId
=
insertContentType
(
content
.
getContentType
().
asString
());
long
long
contentTypeId
=
insertContentType
(
content
.
getContentType
().
asString
());
*
session
<<
"INSERT INTO chat_message_content (event_id, content_type_id, body) VALUES"
" (:eventId, :contentTypeId, :body)"
,
soci
::
use
(
eventId
),
soci
::
use
(
contentTypeId
),
soci
::
use
(
content
.
getBodyAsString
());
long
messageContentId
=
q
->
getLastInsertId
();
long
long
messageContentId
=
q
->
getLastInsertId
();
for
(
const
auto
&
appData
:
content
.
getAppDataMap
())
*
session
<<
"INSERT INTO chat_message_content_app_data (chat_message_content_id, key, data) VALUES"
" (:messageContentId, :key, :data)"
,
soci
::
use
(
messageContentId
),
soci
::
use
(
appData
.
first
),
soci
::
use
(
appData
.
second
);
}
long
MainDbPrivate
::
insertContentType
(
const
string
&
contentType
)
{
long
long
MainDbPrivate
::
insertContentType
(
const
string
&
contentType
)
{
L_Q
();
soci
::
session
*
session
=
dbSession
.
getBackendSession
<
soci
::
session
>
();
long
id
;
long
long
id
;
*
session
<<
"SELECT id FROM content_type WHERE value = :contentType"
,
soci
::
use
(
contentType
),
soci
::
into
(
id
);
if
(
session
->
got_data
())
return
id
;
...
...
@@ -158,10 +158,10 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
return
q
->
getLastInsertId
();
}
long
MainDbPrivate
::
insertChatRoom
(
long
sipAddressId
,
int
capabilities
,
const
tm
&
date
)
{
long
long
MainDbPrivate
::
insertChatRoom
(
long
long
sipAddressId
,
int
capabilities
,
const
tm
&
date
)
{
soci
::
session
*
session
=
dbSession
.
getBackendSession
<
soci
::
session
>
();
long
id
;
long
long
id
;
*
session
<<
"SELECT peer_sip_address_id FROM chat_room WHERE peer_sip_address_id = :sipAddressId"
,
soci
::
use
(
sipAddressId
),
soci
::
into
(
id
);
if
(
!
session
->
got_data
())
...
...
@@ -175,7 +175,7 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
return
sipAddressId
;
}
void
MainDbPrivate
::
insertChatRoomParticipant
(
long
chatRoomId
,
long
sipAddressId
,
bool
isAdmin
)
{
void
MainDbPrivate
::
insertChatRoomParticipant
(
long
long
chatRoomId
,
long
long
sipAddressId
,
bool
isAdmin
)
{
soci
::
session
*
session
=
dbSession
.
getBackendSession
<
soci
::
session
>
();
soci
::
statement
statement
=
(
session
->
prepare
<<
"UPDATE chat_room_participant SET is_admin = :isAdmin"
...
...
@@ -189,7 +189,7 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
soci
::
use
(
chatRoomId
),
soci
::
use
(
sipAddressId
),
soci
::
use
(
static_cast
<
int
>
(
isAdmin
));
}
void
MainDbPrivate
::
insertChatMessageParticipant
(
long
eventId
,
long
sipAddressId
,
int
state
)
{
void
MainDbPrivate
::
insertChatMessageParticipant
(
long
long
eventId
,
long
long
sipAddressId
,
int
state
)
{
soci
::
session
*
session
=
dbSession
.
getBackendSession
<
soci
::
session
>
();
soci
::
statement
statement
=
(
session
->
prepare
<<
"UPDATE chat_message_participant SET state = :state"
...
...
@@ -206,7 +206,7 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
// -----------------------------------------------------------------------------
shared_ptr
<
EventLog
>
MainDbPrivate
::
selectGenericConferenceEvent
(
long
eventId
,
long
long
eventId
,
EventLog
::
Type
type
,
time_t
date
,
const
string
&
peerAddress
...
...
@@ -244,7 +244,7 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
}
shared_ptr
<
EventLog
>
MainDbPrivate
::
selectConferenceEvent
(
long
eventId
,
long
long
eventId
,
EventLog
::
Type
type
,
time_t
date
,
const
string
&
peerAddress
...
...
@@ -261,7 +261,7 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
}
shared_ptr
<
EventLog
>
MainDbPrivate
::
selectConferenceCallEvent
(
long
eventId
,
long
long
eventId
,
EventLog
::
Type
type
,
time_t
date
,
const
string
&
peerAddress
...
...
@@ -271,7 +271,7 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
}
shared_ptr
<
EventLog
>
MainDbPrivate
::
selectConferenceChatMessageEvent
(
long
eventId
,
long
long
eventId
,
EventLog
::
Type
type
,
time_t
date
,
const
string
&
peerAddress
...
...
@@ -281,7 +281,7 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
}
shared_ptr
<
EventLog
>
MainDbPrivate
::
selectConferenceParticipantEvent
(
long
eventId
,
long
long
eventId
,
EventLog
::
Type
type
,
time_t
date
,
const
string
&
peerAddress
...
...
@@ -308,7 +308,7 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
}
shared_ptr
<
EventLog
>
MainDbPrivate
::
selectConferenceParticipantDeviceEvent
(
long
eventId
,
long
long
eventId
,
EventLog
::
Type
type
,
time_t
date
,
const
string
&
peerAddress
...
...
@@ -340,7 +340,7 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
}
shared_ptr
<
EventLog
>
MainDbPrivate
::
selectConferenceSubjectEvent
(
long
eventId
,
long
long
eventId
,
EventLog
::
Type
type
,
time_t
date
,
const
string
&
peerAddress
...
...
@@ -366,7 +366,7 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
// -----------------------------------------------------------------------------
long
MainDbPrivate
::
insertEvent
(
const
EventLog
&
eventLog
)
{
long
long
MainDbPrivate
::
insertEvent
(
const
EventLog
&
eventLog
)
{
L_Q
();
soci
::
session
*
session
=
dbSession
.
getBackendSession
<
soci
::
session
>
();
...
...
@@ -375,9 +375,9 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
return
q
->
getLastInsertId
();
}
long
MainDbPrivate
::
insertConferenceEvent
(
const
EventLog
&
eventLog
,
long
*
chatRoomId
)
{
long
eventId
=
insertEvent
(
eventLog
);
long
curChatRoomId
=
insertSipAddress
(
long
long
MainDbPrivate
::
insertConferenceEvent
(
const
EventLog
&
eventLog
,
long
long
*
chatRoomId
)
{
long
long
eventId
=
insertEvent
(
eventLog
);
long
long
curChatRoomId
=
insertSipAddress
(
static_cast
<
const
ConferenceEvent
&>
(
eventLog
).
getConferenceAddress
().
asString
()
);
...
...
@@ -391,12 +391,12 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
return
eventId
;
}
long
MainDbPrivate
::
insertConferenceCallEvent
(
const
EventLog
&
eventLog
)
{
long
long
MainDbPrivate
::
insertConferenceCallEvent
(
const
EventLog
&
eventLog
)
{
// TODO.
return
0
;
}
long
MainDbPrivate
::
insertConferenceChatMessageEvent
(
const
EventLog
&
eventLog
)
{
long
long
MainDbPrivate
::
insertConferenceChatMessageEvent
(
const
EventLog
&
eventLog
)
{
shared_ptr
<
ChatMessage
>
chatMessage
=
static_cast
<
const
ConferenceChatMessageEvent
&>
(
eventLog
).
getChatMessage
();
shared_ptr
<
ChatRoom
>
chatRoom
=
chatMessage
->
getChatRoom
();
if
(
!
chatRoom
)
{
...
...
@@ -406,10 +406,10 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
tm
eventTime
=
Utils
::
getLongAsTm
(
static_cast
<
long
>
(
eventLog
.
getTime
()));
long
localSipAddressId
=
insertSipAddress
(
chatMessage
->
getLocalAddress
().
asString
());
long
remoteSipAddressId
=
insertSipAddress
(
chatMessage
->
getRemoteAddress
().
asString
());
long
long
localSipAddressId
=
insertSipAddress
(
chatMessage
->
getLocalAddress
().
asString
());
long
long
remoteSipAddressId
=
insertSipAddress
(
chatMessage
->
getRemoteAddress
().
asString
());
insertChatRoom
(
remoteSipAddressId
,
chatRoom
->
getCapabilities
(),
eventTime
);
long
eventId
=
insertConferenceEvent
(
eventLog
);
long
long
eventId
=
insertConferenceEvent
(
eventLog
);
soci
::
session
*
session
=
dbSession
.
getBackendSession
<
soci
::
session
>
();
...
...
@@ -429,9 +429,9 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
return
eventId
;
}
long
MainDbPrivate
::
insertConferenceNotifiedEvent
(
const
EventLog
&
eventLog
)
{
long
chatRoomId
;
long
eventId
=
insertConferenceEvent
(
eventLog
,
&
chatRoomId
);
long
long
MainDbPrivate
::
insertConferenceNotifiedEvent
(
const
EventLog
&
eventLog
)
{
long
long
chatRoomId
;
long
long
eventId
=
insertConferenceEvent
(
eventLog
,
&
chatRoomId
);
unsigned
int
lastNotifyId
=
static_cast
<
const
ConferenceNotifiedEvent
&>
(
eventLog
).
getNotifyId
();
soci
::
session
*
session
=
dbSession
.
getBackendSession
<
soci
::
session
>
();
...
...
@@ -443,9 +443,9 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
return
eventId
;
}
long
MainDbPrivate
::
insertConferenceParticipantEvent
(
const
EventLog
&
eventLog
)
{
long
eventId
=
insertConferenceNotifiedEvent
(
eventLog
);
long
participantAddressId
=
insertSipAddress
(
long
long
MainDbPrivate
::
insertConferenceParticipantEvent
(
const
EventLog
&
eventLog
)
{
long
long
eventId
=
insertConferenceNotifiedEvent
(
eventLog
);
long
long
participantAddressId
=
insertSipAddress
(
static_cast
<
const
ConferenceParticipantEvent
&>
(
eventLog
).
getParticipantAddress
().
asString
()
);
...
...
@@ -456,9 +456,9 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
return
eventId
;
}
long
MainDbPrivate
::
insertConferenceParticipantDeviceEvent
(
const
EventLog
&
eventLog
)
{
long
eventId
=
insertConferenceParticipantEvent
(
eventLog
);
long
gruuAddressId
=
insertSipAddress
(
long
long
MainDbPrivate
::
insertConferenceParticipantDeviceEvent
(
const
EventLog
&
eventLog
)
{
long
long
eventId
=
insertConferenceParticipantEvent
(
eventLog
);
long
long
gruuAddressId
=
insertSipAddress
(
static_cast
<
const
ConferenceParticipantDeviceEvent
&>
(
eventLog
).
getGruuAddress
().
asString
()
);
...
...
@@ -469,8 +469,8 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
return
eventId
;
}
long
MainDbPrivate
::
insertConferenceSubjectEvent
(
const
EventLog
&
eventLog
)
{
long
eventId
=
insertConferenceNotifiedEvent
(
eventLog
);
long
long
MainDbPrivate
::
insertConferenceSubjectEvent
(
const
EventLog
&
eventLog
)
{
long
long
eventId
=
insertConferenceNotifiedEvent
(
eventLog
);
soci
::
session
*
session
=
dbSession
.
getBackendSession
<
soci
::
session
>
();
*
session
<<
"INSERT INTO conference_subject_event (event_id, subject)"
...
...
@@ -489,19 +489,19 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
*
session
<<
"CREATE TABLE IF NOT EXISTS sip_address ("
" id"
+
primaryKey
AutoIncrementStr
(
)
+
","
" id"
+
primaryKey
Str
(
"UNSIGNED BIGINT"
)
+
","
" value VARCHAR(255) UNIQUE NOT NULL"
")"
;
*
session
<<
"CREATE TABLE IF NOT EXISTS content_type ("
" id"
+
primaryKey
AutoIncrementStr
(
)
+
","
" id"
+
primaryKey
Str
(
"UNSIGNED SMALLINT"
)
+
","
" value VARCHAR(255) UNIQUE NOT NULL"
")"
;
*
session
<<
"CREATE TABLE IF NOT EXISTS event ("
" id"
+
primaryKey
AutoIncrementStr
(
)
+
","
" id"
+
primaryKey
Str
(
"UNSIGNED BIGINT"
)
+
","
" type TINYINT UNSIGNED NOT NULL,"
" date DATE NOT NULL"
")"
;
...
...
@@ -509,7 +509,7 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
*
session
<<
"CREATE TABLE IF NOT EXISTS chat_room ("
// Server (for conference) or user sip address.
" peer_sip_address_id
INT UNSIGNED PRIMARY KEY
,"
" peer_sip_address_id
"
+
primaryKeyStr
(
"UNSIGNED BIGINT"
)
+
"
,"
// Dialog creation date.
" creation_date DATE NOT NULL,"
...
...
@@ -532,8 +532,9 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
*
session
<<
"CREATE TABLE IF NOT EXISTS chat_room_participant ("
" chat_room_id INT UNSIGNED NOT NULL,"
" sip_address_id INT UNSIGNED NOT NULL,"
" chat_room_id"
+
primaryKeyRefStr
(
"UNSIGNED BIGINT"
)
+
","
" sip_address_id"
+
primaryKeyRefStr
(
"UNSIGNED BIGINT"
)
+
","
" is_admin BOOLEAN NOT NULL,"
" PRIMARY KEY (chat_room_id, sip_address_id),"
...
...
@@ -547,8 +548,9 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
*
session
<<
"CREATE TABLE IF NOT EXISTS conference_event ("
" event_id INT UNSIGNED PRIMARY KEY,"
" chat_room_id INT UNSIGNED NOT NULL,"
" event_id"
+
primaryKeyStr
(
"UNSIGNED BIGINT"
)
+
","
" chat_room_id"
+
primaryKeyRefStr
(
"UNSIGNED BIGINT"
)
+
","
" FOREIGN KEY (event_id)"
" REFERENCES event(id)"
...
...
@@ -560,7 +562,8 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
*
session
<<
"CREATE TABLE IF NOT EXISTS conference_notified_event ("
" event_id INT UNSIGNED PRIMARY KEY,"
" event_id"
+
primaryKeyStr
(
"UNSIGNED BIGINT"
)
+
","
" notify_id INT UNSIGNED NOT NULL,"
" FOREIGN KEY (event_id)"
...
...
@@ -570,8 +573,9 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
*
session
<<
"CREATE TABLE IF NOT EXISTS conference_participant_event ("
" event_id INT UNSIGNED PRIMARY KEY,"
" participant_address_id INT UNSIGNED NOT NULL,"
" event_id"
+
primaryKeyStr
(
"UNSIGNED BIGINT"
)
+
","
" participant_address_id"
+
primaryKeyRefStr
(
"UNSIGNED BIGINT"
)
+
","
" FOREIGN KEY (event_id)"
" REFERENCES conference_notified_event(event_id)"
...
...
@@ -583,8 +587,9 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
*
session
<<
"CREATE TABLE IF NOT EXISTS conference_participant_device_event ("
" event_id INT UNSIGNED PRIMARY KEY,"
" gruu_address_id INT UNSIGNED NOT NULL,"
" event_id"
+
primaryKeyStr
(
"UNSIGNED BIGINT"
)
+
","
" gruu_address_id"
+
primaryKeyRefStr
(
"UNSIGNED BIGINT"
)
+
","
" FOREIGN KEY (event_id)"
" REFERENCES conference_participant_event(event_id)"
...
...
@@ -596,7 +601,8 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
*
session
<<
"CREATE TABLE IF NOT EXISTS conference_subject_event ("
" event_id INT UNSIGNED PRIMARY KEY,"
" event_id"
+
primaryKeyStr
(
"BIGINT"
)
+
","
" subject VARCHAR(255),"
" FOREIGN KEY (event_id)"
...
...
@@ -606,9 +612,10 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
*
session
<<
"CREATE TABLE IF NOT EXISTS conference_chat_message_event ("
" event_id INT UNSIGNED PRIMARY KEY,"
" local_sip_address_id INT UNSIGNED NOT NULL,"
" remote_sip_address_id INT UNSIGNED NOT NULL,"
" event_id"
+
primaryKeyStr
(
"UNSIGNED BIGINT"
)
+
","
" local_sip_address_id"
+
primaryKeyRefStr
(
"UNSIGNED BIGINT"
)
+
","
" remote_sip_address_id"
+
primaryKeyRefStr
(
"UNSIGNED BIGINT"
)
+
","
// See: https://tools.ietf.org/html/rfc5438#section-6.3
" imdn_message_id VARCHAR(255) NOT NULL,"
...
...
@@ -630,8 +637,8 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
*
session
<<
"CREATE TABLE IF NOT EXISTS chat_message_participant ("
" event_id
INT UNSIGNED NOT NULL
,"
" sip_address_id
INT UNSIGNED NOT NULL
,"
" event_id
"
+
primaryKeyRefStr
(
"UNSIGNED BIGINT"
)
+
"
,"
" sip_address_id
"
+
primaryKeyRefStr
(
"UNSIGNED BIGINT"
)
+
"
,"
" state TINYINT UNSIGNED NOT NULL,"
" PRIMARY KEY (event_id, sip_address_id),"
...
...
@@ -645,9 +652,10 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
*
session
<<
"CREATE TABLE IF NOT EXISTS chat_message_content ("
" id"
+
primaryKeyAutoIncrementStr
()
+
","
" event_id INT UNSIGNED NOT NULL,"
" content_type_id INT UNSIGNED NOT NULL,"
" id"
+
primaryKeyStr
(
"UNSIGNED BIGINT"
)
+
","
" event_id "
+
primaryKeyRefStr
(
"UNSIGNED BIGINT"
)
+
","
" content_type_id"
+
primaryKeyRefStr
(
"UNSIGNED SMALLINT"
)
+
","
" body TEXT NOT NULL,"
" FOREIGN KEY (event_id)"
...
...
@@ -660,7 +668,8 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
*
session
<<
"CREATE TABLE IF NOT EXISTS chat_message_content_app_data ("
" chat_message_content_id INT UNSIGNED NOT NULL,"
" chat_message_content_id"
+
primaryKeyRefStr
(
"UNSIGNED BIGINT"
)
+
","
" key VARCHAR(255),"
" data BLOB,"
...
...
@@ -672,7 +681,8 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
*
session
<<
"CREATE TABLE IF NOT EXISTS conference_message_crypto_data ("
" event_id INT UNSIGNED NOT NULL,"
" event_id"
+
primaryKeyRefStr
(
"UNSIGNED BIGINT"
)
+
","
" key VARCHAR(255),"
" data BLOB,"
...
...
@@ -772,7 +782,7 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
return
false
;
}
long
&
storageId
=
const_cast
<
EventLog
&>
(
eventLog
).
getPrivate
()
->
storageId
;
long
long
&
storageId
=
const_cast
<
EventLog
&>
(
eventLog
).
getPrivate
()
->
storageId
;
if
(
storageId
<
0
)
return
false
;
...
...
@@ -956,7 +966,9 @@ MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {}
for
(
const
auto
&
row
:
rows
)
{
tm
date
=
row
.
get
<
tm
>
(
2
);
events
.
push_back
(
d
->
selectGenericConferenceEvent
(
row
.
get
<
long
>
(
0
),
// See: http://soci.sourceforge.net/doc/master/backends/
// `row id` is not supported by soci on Sqlite3. It's necessary to cast id to int...
getBackend
()
==
Sqlite3
?
static_cast
<
long
long
>
(
row
.
get
<
int
>
(
0
))
:
row
.
get
<
long
long
>
(
0
),
static_cast
<
EventLog
::
Type
>
(
row
.
get
<
int
>
(
1
)),
mktime
(
&
date
),
peerAddress
...
...
@@ -1144,10 +1156,10 @@ shared_ptr<ChatRoom> MainDb::findChatRoom (const string &peerAddress) const {
*
session
<<
"INSERT INTO event (type, date) VALUES (:type, :date)"
,
soci
::
use
(
static_cast
<
int
>
(
EventLog
::
Type
::
ConferenceChatMessage
)),
soci
::
use
(
date
);
long
eventId
=
getLastInsertId
();
long
localSipAddressId
=
d
->
insertSipAddress
(
message
.
get
<
string
>
(
LEGACY_MESSAGE_COL_LOCAL_ADDRESS
));
long
remoteSipAddressId
=
d
->
insertSipAddress
(
message
.
get
<
string
>
(
LEGACY_MESSAGE_COL_REMOTE_ADDRESS
));
long
chatRoomId
=
d
->
insertChatRoom
(
remoteSipAddressId
,
static_cast
<
int
>
(
ChatRoom
::
Capabilities
::
Basic
),
date
);
long
long
eventId
=
getLastInsertId
();
long
long
localSipAddressId
=
d
->
insertSipAddress
(
message
.
get
<
string
>
(
LEGACY_MESSAGE_COL_LOCAL_ADDRESS
));
long
long
remoteSipAddressId
=
d
->
insertSipAddress
(
message
.
get
<
string
>
(
LEGACY_MESSAGE_COL_REMOTE_ADDRESS
));
long
long
chatRoomId
=
d
->
insertChatRoom
(
remoteSipAddressId
,
static_cast
<
int
>
(
ChatRoom
::
Capabilities
::
Basic
),
date
);
*
session
<<
"INSERT INTO conference_event (event_id, chat_room_id)"
" VALUES (:eventId, :chatRoomId)"
,
soci
::
use
(
eventId
),
soci
::
use
(
chatRoomId
);
...
...
src/event-log/event-log-p.h
View file @
fde89d36
...
...
@@ -30,7 +30,7 @@ LINPHONE_BEGIN_NAMESPACE
class
EventLogPrivate
:
public
BaseObjectPrivate
{
public:
long
storageId
=
-
1
;
long
long
storageId
=
-
1
;
private:
EventLog
::
Type
type
=
EventLog
::
Type
::
None
;
...
...
tester/db/linphone.db
View file @
fde89d36
No preview for this file type
tester/main-db-tester.cpp
View file @
fde89d36
...
...
@@ -54,21 +54,21 @@ static void get_messages_count () {
MainDb
mainDb
;
BC_ASSERT_TRUE
(
mainDb
.
connect
(
MainDb
::
Sqlite3
,
getDatabasePath
()));
BC_ASSERT_EQUAL
(
mainDb
.
getMessagesCount
(),
4976
,
int
,
"%d"
);
BC_ASSERT_EQUAL
(
mainDb
.
getMessagesCount
(
"sip:test-
7
@sip.linphone.org"
),
3
,
int
,
"%d"
);
BC_ASSERT_EQUAL
(
mainDb
.
getMessagesCount
(
"sip:test-
39
@sip.linphone.org"
),
3
,
int
,
"%d"
);
}
static
void
get_unread_messages_count
()
{
MainDb
mainDb
;
BC_ASSERT_TRUE
(
mainDb
.
connect
(
MainDb
::
Sqlite3
,
getDatabasePath
()));
BC_ASSERT_EQUAL
(
mainDb
.
getUnreadMessagesCount
(),
2
,
int
,
"%d"
);
BC_ASSERT_EQUAL
(
mainDb
.
getUnreadMessagesCount
(
"sip:test-
7
@sip.linphone.org"
),
0
,
int
,
"%d"
);
BC_ASSERT_EQUAL
(
mainDb
.
getUnreadMessagesCount
(
"sip:test-
39
@sip.linphone.org"
),
0
,
int