Midgard2 - Content Repository for mobile applications

  • 2,272 views
Uploaded on

Content repository presentation at Bossa Conference 2010

Content repository presentation at Bossa Conference 2010

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
2,272
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
9
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Midgard2 Content repository for mobile applications
  • 2. Henri Bergius Microblogs: @bergie http://bergie.iki.fi
  • 3. Content Repository Don't invent your own file formats
  • 4. Content Repository Objects instead of SQL
  • 5. Content Repository Objects instead of SQL http://xkcd.com/327/
  • 6. Content Repository Signals about changes
  • 7. Content Repository Data model is scriptable
  • 8. Content Repository Synchronization and sharing
  • 9. With a content repository incredible power is at your disposal
  • 10. Free Content Repositories • Schema-based, relational • Schema-free • Query Builder • Javascript map/reduce • C, glib, libgda • Erlang • LGPL • Apache License • D-Bus signals • JSON polling via HTTP • Library • Daemon midgard2.org couchdb.apache.org
  • 11. ...and they talk to each other
  • 12. The Midgard Project • Free software project • Object-Relational since 1999 Mapping, trees, D-Bus signals • Contributors from most European countries • APIs for C, PHP, Python, Vala, Objective-C, ... • Synchronized release model, every 6 months • Linux, Mac, Maemo
  • 13. Midgard on Maemo 5 Conboy: notes on your phone
  • 14. Midgard on Maemo 5 Workstreamer: project tracking for N900
  • 15. Midgard on the web Qaiku.com: conversational microblogging
  • 16. Getting started with Midgard
  • 17. Installation • Linux distribution repositories (Ubuntu, Debian, RHEL, OpenSuse etc) on OBS: http://download.opensuse.org/repositories/home:/midgardproject:/mjolnir/ • After that Midgard is just an apt-get install python- midgard2 or apt-get install php5-midgard2 away • Maemo 4 and 5 available in Extras Devel (soon Extras) • On OS X use MacPorts or the ObjC bundle
  • 18. Objects are defined by MgdSchema <!-- This will be installed to /usr/share/midgard2/schema/ --> <type name="midgard_person"> <property name="id" type="unsigned integer" primaryfield="id"> <description>Local non-replication-safe database identifier</description> </property> <property name="firstname" type="string" index="yes"> <description>First name of the person</description> </property> <property name="lastname" type="string" index="yes"> <description>Last name of the person</description> </property> <property name="birthdate" type="datetime"> <description>Birth date of the person</description> </property> <property name="email" type="string" index="yes"> <description>Email address of the person</description> </property> </type>
  • 19. Midgard API for PHP <?php // Load the Midgard2 API extension dl('midgard2.so'); // Set up the repository config $config = new midgard_config(); $config->dbtype = 'SQLite'; $config->database = 'midgardexample'; // this will store to SQLite in ~/.midgard2/data/midgardexample.db // Open a Midgard repository connection $midgard = midgard_connection::get_instance(); $midgard->open_config($config); // Prepare storage for your data midgard_storage::create_base_storage(); midgard_storage::create_class_storage('midgard_person');
  • 20. Midgard API for PHP // Create a new person object $person = new midgard_person(); $person->firstname = 'Leif'; $person->lastname = 'Eriksson'; $person->create(); // Query system for all persons with lastname "Eriksson" $qb = new midgard_query_builder('midgard_person'); $qb->add_constraint('lastname', '=', 'Eriksson'); $persons = $qb->execute(); foreach ($persons as $person) { echo "{$person->lastname}, {$person->firstname} has GUID {$person- >guid}n"; // Add an email address and update $person->email = 'leif@vinland.no'; $person->update(); }
  • 21. import antigravity http://xkcd.com/353/
  • 22. import antigravity # Load the Midgard2 API extension import _midgard as midgard # Set up the repository config configuration = midgard.config() configuration.dbtype = 'SQLite' configuration.database = 'midgardexample' # this will store to SQLite in ~/.midgard2/data/midgardexample.db # Open a Midgard repository connection connection = midgard.connection() connection.open_config(configuration) # Prepare storage for your data midgard.storage.create_base_storage() midgard.storage.create_class_storage('midgard_person')
  • 23. Midgard API: PHP vs. Python // Create a new person object # Create a new person object $person = new midgard_person(); person = midgard.mgdschema.midgard_person() $person->firstname = 'Leif'; person.firstname = 'Leif' $person->lastname = 'Eriksson'; person.lastname = 'Eriksson' $person->create(); person.create() // Query system for all persons with # Query system for all persons with // lastname "Eriksson" # lastname "Eriksson" $qb = new qb = midgard.query_builder('midgard_person') midgard_query_builder('midgard_person'); qb.add_constraint('lastname', '=', 'Eriksson') $qb->add_constraint('lastname', '=', persons = qb.execute() 'Eriksson'); for person in persons: $persons = $qb->execute(); print "%s, %s has GUID %s" foreach ($persons as $person) % (person.lastname, person.firstname, { person.guid) echo "{$person->lastname},” # Add an email address and update . ” {$person->firstname}” person.email = 'leif@vinland.no' . “ has GUID {$person->guid}n"; person.update() // Add an email address and update $person->email = 'leif@vinland.no'; $person->update(); }
  • 24. Oh, and Vala too! /* valac --debug --pkg midgard2 -o midgard-vala-example example.vala --vapidir=./ */ using GLib; using Midgard; namespace MidgardValaExample { void main() { Midgard.init(); Midgard.Config config = new Midgard.Config(); config.read_file ("midgard_test", true); Midgard.Connection cnc = new Midgard.Connection(); cnc.open_config (config) Midgard.Object person = new Midgard.Object (cnc, "midgard_person", null); person.set ("firstname", "Leif"); if (person.create()) { string guid; person.get ("guid", out guid); GLib.print ("Created new person identified by GUID %s n", guid); }
  • 25. any tools you use, Midgard is there
  • 26. ...maybe even in your finger
  • 27. How about Qt? • Midgard already works in PySide applications • Would be great to have proper Qt support • Anybody want to help with this?
  • 28. Tree access • Parent-child relations • get_parent() • list_children() • Access via named paths • get_by_path()
  • 29. Extending objects • Subclasses in MgdSchema <type name="bossa_attendee" extends="midgard_person"> <property name="likesbeer" type="boolean" default="true" /> </type> • Ad-hoc additional properties object.set_parameter('bossa', 'key', 'value') value = object.get_parameter('bossa', 'key') • Binary attachments are also supported • Metadata in repository, file in filesystem • API provides access to filehandles
  • 30. Midgard MVC Put your content repository on the web
  • 31. Midgard MVC • Very efficient MVC framework for PHP • Python and D-Bus for background processing • Gettext + intl i18n • TAL templating • Full WebDAV support • Git for packaging and deployment
  • 32. Midgard MVC Tomboy web synchronization with Midgard
  • 33. Midgard Runtime
  • 34. Explore the possibilities of content repositories midgard2.org #midgard on FreeNode @MidgardProject