KDE PIM/Akonadi
Akonadi TODO
The following list contains the things which need to be done for Akonadi.
Core
Status | Item | Description | Contact |
---|---|---|---|
IN PROGRESS | Item size | Needed by Mailody | <[email protected]> |
TO DO | Payload serialization format versioning | see below | <Volker> |
TO DO | Item streaming in ItemSync/ResourceBase | As discussed in Osnabrueck | <Tom> |
IN PROGRESS | API for additional item parts | As discussed in Osnabruck | <Volker/Tobias> |
IN PROGRESS | Infrastructure for showing additional dialogs from agents/resources | As discussed in Osnabrueck | <Tom> |
TO DO | Allow to limit ItemFetchJob to current cache content | Prevents search index feeder agents from downloading all remote data | <[email protected]> |
IN PROGRESS | Fix API for item/collection modifications | See Osnabrueck meeting notes for details | <Volker> |
TO DO | Error reporting | Akonadi::Job basically has only one error code: Unknown | <Tobias> |
DONE | The items above are for 4.1 ( 19th May ! ) | [mailto: <>] | |
IN PROGRESS | Tray app | small app to control the server and have a something that can report errors | Toma <[email protected]> |
IN PROGRESS | Finish collection model/view | see below | <[email protected]> |
TO DO | Backup support | Dump & Restore database contents, also useful when upgrading to a newer database version | <[email protected]> |
IN PROGRESS | Collection statistics for sub-trees | Provide a CollectionStatus object covering the full sub-tree in the model, allowing accumulated unread counts etc. | <Thomas> |
TO DO | Nepomuk integration | Generic Item tag/rate/comment, etc. | <Tom> |
TO DO | Account creation wizard | as discussed in Berlin, see below | [mailto: <>] |
TO DO | Sync collection tree after creating setting up a resource | see AgentInstanceCreateJob | [mailto: <>] |
TO DO | Support standard commands for QUndo framework | [mailto: <>] | |
TO DO | Conflict detection in resources | See Osnabrueck meeting notes for details | [mailto: <>] |
IN PROGRESS | Action framework | see below | Volker <[email protected]> |
TO DO | Solid integration | Switch online/offline state in ResourceBase automatically | [mailto: <>] |
TO DO | Make unittests work without destroying the production database | [mailto: <>] |
Supported Types
Overview on the current state of support for various types:
Type | Serializer | Multipart Support | Models | Views | Resources | Notes |
---|---|---|---|---|---|---|
yes | partial | MessageModel, MessageCollectionModel, threading proxy model | ? | maildir, IMAP | threading agent | |
News | yes (1) | partial (1) | (1) | (1) | NNTP | |
Contact | yes | no | ContactModel | - | vCard, facebook, KRes | |
Events | yes | no | EventModel | - | iCal, KRes | |
Notes | no | no | - | - | - | not started yet |
Feeds | no | no | - | - | - | not started yet |
Bookmarks | yes | no | - | - | local bookmarks, del.icio.us |
(1) see Email
Mail specific extensions
Status | Item | Description | Contact |
---|---|---|---|
TO DO | Extend Message Model | Add all required columns, save/restore layout, flag delegate, configurable columns, etc. | [mailto: <>] |
TO DO | Share mail flag code | Standard actions, standard flag enum/constants, Nepomuk interaction | [mailto: <>] |
TO DO | Extend ENVELOPE | Add more information to the envelope payload part in the serializer plugin, eg. trheading information is missing | [mailto: <>] |
TO DO | Fix/finish threading | [mailto: <>] |
Event/Todo/Journal specific extensions
Status | Item | Description | Contact |
---|---|---|---|
TO DO | Todo proxy model | See KOrganizers To-Do view | <Bruno?> |
IN PROGRESS | Subtype identification | See discussion on kde-pim mailinglist | <Kevin?> |
TO DO | Agenda view | KOrganizer agenda view based on Akonadi | <Bruno?> |
TO DO | Month view | KOrganizer month view based on Akonadi | <Bruno?> |
TO DO | Timeline view | KOrganizer timeline view based on Akonadi | [mailto: <>] |
Resources, Agents and others
Status | Item | Description | Contact |
---|---|---|---|
IN PROGRESS | KResource Akonadi bridge | for applications using KCal or KABC | Kevin <[email protected]> |
IN PROGRESS | Akonadi KResource bridge | for data accessed through KCal or KABC resources | Kevin <[email protected]> |
TO DO | Expire Agent | [mailto: <>] | |
TO DO | MBOX Resource | <Thomas> | |
TO DO | Extend IMAP Resource | [mailto: <>] | |
TO DO | POP3 Resource | <Thomas> | |
TO DO | RSS Resource | [mailto: <>] | |
TO DO | Filter Agent | [mailto: <>] | |
TO DO | Search | [mailto: <>] | |
TO DO | Filter Rule GUI | Used by filters and searches | [mailto: <>] |
Resource status overview (this should list all resources existing in KDE3 or already under development for Akonadi):
Resource | Retrieve Collections | Retrieve Items | Change Collections | Change Items | Configuration | Notes |
---|---|---|---|---|---|---|
iCal | yes (4) | yes (1) (2) | no | yes (5) | yes | does not yet watch for file changes |
vCard | yes (4) | yes (1) (2) | no | ? | yes | does not yet watch for file changes |
maildir | yes (1) (4) | yes (1) (2) | ? | ? | yes | |
mbox | no | no | no | no | no | not started yet, code exists in KMail |
IMAP | yes (1) (4)? | yes (1) (2) | no | no | no | code exists in kio_imap4 and Mailody, support for extensions: quota, ACL, annotations missing, what about Kolab and Scalix? |
POP3 | no | no | no | no | no | not started yet,code exists in kio_pop3 |
NNTP | yes (4) | yes (2) | n/a | n/a | yes | Needs support for local collection names and collection hierarchy |
Local Bookmarks | ? | ? | ? | ? | (3) | Code in akonadi/resources |
OpenChange | ? | ? | ? | ? | ? | Code in akonadi/resources |
? | ? | ? | ? | ? | Code in playground/pim | |
del.icio.us | ? | ? | ? | yes | no | Code in playground/pim |
KABC | no | yes | no | yes | yes | |
KCal | no | yes | no | yes | yes |
(1) only full sync supported currently, need optimization (2) does not yet honor cache policy (3) still relies on QSettings for configuration and/or doesn't provide configuration over D-Bus (4) does not yet provide correct access control settings (5) only adding new items, not changing existing ones
Akonadi Braindump
Ideas/notes etc. on various open issues in Akonadi.
Akonadi Standard Actions
Idea: Have something like KStandardAction for Akonadi that not only includes the representation of the action but also its state management and the actual operations. Like libakonadi that should be splitted into a generic, type-independent part and be extensible for type-specific actions. This will enable code sharing among many applications and guarantee consistent actions everywhere.
State management: watch selection models of a collection and/or item model.
Use KXMLGUI for context menus in standard views to allow easy extensibility with custom actions.
Generic actions:
- new collection [done]
- new virtual collection
- delete collection [done for single selection]
- copy collection [done]
- cut collection
- paste collection [done]
- synchronize collection [done for single selection]
- synchronize resource
- synchronize everything
- show collection properties dialog [done]
- delete item(s) [done]
- copy item(s) [done]
- cut item(s)
- paste item(s) [done]
- paste native data
- tag item(s)
- comment item
- rate item(s)
- configure resource
- add resource? (would need a type parameter, etc.)
- delete resource
- manage local subscriptions [done]
- move to submenu
- copy to submenu
The list is definitely long enough to make this worthwhile.
Collection Model / Collection View
Ideas/missing features/bugs of the collection model/view:
- Enable/disable status columns
- Show status after the name (see KMail)
- Size column
- Save/restore layout
- Custom collection icons (see KMail, also needed for resource defined special folders (eg. Inbox)
- Status tooltips (see KMail in 3.5.9)
- Quick search
- Favorite folder view as proxy model on top of the normal collection model (FlatCollectionProxyModel might be helpful for there)
- Accumulated statistics (unread, total, size)
- Fix dnd: move/copy/cancel menu always shows up and never has any effect
Compatibility
Notes on how to keep long-term protocol, source and binary compatibility.
- Detect server version in Akonadi::Session, might be useful in case of protocol extensions/changes
- What about database server version updates?
- Versioning or any other kind of serialization format meta data, we'll need that in case of changes in serialization formats (see eg. Robert's compression patch where this is needed)
- We currently use 32 bit ids, probably hard to change later on, is that enough?
- Plugin versioning
Resource API issues
Notes/ideas/complaints about the Akonadi::ResourceBase API:
- Extremely error prone:
- Scheduler dead-locks when a requested operation is not correctly announced as finished, esp. a problem in error cases.
- Using the result methods multiple times or when not requested asserts
- Item streaming is missing, requiring all data to be in memory at once
- Non-incremental updates need to know the results of ItemSync to not have to provide all data, even for already existing/unchanged items.
API / BC issues
Smaller stuff that should be fixed before the ABI freeze and is not yet listed above:
- Cleanup the D-Bus format used by NotificationMessage
- No mentioning of "IMAP" in the public API, we are not using IMAP
- Naming and installed location of libraries, headers and executables (see discussion on kde-pim ML)
- Payload part labels are QStrings, attribute types are QByteArray
Deployment issues
- Multiple access: Should multiple Akonadi instances' mysqlds access a single set of data files the mysql will likely corrupt the data. This can happen in any NFS+YP installation where users can log onto any machine and access shared homes. MySQL relies on filesystem locking to prevent multiple access. MySQL multiple instance docu.
- InnoDB tables should not be used on NFS.
- NFS speed: MySQL documentation recommends against locating its data files on network shares.
- AppArmor: Distros' AppArmor profiles prevent MySQL from writing outside its defined data directory (usually /var/lib/mysql). This is a problem at least with *buntu and openSUSE. These will need to be adapted. It is possible to daisy-chain profiles so that MySQL started by Akonadi receives a different profile to MySQL running standalone. An empty profile has all rights. Another possibility is to adapt the general MySQL profile so it can write to ${XDG_DATA_HOME}/akonadi(usually ${HOME/}.local/share/akonadi). Both support for profile chaining and ${HOME} may depend on the version of AppArmor installed. What about SELinux?
- Backup: MySQL data files should not be backed up without telling the mysqld process, otherwise a corrupt backup will be made. LOCK TABLES and FLUSH TABLES at the least. A dump can be made or mysqlhotbackup may be used in some circumstances. We should consider sysadmins' backup techniques when planning/promoting Akonadi, as a simple rsync cronjob with running Akonadi will not work. MySQL backup advice.
Account Creation Wizard
Notes on the resource configuration wizard discussion.
- WizardBase class
- Wizard discovery via .desktop files
- A wizard can configure multiple resources (eg. IMAP + LDAP for Kolab) and non-resources (mailtransport)
- Optionally hide resources completely covered by wizards in the Add Account dialog
- List wizards in the Add Account dialog
- Store Account -> Resources information to offer deletion of depending resources
PostgreSQL datastore support
First review of the akonadi code reveals PGSQL Qt driver is already supported, but the code is not totally ready for it. Some first reading comments about where to patch for supporting PostgreSQL too:
akonadi/server/src/storage/dbinitializer.cpp
- line 201..., ALTER TABLE ADD [UNIQUE] INDEX syntax is MySQL only, better use the common one CREATE [UNIQUE] INDEX ... one [done with revision 789899]
- line 303, QString DbInitializer::sqlType(const QString & type), LONGBLOB is the MySQL type, PostgreSQL will use BYTEA.
- line 362, qFatal("Implement index support for your database!");
mysql: SHOW INDEXES FROM %1 pgsql: SELECT c2.relname, i.indisprimary, i.indisunique, i.indisclustered, i.indisvalid, pg_catalog.pg_get_indexdef(i.indexrelid, 0, true), c2.reltablespace FROM pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_index i WHERE c.oid = '16713' AND c.oid = i.indrelid AND i.indexrelid = c2.oid ORDER BY i.indisprimary DESC, i.indisunique DESC, c2.relname relname | indisprimary | indisunique | indisclustered | indisvalid | pg_get_indexdef | reltablespace --------------+--------------+-------------+----------------+------------+--------------------------------------------------------------+--------------- foo_pkey | t | t | f | t | CREATE UNIQUE INDEX foo_pkey ON foo USING btree (id) | 0 foo_time_key | f | t | f | t | CREATE UNIQUE INDEX foo_time_key ON foo USING btree ("time") | 0 (2 lignes)
akonadi/server/src/storage/datastore.cpp
- line 700, qint64 DataStore::highestPimItemId() const, seems wrong for a concurrent program (SELECT MAX(col) FROM table; is not reliable if another thread is inserting at the same time) : check the callers
- line 794, qint64 DataStore::lastInsertId( const QSqlQuery & query ), PostgreSQL doesn't provide concurrent-bogus last_insert_id, but from 8.2 accepts the syntax INSERT INTO ... RETURNING col1, col2, ...;
- line 806, QString DataStore::dateTimeFromQDateTime( const QDateTime & dateTime ), use PostgreSQL to_char() formatting function for date rather than having Qt do it
KMail Breakdown Plan
The current plan is to put some parts of KMail into a stand-alone library, independent of KMail. This increases code reuse (for example, the message composer could be shared with Mailody) and makes the code a lot easier to maintain and to port to Akonadi.
Status | Item | Description | Contact |
---|---|---|---|
TO DO | Bodypart formatters | [mailto: <>] | |
TO DO | Reader Window | [mailto: <>] | |
TO DO | Composer: Editor | [mailto: <>] | |
TO DO | Composer: Message Composer | [mailto: <>] | |
TO DO | Composer: GUI Window | [mailto: <>] | |
TO DO | Queue Manager for mailtransport | [mailto: <>] | |
TO DO | Templates: Core | [mailto: <>] | |
TO DO | Templates: GUI | [mailto: <>] | |
TO DO | Port KMCommands | [mailto: <>] | |
TO DO | Port away from KMMessage and KMFolder* everywhere it is left | [mailto: <>] | |
TO DO | Migration application for index and other config | [mailto: <>] | |
TO DO | Port MDNs | [mailto: <>] |
The Road to World Domination
Sort of related so the stuff above but with a scope for all of KDE PIM and beyond.
Status | Item | Description | Contact |
---|---|---|---|
TO DO | Share identity config GUI parts | eg. the signature configuration widget | [mailto: <>] |
TO DO | Mailtransport Agent | Global shared outbox, central mail sending instance | [mailto: <>] |
TO DO | Recently sent to support in mailtransport | related to above, based on Akonadi/Nepomuk | [mailto: <>] |
TO DO | Composer engine | Shared stuff for KMail/KNode/Mailody: Crypto, editor, editor actions, attachment model, message assembly, etc. | [mailto: <>] |
Akonadi FAQ
Could Akonadi use another MySQL server?
Yes, it could! Please take a look into the mysql configuration file.
Where is the MySQL configuration file located?
It's located in ~/.config/akonadi/ and named to akonadiserverrc.
Is it possible to use another DBMS than MySQL with Akonadi?
Until now, no. But there is some kind of work to support PostgreSQL. But it's not finished yet.
Is it possible to for Akonadi to handle multiple users?
It depends on your definition of "users". Akonadi runs for one user on his local machine and handle all pim-data for this user. It stores all the data into the home directory of the user. There is no multiuser-groupware-server goal!
Is Akonadi a groupware server?
No! It's only for your local use. Akonadi is a pim storage system for your local applications.
Where does Akonadi store my data?
You will find your data in ~/.local/.