On Fri, Jun 19, 2015 at 10:33 AM, Pali Rohár <pali.ro...@gmail.com> wrote:

> On Friday 19 June 2015 09:59:17 Joshua Joseph wrote:
> > On Thu, Jun 18, 2015 at 10:07 PM, Pali Rohár <pali.ro...@gmail.com>
> wrote:
> >
> > >
> > > > I get it now.
> > > >
> > > > We will have to store the contactId() also. I will need to get good
> > > > column names
> > > > to avoid confusion with the foreign key columns.
> > > >
> > >
> > > See my yesterday email where I proposed to store pluginId() as
> protocol,
> > > accounId() as account, contactId() as contact and from/to values to be
> > > protocol dependent.
> > >
> > > And another question: Do we need to separate table for group chat
> > > messages? Cannot we use some chat session identifier for each message?
> > >
> > >
> > That would also work. See my schema below for a one table based approach.
> >
> >
> > > If for each message we store these data:
> > >
> > > protocol independent:
> > >
> > > * protocol - Kopete::Protocol::pluginId() - not null
> > > * account - Kopete::Protocol::accoundId() - not null
> > > * direction - Kopete::Message::direction() - not null
> > > * contact - Kopete::Protocol::contactId()
> > >
> > > protocol dependent (all strings):
> > >
> > > * session - session identifier
> > > * session_name - human readable name of session
> > > * from - from contact identifier
> > > * from_name - human readable from contact name
> > > * to - to contact identifier
> > > * to_name - human readable to contact name
> > >
> >
> > See this schema. I think it will capture all of the above.
> > For protocol, account and contact fields, I have used Text columns.
> > I am also adding a message_type column, so that we can keep track of
> special
> > messages such as room events (user join, quit etc).  Do you think that
> that
> > will be
> > necessary?
> >
>
> I think this is handled by Kopete::Message::MessageDirection::Internal:
>
> http://api.kde.org/4.x-api/kdenetwork-apidocs/kopete/libkopete/html/classKopete_1_1Message.html
>
> Maybe it make sense to add GUI option to enable/disable logging of
> internal messages. For somebody it could be useless and just take space
> on disk. For somebody else it could be useful to see when contact sent
> some file or left/joined group chat...
>
> (and when you are sending schema or part of source code via email,
> please do not wrap schema lines as it is hard to read)
>
> > --messages table
> > CREATE TABLE "messages" (
> >    "message_id" Integer Primary Key Autoincrement Not Null --Unique
> message
> > identifier
> >    "timestamp" Text --When the message was handled
> >    "message" Text --HTML containing the message contents
> >    "protocol" Text Not Null --Protocol used
> (Kopete::Protocol::pluginId())
> >    "account" Text Not Null --Account used (Kopete::Account::accountId())
> >    "direction" Integer Not Null --(Inbound = 0, Outbound=1, Internal=2)
> > (Kopete::Message::MessageDirection)
> >    "importance" Integer -- (Low, Normal, Highlight) (Kopete::Message)
> > (Kopete::Message::MessageImportance)
> >    "contact" Text -- The local contact used in this message (if
> > applicable). (Kopete::Contact::ContactId()). If present, we know we are
> in
> > single user mode.
> >    "subject" Text --If applicable, this will store the subject of the
> > message
> >    "session" Text -- Internal session identifier. If this is provided,
> then
> > we know we are in multi user mode.
> >    "session_name" Text -- If in multi user mode, a human readable name
> for
> > the session.
> >    "from" Text --Internal identifier for the message sender
> >    "from_name" Text --Human readable name of the message sender
> >    "to" Text --Internal identifier for the message recipient
> >    "to_name" Text --Human readable name of the message recipient.
> >    "message_type" --The type of message. (TypeNormal, TypeAction,
> > TypeFileTransferRequest, TypeVoiceClipRequest)
> > (Kopete::Message::MessageType)
> > )
>
> Why message_ prefix (for message_type and message_id) if other columns
> which you are propose do not have message_ prefix?
>
> And there is missing Kopete::Message::MessageState property.
>

See the schema below, I have updated it.

>
> Timestamp should be integer as SQLite does not have dedicated DATE type
> and I do not thing that it can use indexes on string date formats for
> fast search (e.g all messages which were sent in specific day).
>

Yes. For other db systems that will be quite doable and fast.


>
> Anyway, I think that current solution could work now. What can be useful
> space optimization: There will be more times rows with duplicate string
> columns (protocol, account, contact, session, *_name). Maybe it could
> make sense to create new tables for it and reference integer foreign
> keys from message tables.


For now we can proceed with a single table for storage. I will need to run
some benchmarks and see if there will be any improvement when using
multiple tables.


> But I do not know if this will have some
> performance benefit for SQLite as then you will have to do lot of joins.
> Probably somebody who know SQLite better could comment this...
>

I will have to do some research about this.


>
> I think we can proceed with this schema:

--messages table
CREATE TABLE "messages" (
   "id" Integer Primary Key Autoincrement Not Null, --Unique message
identifier
   "timestamp" Text, --When the message was handled
   "message" Text, --HTML containing the message contents
   "protocol" Text Not Null, --Protocol used (Kopete::Protocol::pluginId())
   "account" Text Not Null, --Account used (Kopete::Account::accountId())
   "direction" Integer Not Null, --(Inbound = 0, Outbound=1, Internal=2)
(Kopete::Message::MessageDirection)
   "importance" Integer, -- (Low, Normal, Highlight) (Kopete::Message)
(Kopete::Message::MessageImportance)
   "contact" Text, -- The local contact used in this message (if
applicable). (Kopete::Contact::ContactId()). If present, we know we are in
single user mode.
   "subject" Text, --If applicable, this will store the subject of the
message
   "session" Text, -- Internal session identifier. If this is provided,
then we know we are in multi user mode.
   "session_name" Text, -- If in multi user mode, a human readable name for
the session.
   "from" Text, --Internal identifier for the message sender
   "from_name" Text, --Human readable name of the message sender
   "to" Text, --Internal identifier for the message recipient
   "to_name" Text, --Human readable name of the message recipient.
   "state" Integer, --(Unknown = 0, Sending = 1, Sent = 2, Error = 3)
   "type" --The type of message. (TypeNormal, TypeAction,
TypeFileTransferRequest, TypeVoiceClipRequest)
(Kopete::Message::MessageType)

--
Thanks,
Joshua
_______________________________________________
kopete-devel mailing list
kopete-devel@kde.org
https://mail.kde.org/mailman/listinfo/kopete-devel

Reply via email to