[pytango] 166/483: add experimental databaseds

Sandor Bodo-Merle sbodomerle-guest at moszumanska.debian.org
Thu Sep 28 19:14:37 UTC 2017


This is an automated email from the git hooks/post-receive script.

sbodomerle-guest pushed a commit to annotated tag bliss_8.10
in repository pytango.

commit 2f5cc96cb0bbb10e8397e4c86d8f0e6a566cd078
Author: tiagocoutinho <tiagocoutinho at 4e9c00fd-8f2e-0410-aa12-93ce3db5e235>
Date:   Thu Oct 11 15:36:36 2012 +0000

    add experimental databaseds
    
    git-svn-id: http://svn.code.sf.net/p/tango-cs/code/bindings/PyTango/trunk@21276 4e9c00fd-8f2e-0410-aa12-93ce3db5e235
---
 PyTango/databaseds/DataBase.xmi         | 817 ++++++++++++++++++++++++++++++++
 PyTango/databaseds/DataBaseds           |   9 +
 PyTango/databaseds/create_db.sql        | 124 +++++
 PyTango/databaseds/create_db_tables.sql | 230 +++++++++
 PyTango/databaseds/db_access.py         | 437 +++++++++++++++++
 PyTango/databaseds/db_errors.py         |   8 +
 PyTango/databaseds/mysql2sqlite.sh      | 101 ++++
 PyTango/release.py                      |   4 +-
 8 files changed, 1728 insertions(+), 2 deletions(-)

diff --git a/PyTango/databaseds/DataBase.xmi b/PyTango/databaseds/DataBase.xmi
new file mode 100644
index 0000000..406a784
--- /dev/null
+++ b/PyTango/databaseds/DataBase.xmi
@@ -0,0 +1,817 @@
+<?xml version="1.0" encoding="ASCII"?>
+<pogoDsl:PogoSystem xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:pogoDsl="http://www.esrf.fr/tango/pogo/PogoDsl">
+  <classes name="DataBase" pogoRevision="8.1">
+    <description description="This class manage the TANGO database." title="TANGO" sourcePath="/home/tcoutinho/allworkspace/tango-database/trunk" language="Python" filestogenerate="XMI   file,Code files" hasMandatoryProperty="false" hasConcreteProperty="false" hasAbstractCommand="false" hasAbstractAttribute="false">
+      <inheritances classname="Device_4Impl" sourcePath="/segfs/tango/templates/AbstractClasses"/>
+      <identification contact="at cells.es - controls" author="controls" emailDomain="cells.es" classFamily="System" siteSpecific="" platform="All Platforms" bus="Not Applicable" manufacturer="none" reference=""/>
+    </description>
+    <commands name="State" description="This command gets the device state (stored in its <i>device_state</i> data member) and returns it to the caller." execMethod="dev_state" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="none.">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argin>
+      <argout description="State Code">
+        <type xsi:type="pogoDsl:StateType"/>
+      </argout>
+      <status abstract="true" inherited="true" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="Status" description="This command gets the device status (stored in its <i>device_status</i> data member) and returns it to the caller." execMethod="dev_status" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="none.">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argin>
+      <argout description="Status description">
+        <type xsi:type="pogoDsl:ConstStringType"/>
+      </argout>
+      <status abstract="true" inherited="true" concrete="true" concreteHere="false"/>
+    </commands>
+    <commands name="DbAddDevice" description="Add a Tango class device to a specific device server" execMethod="db_add_device" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Full device server process name&#xA;Str[1] = Device name&#xA;Str[2] = Tango class name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbAddServer" description="Create a device server process entry in database" execMethod="db_add_server" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Full device server name&#xA;Str[1] = Device(s) name&#xA;Str[2] = Tango class name&#xA;Str[n] = Device name&#xA;Str[n + 1] = Tango class name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbDeleteAttributeAlias" description="Delete an attribute alias." execMethod="db_delete_attribute_alias" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Attriibute alias name.">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbDeleteClassAttribute" description="delete a class attribute and all its properties from database" execMethod="db_delete_class_attribute" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Tango class name&#xA;Str[1] = Attribute name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbDeleteClassAttributeProperty" description="delete class attribute properties from database" execMethod="db_delete_class_attribute_property" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Tango class name&#xA;Str[1] = Attribute name&#xA;Str[2] = Property name&#xA;Str[n] = Property name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbDeleteClassProperty" description="Delete class properties from database" execMethod="db_delete_class_property" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Tango class name&#xA;Str[1] = Property name&#xA;Str[n] = Property name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbDeleteDevice" description="Delete a devcie from database" execMethod="db_delete_device" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="device name">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbDeleteDeviceAlias" description="Delete a device alias." execMethod="db_delete_device_alias" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="device alias name">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbDeleteDeviceAttribute" description="Delete  device attribute properties from database" execMethod="db_delete_device_attribute" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Device name&#xA;Str[1] = Attribute name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbDeleteDeviceAttributeProperty" description="delete a device attribute property from the database" execMethod="db_delete_device_attribute_property" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Device name&#xA;Str[1] = Attribute name&#xA;Str[2] = Property name&#xA;Str[n] = Property name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbDeleteDeviceProperty" description="Delete device property(ies)" execMethod="db_delete_device_property" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Device name&#xA;Str[1] = Property name&#xA;Str[n] = Property name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbDeleteProperty" description="Delete free property from database" execMethod="db_delete_property" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0]  = Object name&#xA;Str[1] = Property name&#xA;Str[n] = Property name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbDeleteServer" description="Delete server from the database but dont delete device properties" execMethod="db_delete_server" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Device server name">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbDeleteServerInfo" description="delete info related to a Tango devvice server process" execMethod="db_delete_server_info" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Device server name">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbExportDevice" description="Export a device to the database" execMethod="db_export_device" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Device name&#xA;Str[1] = CORBA IOR&#xA;Str[2] = Device server process host name&#xA;Str[3] = Device server process PID or string ``null``&#xA;Str[4] = Device server process version">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbExportEvent" description="Export Event channel to database" execMethod="db_export_event" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = event channel name (or factory name)&#xA;Str[1] = CORBA IOR&#xA;Str[2] = Notifd host name&#xA;Str[3] = Notifd pid&#xA;Str[4] = Notifd version">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetAliasDevice" description="Get device name from its alias." execMethod="db_get_alias_device" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Alias name">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="Device name">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetAttributeAlias" description="Get the attribute name for the given alias.&#xA;If alias not found in database, returns an empty string." execMethod="db_get_attribute_alias" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="The attribute alias name">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="The attribute name (device/attribute)">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetAttributeAliasList" description="Get attribute alias list for a specified filter" execMethod="db_get_attribute_alias_list" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="attribute alias filter string (eg: att*)">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="attribute aliases">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetClassAttributeList" description="Get attrilute list for a given Tango class with a specified filter" execMethod="db_get_class_attribute_list" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Tango class name&#xA;Str[1] = Attribute name filter (eg: att*)">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="Str[0] = Class attribute name&#xA;Str[n] = Class attribute name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetClassAttributeProperty" description="Get Tango class property(ies) value" execMethod="db_get_class_attribute_property" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Tango class name&#xA;Str[1] = Attribute name&#xA;Str[n] = Attribute name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="Str[0] = Tango class name&#xA;Str[1] = Attribute property  number&#xA;Str[2] = Attribute property 1 name&#xA;Str[3] = Attribute property 1 value&#xA;Str[n + 1] = Attribute property 2 name&#xA;Str[n + 2] = Attribute property 2 value">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetClassAttributeProperty2" description="This command supports array property compared to the old command called&#xA;DbGetClassAttributeProperty. The old command has not been deleted from the&#xA;server for compatibility reasons." execMethod="db_get_class_attribute_property2" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Tango class name&#xA;Str[1] = Attribute name&#xA;Str[n] = Attribute name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="Str[0] = Tango class name&#xA;Str[1] = Attribute property  number&#xA;Str[2] = Attribute property 1 name&#xA;Str[3] = Attribute property 1 value number (array case)&#xA;Str[4] = Attribute property 1 value&#xA;Str[n] = Attribute property 1 value (array case)&#xA;Str[n + 1] = Attribute property 2 name&#xA;Str[n + 2] = Attribute property 2 value number (array case)&#xA;Str[n + 3] = Attribute property 2 value&#xA;Str[n + m] = Attribute property 2 value (array case)">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetClassAttributePropertyHist" description="Retrieve Tango class attribute property history" execMethod="db_get_class_attribute_property_hist" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Tango class&#xA;Str[1] = Attribute name&#xA;Str[2] = Property name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="Str[0] = Attribute name&#xA;Str[1] = Property name&#xA;Str[2] = date&#xA;Str[3] = Property value number (array case)&#xA;Str[4] = Property value 1&#xA;Str[n] = Property value n">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetClassForDevice" description="Get Tango class for the specified device." execMethod="db_get_class_for_device" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Device name">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="Device Tango class">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetClassInheritanceForDevice" description="Get class inheritance for the specified device." execMethod="db_get_class_inheritance_for_device" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Device name">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="Classes off the specified device.&#xA;[0] - is the class of the device.&#xA;[1] - is the class from the device class is inherited.&#xA;........and so on">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetClassList" description="Get Tango class list with a specified filter" execMethod="db_get_class_list" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Filter">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="Class list">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetClassProperty" description="" execMethod="db_get_class_property" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Tango class&#xA;Str[1] = Property name&#xA;Str[2] = Property name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="Str[0] = Tango class&#xA;Str[1] = Property number&#xA;Str[2] = Property name&#xA;Str[3] = Property value number (array case)&#xA;Str[4] = Property value&#xA;Str[n] = Propery value (array case)&#xA;....">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetClassPropertyHist" description="Retrieve Tango class property history" execMethod="db_get_class_property_hist" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Tango class&#xA;Str[1] = Property name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="Str[0] = Property name&#xA;Str[1] = date&#xA;Str[2] = Property value number (array case)&#xA;Str[3] = Property value 1&#xA;Str[n] = Property value n">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetClassPropertyList" description="Get property list for a given Tango class with a specified filter" execMethod="db_get_class_property_list" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="The filter">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="Property name list">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetDeviceAlias" description="Return alias for device name if found." execMethod="db_get_device_alias" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="The device name">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="The alias found">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetDeviceAliasList" description="Get device alias name with a specific filter" execMethod="db_get_device_alias_list" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="The filter">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="Device alias list">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetDeviceAttributeList" description="Return list of attributes matching the wildcard&#xA; for the specified device" execMethod="db_get_device_attribute_list" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Device name&#xA;Str[1] = Wildcard">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="attribute name list">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetDeviceAttributeProperty" description="Get device attribute property(ies) value" execMethod="db_get_device_attribute_property" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Device name&#xA;Str[1] = Attribute name&#xA;Str[n] = Attribute name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="Str[0] = Device name&#xA;Str[1] = Attribute property  number&#xA;Str[2] = Attribute property 1 name&#xA;Str[3] = Attribute property 1 value&#xA;Str[n + 1] = Attribute property 2 name&#xA;Str[n + 2] = Attribute property 2 value">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetDeviceAttributeProperty2" description="Retrieve device attribute properties. This command has the possibility to retrieve&#xA;device attribute properties which are arrays. It is not possible with the old&#xA;DbGetDeviceAttributeProperty command. Nevertheless, the old command has not been&#xA;deleted for compatibility reason" execMethod="db_get_device_attribute_property2" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Device name&#xA;Str[1] = Attribute name&#xA;Str[n] = Attribute name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="Str[0] = Device name&#xA;Str[1] = Attribute property  number&#xA;Str[2] = Attribute property 1 name&#xA;Str[3] = Attribute property 1 value number (array case)&#xA;Str[4] = Attribute property 1 value&#xA;Str[n] = Attribute property 1 value (array case)&#xA;Str[n + 1] = Attribute property 2 name&#xA;Str[n + 2] = Attribute property 2 value number (array case)&#xA;Str[n + 3] = Attribute property 2 value&#xA;Str[n + m] = Attribute property 2 value (array case)">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetDeviceAttributePropertyHist" description="Retrieve device attribute property history" execMethod="db_get_device_attribute_property_hist" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Device name&#xA;Str[1] = Attribute name&#xA;Str[2] = Property name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="Str[0] = Attribute name&#xA;Str[1] = Property name&#xA;Str[2] = date&#xA;Str[3] = Property value number (array case)&#xA;Str[4] = Property value 1&#xA;Str[n] = Property value n">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetDeviceClassList" description="Get Tango classes/device list embedded in a specific device server" execMethod="db_get_device_class_list" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Device server process name">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="Str[0] = Device name&#xA;Str[1] = Tango class&#xA;Str[n] = Device name&#xA;Str[n + 1] = Tango class">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetDeviceDomainList" description="Get list of device domain name matching the specified" execMethod="db_get_device_domain_list" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="The wildcard">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="Device name domain list">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetDeviceExportedList" description="Get a list of exported devices whose names satisfy the filter (wildcard is" execMethod="db_get_device_exported_list" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="filter">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="list of exported devices">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetDeviceFamilyList" description="Get a list of device name families for device name matching the&#xA;specified wildcard" execMethod="db_get_device_family_list" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="The wildcard">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="Family list">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetDeviceInfo" description="Returns info from DbImportDevice and started/stopped dates." execMethod="db_get_device_info" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Device name">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="Str[0] = Device name&#xA;Str[1] = CORBA IOR&#xA;Str[2] = Device version&#xA;Str[3] = Device Server name&#xA;Str[4] = Device Server process host name&#xA;Str[5] = Started date (or ? if not set)&#xA;Str[6] = Stopped date (or ? if not set)&#xA;Str[7] = Device class&#xA;&#xA;Lg[0] = Device exported flag&#xA;Lg[1] = Device Server process PID (or -1 if not set)">
+        <type xsi:type="pogoDsl:LongStringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetDeviceList" description="Get a list of devices for specified server and class." execMethod="db_get_device_list" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="argin[0] : server name&#xA;argin[1] : class name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="The list of devices for specified server and class.">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetDeviceWideList" description="Get a list of devices whose names satisfy the filter." execMethod="db_get_device_wide_list" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="filter">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="list of exported devices">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetDeviceMemberList" description="Get a list of device name members for device name matching the&#xA;specified filter" execMethod="db_get_device_member_list" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="The filter">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="Device names member list">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetDeviceProperty" description="" execMethod="db_get_device_property" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Device name&#xA;Str[1] = Property name&#xA;Str[n] = Property name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="Str[0] = Device name&#xA;Str[1] = Property number&#xA;Str[2] = Property name&#xA;Str[3] = Property value number (array case)&#xA;Str[4] = Property value 1&#xA;Str[n] = Property value n (array case)&#xA;Str[n + 1] = Property name&#xA;Str[n + 2] = Property value number (array case)&#xA;Str[n + 3] = Property value 1&#xA;Str[n + m] = Property value m">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetDevicePropertyHist" description="Retrieve device  property history" execMethod="db_get_device_property_hist" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Device name&#xA;Str[2] = Property name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="Str[0] = Property name&#xA;Str[1] = date&#xA;Str[2] = Property value number (array case)&#xA;Str[3] = Property value 1&#xA;Str[n] = Property value n">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetDevicePropertyList" description="Get property list belonging to the specified device and with&#xA;name matching the specified filter" execMethod="db_get_device_property_list" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = device name&#xA;Str[1] = Filter">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="Property name list">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetDeviceServerClassList" description="Get list of Tango classes for a device server" execMethod="db_get_device_server_class_list" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="device server process name">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="list of classes for this device server">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetExportdDeviceListForClass" description="Query the database for device exported for the specified class." execMethod="db_get_exportd_device_list_for_class" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Class name">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="Device exported list">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetHostList" description="Get host list with name matching the specified filter" execMethod="db_get_host_list" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="The filter">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="Host name list">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetHostServerList" description="Get list of device server process name running on host with name matching&#xA;the specified filter" execMethod="db_get_host_server_list" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="The filter">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="Device server process name list">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetHostServersInfo" description="Get info about all servers running on specified host, name, mode and level" execMethod="db_get_host_servers_info" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Host name">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="Server info for all servers running on specified host">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetInstanceNameList" description="Returns the instance names found for specified server." execMethod="db_get_instance_name_list" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Server name">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="The instance names found for specified server.">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetObjectList" description="Get list of free object defined in database with name&#xA;matching the specified filter" execMethod="db_get_object_list" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="The filter">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="Object name list">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetProperty" description="Get free object property" execMethod="db_get_property" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Object name&#xA;Str[1] = Property name&#xA;Str[n] = Property name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="Str[0] = Object name&#xA;Str[1] = Property number&#xA;Str[2] = Property name&#xA;Str[3] = Property value number (array case)&#xA;Str[4] = Property value 1&#xA;Str[n] = Property value n (array case)&#xA;Str[n + 1] = Property name&#xA;Str[n + 2] = Property value number (array case)&#xA;Str[n + 3] = Property value 1&#xA;Str[n + m] = Property value m">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetPropertyHist" description="Retrieve object  property history" execMethod="db_get_property_hist" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Object name&#xA;Str[2] = Property name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="Str[0] = Property name&#xA;Str[1] = date&#xA;Str[2] = Property value number (array case)&#xA;Str[3] = Property value 1&#xA;Str[n] = Property value n">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetPropertyList" description="Get list of property defined for a free object and matching the&#xA;specified filter" execMethod="db_get_property_list" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Object name&#xA;Str[1] = filter">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="Property name list">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetServerInfo" description="Get info about host, mode and level for specified server" execMethod="db_get_server_info" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="server name">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="server info">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetServerList" description="Get list of device server process defined in database&#xA;with name matching the specified filter" execMethod="db_get_server_list" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="The filter">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="Device server process name list">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetServerNameList" description="Returns the list of server names found for the wildcard specified.&#xA;It returns only the server executable name without instance name as DbGetServerList." execMethod="db_get_server_name_list" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="wildcard for server names.">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="server names found.">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbImportDevice" description="Import a device from the database" execMethod="db_import_device" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Device name (or alias)">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="Str[0] = device name&#xA;Str[1] = CORBA IOR&#xA;Str[2] = device version&#xA;Str[3] = device server process name&#xA;Str[4] = host name&#xA;Str[5] = Tango class name&#xA;&#xA;Lg[0] = Exported flag&#xA;Lg[1] = Device server process PID">
+        <type xsi:type="pogoDsl:LongStringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbImportEvent" description="Get event channel info from database" execMethod="db_import_event" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="name of event channel or factory">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="export information e.g. IOR">
+        <type xsi:type="pogoDsl:LongStringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbInfo" description="Get miscellaneous numbers on information&#xA;stored in database" execMethod="db_info" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argin>
+      <argout description="Miscellaneous info like:&#xA;- Device defined in database&#xA;- Device marked as exported in database&#xA;- Device server process defined in database&#xA;- Device server process marked as exported in database&#xA;- Device properties defined in database&#xA;- Class properties defined in database&#xA;- Device attribute properties defined in database&#xA;- Class attribute properties defined in database&#xA;- Object properties defined in database">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbPutAttributeAlias" description="Define an alias for an attribute" execMethod="db_put_attribute_alias" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = attribute name&#xA;Str[1] = attribute alias">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbPutClassAttributeProperty" description="Create/Update class attribute property(ies) in database" execMethod="db_put_class_attribute_property" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Tango class name&#xA;Str[1] = Attribute number&#xA;Str[2] = Attribute name&#xA;Str[3] = Property number&#xA;Str[4] = Property name&#xA;Str[5] = Property value&#xA;.....">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbPutClassAttributeProperty2" description="This command adds support for array properties compared to the previous one&#xA;called DbPutClassAttributeProperty. The old comman is still there for compatibility reason" execMethod="db_put_class_attribute_property2" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Tango class name&#xA;Str[1] = Attribute number&#xA;Str[2] = Attribute name&#xA;Str[3] = Property number&#xA;Str[4] = Property name&#xA;Str[5] = Property value number (array case)&#xA;Str[5] = Property value 1&#xA;Str[n] = Property value n (array case)&#xA;.....">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbPutClassProperty" description="Create / Update class property(ies)" execMethod="db_put_class_property" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Tango class name&#xA;Str[1] = Property number&#xA;Str[2] = Property name&#xA;Str[3] = Property value number&#xA;Str[4] = Property value 1&#xA;Str[n] = Property value n&#xA;....">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbPutDeviceAlias" description="Define alias for  a given device name" execMethod="db_put_device_alias" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = device name&#xA;Str[1] = alias name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbPutDeviceAttributeProperty" description="Create/Update device attribute property(ies) in database" execMethod="db_put_device_attribute_property" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Device name&#xA;Str[1] = Attribute number&#xA;Str[2] = Attribute name&#xA;Str[3] = Property number&#xA;Str[4] = Property name&#xA;Str[5] = Property value&#xA;.....">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbPutDeviceAttributeProperty2" description="Put device attribute property. This command adds the possibility to have attribute property&#xA;which are arrays. Not possible with the old DbPutDeviceAttributeProperty command.&#xA;This old command is not deleted for compatibility reasons." execMethod="db_put_device_attribute_property2" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Device name&#xA;Str[1] = Attribute number&#xA;Str[2] = Attribute name&#xA;Str[3] = Property number&#xA;Str[4] = Property name&#xA;Str[5] = Property value number (array case)&#xA;Str[5] = Property value 1&#xA;Str[n] = Property value n (array case)&#xA;.....">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbPutDeviceProperty" description="Create / Update device property(ies)" execMethod="db_put_device_property" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Tango device name&#xA;Str[1] = Property number&#xA;Str[2] = Property name&#xA;Str[3] = Property value number&#xA;Str[4] = Property value 1&#xA;Str[n] = Property value n&#xA;....">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbPutProperty" description="Create / Update free object property(ies)" execMethod="db_put_property" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Str[0] = Object name&#xA;Str[1] = Property number&#xA;Str[2] = Property name&#xA;Str[3] = Property value number&#xA;Str[4] = Property value 1&#xA;Str[n] = Property value n&#xA;....">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbPutServerInfo" description="Update server info including host, mode and level" execMethod="db_put_server_info" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="server info">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbUnExportDevice" description="Mark a device as non exported in database" execMethod="db_un_export_device" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Device name">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbUnExportEvent" description="Mark one event channel as non exported in database" execMethod="db_un_export_event" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="name of event channel or factory to unexport">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="none">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbUnExportServer" description="Mark all devices belonging to a specified device server&#xA;process as non exported" execMethod="db_un_export_server" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Device server name (executable/instance)">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="ResetTimingValues" description="Reset the timing attribute values." execMethod="reset_timing_values" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetDataForServerCache" description="This command returns all the data needed by a device server process during its&#xA;startup sequence. The aim of this command is to minimize database access during&#xA;device server startup sequence." execMethod="db_get_data_for_server_cache" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="Elt[0] = DS name (exec_name/inst_name), Elt[1] = Host name">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="All the data needed by the device server during its startup sequence. Precise list depend on the device server">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbDeleteAllDeviceAttributeProperty" description="Delete all attribute properties for the specified device attribute(s)" execMethod="db_delete_all_device_attribute_property" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="str[0] = device name&#xA;Str[1]...str[n] = attribute name(s)">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argin>
+      <argout description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbMySqlSelect" description="This is a very low level command.&#xA;It executes the specified  SELECT command on TANGO database and returns its result without filter." execMethod="db_my_sql_select" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="MySql Select command">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="MySql Select command result&#xA; - svalues : select results&#xA; - lvalue[n] : =0 if svalue[n] is null else =1&#xA; (last lvalue -1) is number of rows, (last lvalue) is number of fields">
+        <type xsi:type="pogoDsl:LongStringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetCSDbServerList" description="Get a list of host:port for all database server defined in the control system" execMethod="db_get_csdb_server_list" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="">
+        <type xsi:type="pogoDsl:VoidType"/>
+      </argin>
+      <argout description="List of host:port with one element for each database server">
+        <type xsi:type="pogoDsl:StringArrayType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetAttributeAlias2" description="Get the attribute alias from the attribute name.&#xA;Returns one empty string if nothing found in database" execMethod="db_get_attribute_alias2" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="The attribute name (dev_name/att_name)">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="The attribute alias name (or empty string)">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <commands name="DbGetAliasAttribute" description="Get the attribute name from the given alias.&#xA;If the given alias is not found in database, returns an empty string" execMethod="db_get_alias_attribute" displayLevel="OPERATOR" polledPeriod="0">
+      <argin description="The attribute alias">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argin>
+      <argout description="The attribute name (dev_name/att_name)">
+        <type xsi:type="pogoDsl:StringType"/>
+      </argout>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </commands>
+    <attributes name="StoredProcedureRelease" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="0" maxY="0">
+      <dataType xsi:type="pogoDsl:StringType"/>
+      <changeEvent fire="false" libCheckCriteria="false"/>
+      <archiveEvent fire="false" libCheckCriteria="false"/>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+      <properties description="" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
+    </attributes>
+    <attributes name="Timing_average" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="64" maxY="0">
+      <dataType xsi:type="pogoDsl:DoubleType"/>
+      <changeEvent fire="false" libCheckCriteria="false"/>
+      <archiveEvent fire="false" libCheckCriteria="false"/>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+      <properties description="" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
+    </attributes>
+    <attributes name="Timing_minimum" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="64" maxY="0">
+      <dataType xsi:type="pogoDsl:DoubleType"/>
+      <changeEvent fire="false" libCheckCriteria="false"/>
+      <archiveEvent fire="false" libCheckCriteria="false"/>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+      <properties description="" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
+    </attributes>
+    <attributes name="Timing_maximum" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="64" maxY="0">
+      <dataType xsi:type="pogoDsl:DoubleType"/>
+      <changeEvent fire="false" libCheckCriteria="false"/>
+      <archiveEvent fire="false" libCheckCriteria="false"/>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+      <properties description="" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
+    </attributes>
+    <attributes name="Timing_calls" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="64" maxY="0">
+      <dataType xsi:type="pogoDsl:DoubleType"/>
+      <changeEvent fire="false" libCheckCriteria="false"/>
+      <archiveEvent fire="false" libCheckCriteria="false"/>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+      <properties description="" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
+    </attributes>
+    <attributes name="Timing_index" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="64" maxY="0">
+      <dataType xsi:type="pogoDsl:StringType"/>
+      <changeEvent fire="false" libCheckCriteria="false"/>
+      <archiveEvent fire="false" libCheckCriteria="false"/>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+      <properties description="" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
+    </attributes>
+    <attributes name="Timing_info" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="64" maxY="0">
+      <dataType xsi:type="pogoDsl:StringType"/>
+      <changeEvent fire="false" libCheckCriteria="false"/>
+      <archiveEvent fire="false" libCheckCriteria="false"/>
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+      <properties description="" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
+    </attributes>
+    <preferences docHome="./doc_html" makefileHome="/home/tcoutinho/local-tango8/share/pogo/preferences"/>
+    <additionalFiles name="DataBaseUtils" path="/mntdirect/_segfs/tango/cppserver/dbase/DataBaseUtils.cpp"/>
+    <additionalFiles name="update_starter" path="/mntdirect/_segfs/tango/cppserver/dbase/update_starter.cpp"/>
+  </classes>
+</pogoDsl:PogoSystem>
diff --git a/PyTango/databaseds/DataBaseds b/PyTango/databaseds/DataBaseds
new file mode 100755
index 0000000..2f8cf3c
--- /dev/null
+++ b/PyTango/databaseds/DataBaseds
@@ -0,0 +1,9 @@
+#!/usr/bin/env python
+
+import database
+
+def main():
+    database.main()
+    
+if __name__ == '__main__':
+    main()
diff --git a/PyTango/databaseds/create_db.sql b/PyTango/databaseds/create_db.sql
new file mode 100644
index 0000000..34f6703
--- /dev/null
+++ b/PyTango/databaseds/create_db.sql
@@ -0,0 +1,124 @@
+#
+# Create all database tables
+#
+
+source create_db_tables.sql
+
+#
+# Init the history identifiers
+#
+
+INSERT INTO device_history_id VALUES (0);
+INSERT INTO device_attribute_history_id VALUES (0);
+INSERT INTO class_history_id VALUES (0);
+INSERT INTO class_attribute_history_id VALUES (0);
+INSERT INTO object_history_id VALUES (0);
+
+#
+# Create entry for database device server in device table
+#
+
+INSERT INTO device VALUES ('sys/database/2',NULL,'sys','database','2','nada','nada','nada','DataBaseds/2','nada','DataBase','nada','nada','nada','nada');
+INSERT INTO device VALUES ('dserver/DataBaseds/2',NULL,'dserver','DataBaseds','2','nada','nada','nada','DataBaseds/2','nada','DServer','nada','nada','nada','nada');
+
+#
+# Create entry for test device server in device table
+#
+
+INSERT INTO device VALUES ('sys/tg_test/1',NULL,'sys','tg_test','1','nada','nada','nada','TangoTest/test','nada','TangoTest','nada','nada','nada','nada');
+INSERT INTO device VALUES ('dserver/TangoTest/test',NULL,'dserver','TangoTest','test','nada','nada','nada','TangoTest/test','nada','DServer','nada','nada','nada','nada');
+
+#
+# Create entry for Tango Control Access in device table
+#
+
+INSERT INTO device VALUES ('sys/access_control/1',NULL,'sys','access_control','1','nada','nada','nada','TangoAccessControl/1','nada','TangoAccessControl','nada','nada','nada','nada');
+INSERT INTO device VALUES ('dserver/TangoAccessControl/1',NULL,'dserver','TangoAccessControl','1','nada','nada','nada','TangoAccessControl/1','nada','DServer','nada','nada','nada','nada');
+INSERT INTO server VALUES ('tangoaccesscontrol/1','',0,0);
+
+#
+# Create default user access
+#
+
+INSERT INTO access_address VALUES ('*','*.*.*.*','FF.FF.FF.FF',20060824131221,00000000000000);
+INSERT INTO access_device VALUES ('*','*/*/*','write',20060824131221,00000000000000);
+
+#
+# Create entries in the property_class tables for controlled access service
+#
+
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',1,'DbGetServerInfo','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',2,'DbGetServerNameList','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',3,'DbGetInstanceNameList','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',4,'DbGetDeviceServerClassList','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',5,'DbGetDeviceList','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',6,'DbGetDeviceDomainList','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',7,'DbGetDeviceFamilyList','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',8,'DbGetDeviceMemberList','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',9,'DbGetClassList','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',10,'DbGetDeviceAliasList','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',11,'DbGetObjectList','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',12,'DbGetPropertyList','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',13,'DbGetProperty','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',14,'DbGetClassPropertyList','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',15,'DbGetClassProperty','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',16,'DbGetDevicePropertyList','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',17,'DbGetDeviceProperty','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',18,'DbGetClassAttributeList','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',19,'DbGetDeviceAttributeProperty','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',20,'DbGetDeviceAttributeProperty2','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',21,'DbGetLoggingLevel','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',22,'DbGetAliasDevice','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',23,'DbGetClassForDevice','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',24,'DbGetClassInheritanceForDevice','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',25,'DbGetDataForServerCache','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',26,'DbInfo','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',27,'DbGetClassAttributeProperty','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',28,'DbGetClassAttributeProperty2','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',29,'DbMysqlSelect','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',30,'DbGetDeviceInfo','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',31,'DbGetDeviceWideList','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',32,'DbImportEvent','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',33,'DbGetDeviceAlias','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('Database','AllowedAccessCmd',34,'DbGetCSDbServerList','1980-01-01 ','1980-01-01 ',NULL);
+
+#
+#
+#
+
+INSERT INTO property_class VALUES('DServer','AllowedAccessCmd',1,'QueryClass','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('DServer','AllowedAccessCmd',2,'QueryDevice','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('DServer','AllowedAccessCmd',3,'EventSubscriptionChange','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('DServer','AllowedAccessCmd',4,'DevPollStatus','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('DServer','AllowedAccessCmd',5,'GetLoggingLevel','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('DServer','AllowedAccessCmd',6,'GetLoggingTarget','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('DServer','AllowedAccessCmd',7,'QueryWizardDevProperty','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('DServer','AllowedAccessCmd',8,'QueryWizardClassProperty','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES('DServer','AllowedAccessCmd',9,'QuerySubDevice','1980-01-01 ','1980-01-01 ',NULL);
+
+#
+#
+#
+
+INSERT INTO property_class VALUES ('Starter','AllowedAccessCmd',1,'DevReadLog','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES ('Starter','AllowedAccessCmd',2,'DevStart','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES ('Starter','AllowedAccessCmd',3,'DevGetRunningServers','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES ('Starter','AllowedAccessCmd',4,'DevGetStopServers','1980-01-01 ','1980-01-01 ',NULL);
+
+#
+#
+#
+
+INSERT INTO property_class VALUES ('TangoAccessControl','AllowedAccessCmd',1,'GetUsers','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES ('TangoAccessControl','AllowedAccessCmd',2,'GetAddressByUser','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES ('TangoAccessControl','AllowedAccessCmd',3,'GetDeviceByUser','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES ('TangoAccessControl','AllowedAccessCmd',4,'GetAccess','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES ('TangoAccessControl','AllowedAccessCmd',5,'GetAllowedCommands','1980-01-01 ','1980-01-01 ',NULL);
+INSERT INTO property_class VALUES ('TangoAccessControl','AllowedAccessCmd',6,'GetAllowedCommandClassList','1980-01-01 ','1980-01-01 ',NULL);
+
+#
+# Load the stored procedures
+#
+
+source stored_proc.sql
+
diff --git a/PyTango/databaseds/create_db_tables.sql b/PyTango/databaseds/create_db_tables.sql
new file mode 100644
index 0000000..1b9810c
--- /dev/null
+++ b/PyTango/databaseds/create_db_tables.sql
@@ -0,0 +1,230 @@
+CREATE TABLE IF NOT EXISTS access_address (
+  user varchar(255) default NULL,
+  address varchar(255) default NULL,
+  netmask varchar(255) default 'FF.FF.FF.FF',
+  updated timestamp NOT NULL,
+  accessed timestamp NOT NULL default '00000000000000'
+) ;
+
+CREATE TABLE IF NOT EXISTS access_device (
+  user varchar(255) default NULL,
+  device varchar(255) default NULL,
+  rights varchar(255) default NULL,
+  updated timestamp NOT NULL,
+  accessed timestamp NOT NULL default '00000000000000'
+) ;
+
+CREATE TABLE IF NOT EXISTS attribute_alias (
+  alias varchar(255) NOT NULL default '',
+  name varchar(255) NOT NULL default '',
+  device varchar(255) NOT NULL default '',
+  attribute varchar(255) NOT NULL default '',
+  updated timestamp NOT NULL,
+  accessed timestamp NOT NULL,
+  comment text
+) ;
+
+CREATE TABLE IF NOT EXISTS attribute_class (
+  class varchar(255) NOT NULL default '',
+  name varchar(255) NOT NULL default '',
+  updated timestamp NOT NULL,
+  accessed timestamp NOT NULL,
+  comment text
+) ;
+
+
+CREATE TABLE IF NOT EXISTS device (
+  name varchar(255) NOT NULL default 'nada',
+  alias varchar(255) default NULL,
+  domain varchar(85) NOT NULL default 'nada',
+  family varchar(85) NOT NULL default 'nada',
+  member varchar(85) NOT NULL default 'nada',
+  exported int(11) default 0,
+  ior text,
+  host varchar(255) NOT NULL default 'nada',
+  server varchar(255) NOT NULL default 'nada',
+  pid int(11) default 0,
+  class varchar(255) NOT NULL default 'nada',
+  version varchar(8) NOT NULL default 'nada',
+  started datetime default 0,
+  stopped datetime default 0,
+  comment text
+) ;
+
+#
+# Table structure for table 'event'
+#
+
+CREATE TABLE IF NOT EXISTS event (
+  name varchar(255) default NULL,
+  exported int(11) default NULL,
+  ior text,
+  host varchar(255) default NULL,
+  server varchar(255) default NULL,
+  pid int(11) default NULL,
+  version varchar(8) default NULL,
+  started datetime default NULL,
+  stopped datetime default NULL
+) ;
+
+#
+# Table structure for table 'property'
+#
+
+CREATE TABLE IF NOT EXISTS property (
+  object varchar(255) default NULL,
+  name varchar(255) default NULL,
+  count int(11) default NULL,
+  value text default NULL,
+  updated timestamp NOT NULL,
+  accessed timestamp NOT NULL,
+  comment text
+) ;
+
+#
+# Table structure for table 'property_attribute_class'
+#
+
+CREATE TABLE IF NOT EXISTS property_attribute_class (
+  class varchar(255) NOT NULL default '',
+  attribute varchar(255) NOT NULL default '',
+  name varchar(255) NOT NULL default '',
+  count int(11) NOT NULL default '0',
+  value text default NULL,
+  updated timestamp NOT NULL,
+  accessed timestamp NOT NULL,
+  comment text
+) ;
+
+#
+# Table structure for table 'property_attribute_device'
+#
+
+CREATE TABLE IF NOT EXISTS property_attribute_device (
+  device varchar(255) NOT NULL default '',
+  attribute varchar(255) NOT NULL default '',
+  name varchar(255) NOT NULL default '',
+  count int(11) NOT NULL default '0',
+  value text default NULL,
+  updated timestamp NOT NULL,
+  accessed timestamp NOT NULL,
+  comment text
+) ;
+
+#
+# Table structure for table 'property_class'
+#
+
+CREATE TABLE IF NOT EXISTS property_class (
+  class varchar(255) NOT NULL default '',
+  name varchar(255) NOT NULL default '',
+  count int(11) NOT NULL default '0',
+  value text default NULL,
+  updated timestamp NOT NULL,
+  accessed timestamp NOT NULL,
+  comment text
+) ;
+
+#
+# Table structure for table 'property_device'
+#
+
+CREATE TABLE IF NOT EXISTS property_device (
+  device varchar(255) NOT NULL default '',
+  name varchar(255) NOT NULL default '',
+  domain varchar(255) NOT NULL default '',
+  family varchar(255) NOT NULL default '',
+  member varchar(255) NOT NULL default '',  
+  count int(11) NOT NULL default '0',
+  value text default NULL,
+  updated timestamp NOT NULL,
+  accessed timestamp NOT NULL,
+  comment text
+) ;
+
+#
+# Table structure for table 'server'
+#
+
+CREATE TABLE IF NOT EXISTS server (
+  name varchar(255) NOT NULL default '',
+  host varchar(255) NOT NULL default '',
+  mode int(11) default '0',
+  level int(11) default '0'
+) ;
+
+#
+# Tables for history identifiers
+#
+
+CREATE TABLE IF NOT EXISTS device_history_id (
+  id int(11) NOT NULL default '0'
+) ;
+
+CREATE TABLE IF NOT EXISTS device_attribute_history_id (
+  id int(11) NOT NULL default '0'
+) ;
+
+CREATE TABLE IF NOT EXISTS class_history_id (
+  id int(11) NOT NULL default '0'
+) ;
+
+CREATE TABLE IF NOT EXISTS class_attribute_history_id (
+  id int(11) NOT NULL default '0'
+) ;
+
+CREATE TABLE IF NOT EXISTS object_history_id (
+  id int(11) NOT NULL default '0'
+) ;
+
+#
+# Tables for history
+#
+
+CREATE TABLE IF NOT EXISTS property_hist (
+  id int(10) NOT NULL default '0',
+  date timestamp NOT NULL,
+  object varchar(255) NOT NULL default '',
+  name varchar(255) NOT NULL default '',
+  count int(11) NOT NULL default '0',
+  value text
+) ;
+
+CREATE TABLE IF NOT EXISTS property_device_hist (
+  id int(10) NOT NULL default '0',
+  date timestamp NOT NULL,
+  device varchar(255) NOT NULL default '',
+  name varchar(255) NOT NULL default '',
+  count int(11) NOT NULL default '0',
+  value text
+) ;
+
+CREATE TABLE IF NOT EXISTS property_class_hist (
+  id int(10) NOT NULL default '0',
+  date timestamp NOT NULL,
+  class varchar(255) NOT NULL default '',
+  name varchar(255) NOT NULL default '',
+  count int(11) NOT NULL default '0',
+  value text
+) ;
+
+CREATE TABLE IF NOT EXISTS property_attribute_class_hist (
+  id int(10) NOT NULL default '0',
+  date timestamp NOT NULL,
+  class varchar(255) NOT NULL default '',
+  attribute varchar(255) NOT NULL default '',
+  name varchar(255) NOT NULL default '',
+  count int(11) NOT NULL default '0',
+  value text
+) ;
+
+CREATE TABLE IF NOT EXISTS property_attribute_device_hist (
+  id int(10) NOT NULL default '0',
+  date timestamp NOT NULL,
+  device varchar(255) NOT NULL default '',
+  attribute varchar(255) NOT NULL default '',
+  name varchar(255) NOT NULL default '',
+  count int(11) NOT NULL default '0',
+  value text
+) ;
+
diff --git a/PyTango/databaseds/db_access.py b/PyTango/databaseds/db_access.py
new file mode 100644
index 0000000..49b28a2
--- /dev/null
+++ b/PyTango/databaseds/db_access.py
@@ -0,0 +1,437 @@
+from __future__ import print_function
+
+import os
+import functools
+
+import PyTango
+
+th_exc = PyTango.Except.throw_exception
+
+from db_errors import *
+
+def get_create_db_statements():
+    statements = []
+    with open("create_db_tables.sql.in") as f:
+        lines = f.readlines()
+    # strip comments
+    lines = ( line for line in lines if not line.startswith('#') )
+    lines = ( line for line in lines if not line.lower().strip().startswith('key') )
+    lines = ( line for line in lines if not line.lower().strip().startswith('key') )
+    lines = "".join(lines)
+    lines = lines.replace("ENGINE=MyISAM","")
+    statements += lines.split(";")
+        
+    with open("create_db.sql.in") as f:
+        lines = f.readlines()
+    # strip comments
+    lines = ( line for line in lines if not line.lower().startswith('#') )
+    lines = ( line for line in lines if not line.lower().startswith('create database') )
+    lines = ( line for line in lines if not line.lower().startswith('use') )
+    lines = ( line for line in lines if not line.lower().startswith('source') )
+    lines = "".join(lines)
+    statements += lines.split(";")
+    
+    return statements
+
+def replace_wildcard(text):
+    # escape '%' with '\'
+    text = text.replace("%", "\\%")
+    # escape '_' with '\'
+    text = text.replace("_", "\\_")
+    # escape '"' with '\'
+    text = text.replace('"', '\\"')
+    # escape ''' with '\'
+    text = text.replace("'", "\\'")
+    # replace '*' with '%'
+    text = text.replace("*", "%")
+    return text
+    
+def use_cursor(f):
+    @functools.wraps(f)
+    def wrap(*args, **kwargs):
+        self = args[0]
+        has_cursor = 'cursor' in kwargs
+        cursor = kwargs.pop('cursor', None)
+        if not has_cursor:
+            cursor = self.get_cursor()
+        self.cursor = cursor
+        try:
+            ret = f(*args, **kwargs)
+            if not has_cursor:
+                cursor.connection.commit()
+            return ret
+        finally:
+            if not has_cursor:
+                cursor.close()
+                del self.cursor
+    return wrap
+    
+class Tango_dbapi2(object):
+    
+    DB_API_NAME = 'sqlite3'
+    
+    def __init__(self, db_name="tango_database.db", history_depth=10, fire_to_starter=True):
+        self._db_api = None
+        self._db_conn = None
+        self.db_name = db_name
+        self.history_depth = history_depth;
+        self.fire_to_starter = fire_to_starter
+        self.initialize()
+
+    def close_db(self):
+        if self._db_conn is not None:
+            self._db_conn.commit()
+            self._db_conn.close()
+        self._db_api = None
+        self._db_conn = None
+
+    def get_db_api(self):
+        if self._db_api is None:
+            self._db_api = __import__(self.DB_API_NAME)
+        return self._db_api
+    
+    @property
+    def db_api(self):
+        return self.get_db_api()
+    
+    @property    
+    def db_conn(self):
+        if self._db_conn is None:
+            self._db_conn = self.db_api.connect(self.db_name)
+        return self._db_conn
+
+    def get_cursor(self):
+        return self.db_conn.cursor()
+
+    def initialize(self):
+        if not os.path.isfile(self.db_name):
+            self.create_db()
+    
+    @use_cursor
+    def create_db(self):
+        print("Creating database...")
+        statements = get_create_db_statements()
+        cursor = self.cursor
+        for statement in statements:
+            cursor.execute(statement)
+    
+    @use_cursor
+    def get_id(self, name):
+        cursor = self.cursor
+        name += '"_history_id'
+        _id = cursor.execute('SELECT id FROM ?', (name,)).fetchone()[0] + 1
+        cursor.execute('UPDATE ? SET id=?', (name, _id))
+        return _id
+    
+    @use_cursor
+    def purge_att_property(self, table, field, obj, attr, name):
+        cursor = self.cursor
+        cursor.execute(\
+            'SELECT DISTINCT id FROM ? WHERE ? = ? AND name = ? AND ' \
+            'attribute = ? ORDER BY date', (table, field, obj, name, attr))
+        rows = cursor.fetchall()
+        to_del = len(rows) - self.history_depth
+        if to_del > 0:
+            for row in rows[:to_del]:
+                cursor.execute('DELETE FROM ? WHERE id=?', (table, row[0]))
+                
+    @use_cursor
+    def purge_property(self, table, field, obj, name):
+        cursor = self.cursor
+        cursor.execute(\
+            'SELECT DISTINCT id FROM ? WHERE ? = ? AND name = ? ' \
+            'ORDER BY date', (table, field, obj, name))
+        rows = cursor.fetchall()
+        to_del = len(rows) - self.history_depth
+        if to_del > 0:
+            for row in rows[:to_del]:
+                cursor.execute('DELETE FROM ? WHERE id=?', (table, row[0]))
+
+    @use_cursor
+    def get_device_host(self, name):
+        cursor = self.cursor
+        name = replace_wildcard(name)
+        cursor.execute('SELECT host FROM device WHERE name LIKE ?', (name,))
+        row = cursor.fetchone()
+        if row is None:
+            raise Exception("No host for device '" + name + "'")
+        else:
+            return row[0]
+
+    # TANGO API
+    
+    def get_stored_procedure_release(self):
+        return 'release 1.8'
+
+    @use_cursor
+    def add_device(self, server_name, dev_info, klass_name, alias=None):
+        dev_name, (domain, family, member) = dev_info
+        cursor = self.cursor
+        
+        # first delete the tuple (device,name) from the device table
+        cursor.execute('DELETE FROM device WHERE name LIKE ?', (dev_name,))
+        
+        # then insert the new value for this tuple
+        cursor.execute(\
+            'INSERT INTO device (name, alias, domain, family, member, exported, ' \
+            'ior, host, server, pid, class, version, started, stopped) ' \
+            'VALUES (?, ?, ?, ?, ?, 0, "nada", "nada", ?, 0, ?, "0", NULL, NULL)', 
+            (dev_name, alias, domain, family, member, server_name, klass_name))
+        
+        # Check if a DServer device entry for the process already exists
+        cursor.execute('SELECT name FROM device WHERE server LIKE ? AND class LIKE "DServer"', (server_name,))
+        if cursor.fetchone() is None:
+            dev_name = "dserver/" + server_name
+            domain, family, member = dev_name.split("/", 2)
+            cursor.execute(\
+            'INSERT INTO device (name, domain, family, member, exported, ior, ' \
+            'host, server, pid, class, version, started, stopped) ' \
+            'VALUES (?, ?, ?, ?, 0, "nada", "nada", ?, 0, "DServer", "0", NULL, NULL)', 
+            (dev_name, domain, family, member, server_name))
+
+    @use_cursor
+    def delete_attribute_alias(self, alias):
+        self.cursor.execute('DELETE FROM attribute_alias WHERE alias=?', (alias,))
+
+    @use_cursor
+    def delete_class_attribute(self, klass_name, attr_name):
+        self.cursor.execute(\
+            'DELETE FROM property_attribute_class WHERE class LIKE ? AND ' \
+            'attribute LIKE ?', (klass_name, attr_name))
+        
+    @use_cursor
+    def delete_class_attribute_property(self, klass_name, attr_name, prop_name):
+        cursor = self.cursor
+        
+        # Is there something to delete ?
+        cursor.execute(\
+            'SELECT count(*) FROM property_attribute_class WHERE class = ? ' \
+            'AND attribute = ? AND name = ?', (klass_name, attr_name, prop_name))
+        if cursor.fetchone()[0] > 0:
+            # then delete property from the property_attribute_class table
+            cursor.execute(\
+                'DELETE FROM property_attribute_class WHERE class = ? AND ' \
+                'attribute = ? and name = ?', (klass_name, attr_name, prop_name))
+            # mark this property as deleted    
+            hist_id = self.get_id('class_attibute', cursor=cursor)
+            cursor.execute(\
+                'INSERT INTO property_attribute_class_hist (class, attribute, ' \
+                'name, id, count, value) VALUES ' \
+                '(?, ?, ?, ?, "0", "DELETED")',
+                (klass_name, attr_name, prop_name, hist_id))
+            self.purge_att_property("property_attribute_class_hist", "class",
+                                    klass_name, attr_name, prop_name, cursor=cursor)
+    
+    @use_cursor
+    def delete_class_property(self, klass_name, prop_name):
+        cursor = self.cursor
+
+        prop_name = replace_wildcard(prop_name)
+        # Is there something to delete ?
+        cursor.execute(\
+            'SELECT DISTINCT name FROM property_class WHERE class=? AND ' \
+            'name LIKE ?', (klass_name, prop_name))
+        for row in cursor.fetchall():
+            # delete the tuple (device,name,count) from the property table
+            name = row[0]
+            cursor.execute(\
+                'DELETE FROM property_class WHERE class=? AND name=?',
+                (klass_name, name))
+            # Mark this property as deleted
+            hist_id = self.get_id("class", cursor=cursor)
+            cursor.execute(\
+                'INSERT INTO property_class_hist (class, name, id, count, value) ' \
+                'VALUES (?, ?, ?, "0", "DELETED")',
+                (klass_name, name, hist_id))
+            self.purge_property("property_class_hist", "class", klass_name, 
+                                name, cursor=cursor)
+            
+    @use_cursor
+    def delete_device(self, dev_name):
+        cursor = self.cursor
+        dev_name = replace_wildcard(dev_name)
+        
+        # delete the device from the device table
+        cursor.execute('DELETE FROM device WHERE name LIKE ?', (dev_name,))
+        
+        # delete device from the property_device table
+        cursor.execute('DELETE FROM property_device WHERE device LIKE ?', (dev_name,))
+        
+        # delete device from the property_attribute_device table
+        cursor.execute('DELETE FROM property_attribute_device WHERE device LIKE ?', (dev_name,))
+
+    @use_cursor
+    def delete_device_alias(self, dev_alias):
+        self.cursor.execute('UPDATE device SET alias=NULL WHERE alias=?', (dev_alias,))
+    
+    @use_cursor
+    def delete_device_attribute(self, dev_name, attr_name):
+        dev_name = replace_wildcard(dev_name)
+        self.cursor.execute(\
+            'DELETE FROM property_attribute_device WHERE device LIKE ? AND ' \
+            'attribute LIKE ?', (dev_name, attr_name))
+    
+    @use_cursor
+    def delete_device_attribute_property(self, dev_name, attr_name, prop_name):
+        cursor = self.cursor
+        # Is there something to delete ?
+        cursor.execute(\
+            'SELECT count(*) FROM property_attribute_device WHERE device = ?' \
+            'AND attribute = ? AND name = ?', (dev_name, attr_name, prop_name))
+        if cursor.fetchone()[0] > 0:
+            # delete property from the property_attribute_device table
+            cursor.execute(\
+                'DELETE FROM property_attribute_device WHERE device = ? AND '
+                'attribute = ? AND name = ?', (dev_name, attr_name, prop_name))
+            # Mark this property as deleted	
+            hist_id = self.get_id("device_attribute", cursor=cursor)
+            cursor.execute(\
+                'INSERT INTO property_attribute_device_hist ' \
+                '(device, attribute, name, id, count, value) VALUES ' \
+                '(?, ?, ?, ?, "0", "DELETED")', (dev_name, attr_name, prop_name, hist_id))
+            self.purge_att_property("property_attribute_device_hist", "device",
+                                    dev_name, attr_name, prop_name, cursor=cursor)
+        
+    @use_cursor
+    def delete_device_property(self, dev_name, prop_name):
+        cursor = self.cursor
+        prop_name = replace_wildcard(prop_name)
+        
+        # Is there something to delete ?
+        cursor.execute(\
+            'SELECT DISTINCT name FROM property_device WHERE device=? AND ' \
+            'name LIKE ?', (dev_name, prop_name))
+        for row in cursor.fetchall():
+            # delete the tuple (device,name,count) from the property table
+            cursor.execute(\
+                'DELETE FROM property_device WHERE device=? AND name LIKE ?',
+                (dev_name, prop_name))
+            # Mark this property as deleted
+            hist_id = self.get_id("device", cursor=cursor)
+            cursor.execute(\
+                'INSERT INTO property_device_hist (device, id, name, count, value) ' \
+                'VALUES (?, ?, ?, "0", "DELETED")', (dev_name, hist_id, row[0]))
+            self.purge_property("property_device_hist", "device", dev_name, row[0])
+
+    @use_cursor
+    def delete_property(self, obj_name, prop_name):
+        cursor = self.cursor
+        prop_name = replace_wildcard(prop_name)
+        
+        # Is there something to delete ?
+        cursor.execute(\
+            'SELECT DISTINCT name FROM property WHERE object=? AND ' \
+            'name LIKE ?', (obj_name, prop_name))
+        for row in cursor.fetchall():
+            # delete the tuple (object,name,count) from the property table
+            cursor.execute(\
+                'DELETE FROM property_device WHERE device=? AND name LIKE ?',
+                (obj_name, prop_name))
+            # Mark this property as deleted
+            hist_id = self.get_id("object", cursor=cursor)
+            cursor.execute(\
+                'INSERT INTO property_hist (object, name, id, count, value) ' \
+                'VALUES (?, ?, ?, "0", "DELETED")', (obj_name, row[0], hist_id))
+            self.purge_property("property_hist", "object", obj_name, row[0])
+          
+    @use_cursor
+    def delete_server(self, server_instance):
+        cursor = self.cursor
+        server_instance = replace_wildcard(server_instance)
+        
+        previous_host = None
+        # get host where running
+        if self.fire_to_starter:
+            adm_dev_name = "dserver/" + server_instance
+            previous_host = self.get_device_host(adm_dev_name)
+
+        # then delete the device from the device table
+        cursor.execute('DELETE FROM device WHERE server LIKE ?', (server_instance,))
+        
+        # Update host's starter to update controlled servers list
+        if self.fire_to_starter and previous_host:
+            # TODO send to starter
+            pass
+
+    @use_cursor
+    def delete_server_info(self, server_instance):
+        self.cursor.execute('DELETE FROM server WHERE name=?', (server_instance,))
+
+    @use_cursor
+    def export_device(self, dev_name, IOR, host, pid, version):
+        cursor = self.cursor
+        do_fire = False
+        previous_host = None
+        if self.fire_to_starter:
+            # TODO send to starter
+            pass
+        cursor.execute('SELECT server FROM device WHERE name LIKE ?', (dev_name,))
+        row = cursor.fetchone()
+        if row is None:
+            th_exc(DB_DeviceNotDefined,
+                   "device " + dev_name + " not defined in the database !",
+                   "DataBase::ExportDevice()")
+        server = row[0]
+        
+        # update the new value for this tuple
+        cursor.execute(\
+            'UPDATE device SET exported=1, ior=?, host=?, pid=?, version=?, ' \
+            'started=datetime("now") WHERE name LIKE ?',
+            (IOR, host, pid, version, dev_name))
+        
+        # update host name in server table
+        cursor.execute('UPDATE server SET host=?, WHERE name LIKE ?', (host, server))
+        
+        if do_fire:
+            # TODO send to starter
+            pass
+        
+    @use_cursor
+    def export_event(self, event, IOR, host, pid, version):      
+        cursor = self.cursor
+        cursor.execute(\
+            'INSERT event (name,exported,ior,host,server,pid,version,started) ' \
+            'VALUES (?, 1, ?, ?, ?, ?, ?, datetime("now")',
+            (event, IOR, host, event, pid, version))
+    
+    @use_cursor
+    def get_alias_device(self, dev_alias):
+        cursor = self.cursor
+        cursor.execute('SELECT name FROM device WHERE alias LIKE ?', (dev_alias,))
+        row = cursor.fetchone()
+        if row is None:
+            th_exc(DB_DeviceNotDefined,
+                   "No device found for alias '" + dev_alias + "'",
+                   "DataBase::GetAliasDevice()")
+        return row[0]   
+    
+    @use_cursor
+    def get_attribute_alias(self, attr_alias):
+        cursor = self.cursor
+        cursor.execute('SELECT name from attribute_alias WHERE alias LIKE ?', (attr_alias,))
+        row = cursor.fetchone()
+        if row is None:
+            th_exc(DB_SQLError,
+                   "No attribute found for alias '" + attr_alias + "'",
+                   "DataBase::GetAttributeAlias()")        
+        return row[0]
+    
+    @use_cursor
+    def get_attribute_alias_list(self, attr_alias):
+        cursor = self.cursor
+        cursor.execute('SELECT DISTINCT alias FROM attribute_alias WHERE alias LIKE ? ORDER BY attribute', (attr_alias,))
+        return [ row[0] for row in cursor.fetchall() ]
+    
+        
+class Tango_sqlite3(Tango_dbapi2):
+    
+    DB_API_NAME = 'sqlite3'
+    
+
+def main():
+    db = Tango_sqlite3()
+    db.add_device("MyServer/my1", ("a/b/c", ("a","b","c")), "MyClass")
+    db.close_db()
+    
+if __name__ == "__main__":
+    main()
diff --git a/PyTango/databaseds/db_errors.py b/PyTango/databaseds/db_errors.py
new file mode 100644
index 0000000..a16c225
--- /dev/null
+++ b/PyTango/databaseds/db_errors.py
@@ -0,0 +1,8 @@
+DB_SQLError = "DB_SQLError"
+DB_IncorrectArguments = "DB_IncorrectArguments"
+DB_IncorrectDeviceName = "DB_IncorrectDeviceName"
+DB_IncorrectServerName = "DB_IncorrectServerName"
+DB_DeviceNotDefined = "DB_DeviceNotDefined"
+DB_AliasNotDefined = "DB_AliasNotDefined"
+DB_NoFreeMySQLConnection = "DB_NoFreeMySQLConnection"
+DB_MySQLLibNotThreadSafe = "DB_MySQLLibNotThreadSafe"
diff --git a/PyTango/databaseds/mysql2sqlite.sh b/PyTango/databaseds/mysql2sqlite.sh
new file mode 100755
index 0000000..1e6e856
--- /dev/null
+++ b/PyTango/databaseds/mysql2sqlite.sh
@@ -0,0 +1,101 @@
+#!/bin/sh
+
+# Converts a mysqldump file into a Sqlite 3 compatible file. It also extracts the MySQL `KEY xxxxx` from the
+# CREATE block and create them in separate commands _after_ all the INSERTs.
+
+# Awk is chosen because it's fast and portable. You can use gawk, original awk or even the lightning fast mawk.
+# The mysqldump file is traversed only once.
+
+# Usage: $ ./mysql2sqlite mysqldump-opts db-name | sqlite3 database.sqlite
+# Example: $ ./mysql2sqlite --no-data -u root -pMySecretPassWord myDbase | sqlite3 database.sqlite
+
+# Thanks to and @artemyk and @gkuenning for their nice tweaks.
+
+mysqldump  --compatible=ansi --skip-extended-insert --compact  "$@" | \
+
+awk '
+
+BEGIN {
+	FS=",$"
+	print "PRAGMA synchronous = OFF;"
+	print "PRAGMA journal_mode = MEMORY;"
+	print "BEGIN TRANSACTION;"
+}
+
+# CREATE TRIGGER statements have funny commenting.  Remember we are in trigger.
+/^\/\*.*CREATE.*TRIGGER/ {
+	gsub( /^.*TRIGGER/, "CREATE TRIGGER" )
+	print
+	inTrigger = 1
+	next
+}
+
+# The end of CREATE TRIGGER has a stray comment terminator
+/END \*\/;;/ { gsub( /\*\//, "" ); print; inTrigger = 0; next }
+
+# The rest of triggers just get passed through
+inTrigger != 0 { print; next }
+
+# Skip other comments
+/^\/\*/ { next }
+
+# Print all `INSERT` lines. The single quotes are protected by another single quote.
+/INSERT/ {
+	gsub( /\\\047/, "\047\047" )
+	gsub(/\\n/, "\n")
+	gsub(/\\r/, "\r")
+	gsub(/\\"/, "\"")
+	gsub(/\\\\/, "\\")
+	gsub(/\\\032/, "\032")
+	print
+	next
+}
+
+# Print the `CREATE` line as is and capture the table name.
+/^CREATE/ {
+	print
+	if ( match( $0, /\"[^\"]+/ ) ) tableName = substr( $0, RSTART+1, RLENGTH-1 ) 
+}
+
+# Replace `FULLTEXT KEY` or any other `XXXXX KEY` except PRIMARY by `KEY`
+/^  [^"]+KEY/ && !/^  PRIMARY KEY/ { gsub( /.+KEY/, "  KEY" ) }
+
+# Get rid of field lengths in KEY lines
+/ KEY/ { gsub(/\([0-9]+\)/, "") }
+
+# Print all fields definition lines except the `KEY` lines.
+/^  / && !/^(  KEY|\);)/ {
+	gsub( /AUTO_INCREMENT|auto_increment/, "" )
+	gsub( /(CHARACTER SET|character set) [^ ]+ /, "" )
+	gsub( /DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP|default current_timestamp on update current_timestamp/, "" )
+	gsub( /(COLLATE|collate) [^ ]+ /, "" )
+	gsub(/(ENUM|enum)[^)]+\)/, "text ")
+	gsub(/(SET|set)\([^)]+\)/, "text ")
+	gsub(/UNSIGNED|unsigned/, "")
+	gsub(/" [^ ]*(INT|int)[^ ]*/, "\" integer")
+	if (prev) print prev ","
+	prev = $1
+}
+
+# `KEY` lines are extracted from the `CREATE` block and stored in array for later print 
+# in a separate `CREATE KEY` command. The index name is prefixed by the table name to 
+# avoid a sqlite error for duplicate index name.
+/^(  KEY|\);)/ {
+	if (prev) print prev
+	prev=""
+	if ($0 == ");"){
+		print
+	} else {
+		if ( match( $0, /\"[^"]+/ ) ) indexName = substr( $0, RSTART+1, RLENGTH-1 ) 
+		if ( match( $0, /\([^()]+/ ) ) indexKey = substr( $0, RSTART+1, RLENGTH-1 ) 
+		key[tableName]=key[tableName] "CREATE INDEX \"" tableName "_" indexName "\" ON \"" tableName "\" (" indexKey ");\n"
+	}
+}
+
+# Print all `KEY` creation lines.
+END {
+	for (table in key) printf key[table]
+	print "END TRANSACTION;"
+}
+'
+exit 0
diff --git a/PyTango/release.py b/PyTango/release.py
index c7bc17e..45ed4bd 100644
--- a/PyTango/release.py
+++ b/PyTango/release.py
@@ -52,7 +52,7 @@ class Release:
             - keywords : (seq<str>) list of keywords
             - license : (str) the license"""
     name = 'PyTango'
-    version_info = (8, 0, 2, 'final', 0)
+    version_info = (8, 0, 3, 'dev', 0)
     version = '.'.join(map(str, version_info[:3]))
     version_long = version + ''.join(map(str, version_info[3:]))
     version_description = 'This version implements the C++ Tango 8.0 API.'
@@ -63,7 +63,7 @@ class Release:
     license = 'LGPL'
     authors = { 'Coutinho' : ('Tiago Coutinho' , 'tcoutinho at cells.es') }
     author_lines = "\n".join([ "%s <%s>" % x for x in authors.values()])
-    url = 'http://www.tango-controls.org/static/PyTango/latest/doc/html/'
+    url = 'http://www.tango-controls.org/static/PyTango/'
     download_url = 'http://pypi.python.org/packages/source/P/PyTango'
     platform = ['Linux', 'Windows XP/Vista/7']
     keywords = ['Tango', 'CORBA', 'binding']

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/pytango.git



More information about the debian-science-commits mailing list