Sie sind hier: Startseite / Dokumentation und Support / Tutorials / Contentmirror

Contentmirror

Contentmirror ist ein Produkt zum Spiegeln von Archetype Content-Typen in einer relationalen Datenbank

Einleitung

Kürzbeschreibung von Contentmirror

Contentmirror dient dem spiegeln von Plone Objekten in eine relationale Datenbank. Es können sowohl die standard Contenttypen als auch selbst entwickelte Contenttypen in die Datenbank gespiegelt werden. Allerdings funktioniert die Spiegelung nur in eine Richtung - d.h. Plone muss das führende System sein. Daten, die in der Datenbank verändert werden, werden nicht in Plone / Zope zurück gespiegelt.

Contentmirror verwendet SQLAlchemy zur Kommunikation mir der Datenbank - dadurch kann Contentmirror mit allen Datenbanken verwendet werden, die von SQLAlchemy unterstützt werden. Dies sind zu Zeit:

  • FirebirdSQL
  • MySQL
  • PostgreSQL
  • Oracle
  • MS-SQL Server

und andere. In diesem Dokument wird der Zugriff auf FirebirdSQL, einer freien relationalen Datenbank, beschrieben.

Installation der Datenbank

Je nach verwendeter Linux Distribution wird FirebirdSQL bereits mit ausgeliefert. Unter Ubuntu 9.10 kann FirebirdSQL wie folgt installiert werden:

apt-get install xinetd firebird

Nach der Installation muss der Pfad angelegt und konfiguriert werden, in dem die Datenbanken gespeichert werden dürfen. Führe hierzu folgende Befehle aus:

mkdir -p /var/db/firebird
chown -R firebird:firebird /var/db/firebird

Dieser Pfad muss nun noch in der Konfigurationsdatei bekannt gegeben werden. Hierzu bitte die Datei mit dem Editor Deiner Wahl öffnen, die Änderungen durchführen und speichern.

vi /etc/firebird/firebird.conf
DatabasePath = Restrict /var/db/firebird/

Zum Schluss muss der xinetd gestartet werden:

/etc/init.d/xinetd start
Und eine Datenbank kann erzeugt werden:
isql-fb -user sysdba -password masterkey
create database '127.0.0.1:/var/db/firebird/contentmirror.fdb';
commit;

Plone installieren

Zur Installation von Plone folge bitte diesem Tutorial. Diese Schritte gelten auch für ein Ubuntu Linux.

Datenbanktreiber installieren

Bitte lade den Datenbanktreiber von der Projektseite des verwendeten Datenbanksystems. Bei FirebirdSQL kann folgende URL verwendet werden:

wget http://sourceforge.net/projects/firebird/files/firebird-python/kinterbasdb%203.3/kinterbasdb-3.3.0.tar.bz2/download

Danach muss der Treiber entpackt und installiert werden.

tar xvfj kinterbasdb-3.3.0.tar.bz2

cd kinterbasdb-3.3.0
python setup.py install

Zum testen der Installation kann der Treiber im python Interpreter geladen werden:

python
import kinterbasdb

 

 

Contentmirror installieren

In dem Plone Verzeichnis wurde eine Datei namens buildout.cfg erstellt. Dies ist die Konfigurationsdatei, die die zu installierenden Pakete der Plone Instanz beschreibt.

Zur Verwendung von Contentmirror muss diese Datei wie folgt angepasst werden (die fett markierten Einträge stellen die Stellen dar, die in der buildout.cfg Datei geändert wurden):

[buildout]
parts =
    zope2
    contentmirror
    productdistros
    instance
    zopepy

# Change the number here to change the version of Plone being used
extends = http://dist.plone.org/release/3.3.1/versions.cfg
versions = versions

# Add additional egg download sources here. dist.plone.org contains archives
# of Plone packages.
find-links =
    http://dist.plone.org/release/3.3.1
    http://dist.plone.org/thirdparty

# Add additional eggs here
eggs =
    sqlalchemy
    test.database

# Reference any eggs you are developing here, one per line
# e.g.: develop = src/my.package
develop =
    src/test.database



[zope2]
# For more information on this step and configuration options see:
# http://pypi.python.org/pypi/plone.recipe.zope2install
recipe = plone.recipe.zope2install
fake-zope-eggs = true
url = ${versions:zope2-url}


[contentmirror]
recipe = zc.recipe.egg
eggs = ore.contentmirror


# Use this section to download additional old-style products.
# List any number of URLs for product tarballs under URLs (separate
# with whitespace, or break over several lines, with subsequent lines
# indented). If any archives contain several products inside a top-level
# directory, list the archive file name (i.e. the last part of the URL,
# normally with a .tar.gz suffix or similar) under 'nested-packages'.
# If any archives extract to a product directory with a version suffix, list
# the archive name under 'version-suffix-packages'.
[productdistros]
# For more information on this step and configuration options see:
# http://pypi.python.org/pypi/plone.recipe.distros
recipe = plone.recipe.distros
urls =
nested-packages =
version-suffix-packages =


[instance]
# For more information on this step and configuration options see:
# http://pypi.python.org/pypi/plone.recipe.zope2instance
recipe = plone.recipe.zope2instance
zope2-location = ${zope2:location}
user = admin:admin
http-address = 8080
#debug-mode = on
#verbose-security = on

# If you want Zope to know about any additional eggs, list them here.
# This should include any development eggs you listed in develop-eggs above,
# e.g. eggs = Plone my.package
eggs =
    Plone
    ${buildout:eggs}
    ${contentmirror:eggs}


# If you want to register ZCML slugs for any packages, list them here.
# e.g. zcml = my.package my.other.package
zcml =
    test.database

products =
    ${buildout:directory}/products
    ${productdistros:location}

[zopepy]
# For more information on this step and configuration options see:
# http://pypi.python.org/pypi/zc.recipe.egg
recipe = zc.recipe.egg
eggs = ${instance:eggs}
interpreter = zopepy
extra-paths = ${zope2:location}/lib/python
scripts = zopepy

 

Datenbankverbindung konfigurieren

Zur Konfiguration der Datenbank wird ein eigenes Paket verwendet. Dies muss mit folgendem Befehl konfiguriert werden:

cd src
paster create -t archetype test.database
Selected and implied templates:
  ZopeSkel#basic_namespace  A project with a namespace package
  ZopeSkel#plone            A Plone project
  ZopeSkel#archetype        A Plone project that uses Archetypes

Variables:
  egg:      test.database
  package:  testdatabase
  project:  test.database
Enter title (The title of the project) ['Plone Example']: Test Database
Enter namespace_package (Namespace package (like plone)) ['plone']: test
Enter package (The package contained namespace package (like example)) ['example']: database
Enter zope2product (Are you creating a Zope 2 Product?) [True]: 
Enter version (Version) ['1.0']: 
Enter description (One-line description of the package) ['']: 
Enter long_description (Multi-line description (in reST)) ['']: 
Enter author (Author name) ['Plone Foundation']: 
Enter author_email (Author email) ['plone-developers@lists.sourceforge.net']: 
Enter keywords (Space-separated keywords/tags) ['']: 
Enter url (URL of homepage) ['http://svn.plone.org/svn/plone/plone.example']: 
Enter license_name (License name) ['GPL']: 
Enter zip_safe (True/False: if the package can be distributed as a .zip file) [False]:

Wechsle in das Verzeichnis des Paketes und erstelle eine Datei mit dem Namen settings.zcml:

vi settings.zcml
<configure xmlns="http://namespaces.zope.org/zope"
       xmlns:ore="http://namespaces.objectrealms.net/mirror">

    <!-- setup a database connection -->
   <ore:engine url="firebird://sysdba:masterkey@127.0.0.1:3050//database/cm.fdb"
             name="mirror-db"
             echo="True"/>

   <!-- associate the database connection to the mirror db structures -->
   <ore:bind engine="mirror-db"
           metadata="ore.contentmirror.schema.metadata"
           />

   <ore:mirror content="test.database.content.mycontent.MyContent"/>
   <!-- If Your Running on Plone 2.5, you must uncomment the following line
   <include package="ore.contentmirror" file="legacy.zcml"/>
   -->

</configure>
Danach muss die settings.zcml noch in der configure.zcml eingebunden werden.
  
<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:five="http://namespaces.zope.org/five"
    xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
    i18n_domain="test.database">

  <five:registerPackage package="." initialize=".initialize" />

  <!-- Include the sub-packages that use their own configure.zcml files. -->
  <include package=".browser" />
  <include package=".content" />
  <include package=".portlets" />
  <include file="meta.zcml" package="ore.contentmirror"/>
  <include package="ore.contentmirror"/>
  <include file="settings.zcml"/>

  <!-- Register the installation GenericSetup extension profile -->
  <genericsetup:registerProfile
      name="default"
      title="Plone Example"
      directory="profiles/default"
      description=""
      provides="Products.GenericSetup.interfaces.EXTENSION"
      />

  <!-- -*- extra stuff goes here -*- -->

</configure>

Datenbankschema erstellen

Damit Contentmirror die Daten in die Datenbank spiegeln kann, muss sowohl die Datenbank als auch das Datenbankschema angelegt sein. Durch folgende Befehle wird das Schema aller Contenttypen, die definiert worden sind, extrahiert und in der Datei db.sql gespeichert:

./bin/instance run bin/mirror-ddl firebird > db.sql
echo "COMMIT;" >> db.sql

Durch folgenden Befehl werden die Tabellen in der Datenbank angelegt:

isql-fb -user sysdba -password masterkey 127.0.0.1:/var/db/firebird/contentmirror.fdb -i db.sql

 

Paket installieren

Zum Schluss muss das neu erstellte Paket noch installiert werden. Starte hierzu Plone:

./bin/instance fg

und melde Dich als admin mit dem Passwort admin an. Gehe zur Konfiguration in das Konfigurationsmenü der Zusatzprodukte und Installiere das Produkt "Test Datenbank".

Ab sofort werden alle neu angelegten oder modifizierten Contenttypen in die Datenbank gespiegelt.