[pytango] 449/483: New server style

Sandor Bodo-Merle sbodomerle-guest at moszumanska.debian.org
Thu Sep 28 19:15:11 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 d4ce0128dc099f1c8a6abfbb82322dab87e9743f
Author: coutinho <coutinho at esrf.fr>
Date:   Thu Mar 26 17:34:35 2015 +0100

    New server style
    
    Add information to the help parser logging level
---
 src/boost/python/databaseds/database.py | 3666 +++++++++++--------------------
 1 file changed, 1281 insertions(+), 2385 deletions(-)

diff --git a/src/boost/python/databaseds/database.py b/src/boost/python/databaseds/database.py
index a663e64..d67a715 100644
--- a/src/boost/python/databaseds/database.py
+++ b/src/boost/python/databaseds/database.py
@@ -1,44 +1,12 @@
 #!/usr/bin/env python
-# -*- coding:utf-8 -*-
-
-
-##############################################################################
-## license :
-##============================================================================
-##
-## File :        DataBase.py
-##
-## Project :     TANGO
-##
-## $Author :      controls$
-##
-## $Revision :    $
-##
-## $Date :        $
-##
-## $HeadUrl :     $
-##============================================================================
-##            This file is generated by POGO
-##    (Program Obviously used to Generate tango Object)
-##
-##        (c) - Software Engineering Group - ESRF
-##############################################################################
+# -*- coding: utf-8 -*-
 
 """This class manage the TANGO database."""
 
-__all__ = ["DataBase", "DataBaseClass", "main"]
-
-__docformat__ = 'restructuredtext'
-
-import PyTango
 import sys
-# Add additional import
-
 import time
-
-#----- PROTECTED REGION ID(DataBase.additionnal_import) ENABLED START -----#
-
 import logging
+import functools
 
 try:
     import argparse
@@ -46,9 +14,23 @@ except ImportError:
     argparse = None
     from optparse import OptionParser
 
+import PyTango
+from PyTango import AttrWriteType, GreenMode
+from PyTango.server import Device, DeviceMeta
+from PyTango.server import attribute, command
+from PyTango.server import class_property
+from PyTango.server import device_property
+from PyTango.server import run
+
 from PyTango.globals import get_class, get_class_by_class, \
     get_constructed_class_by_class
 
+
+READ_ONLY = AttrWriteType.READ
+WRITE_ONLY = AttrWriteType.WRITE
+READ_WRITE = AttrWriteType.READ_WRITE
+READ_WITH_WRITE = AttrWriteType.READ_WITH_WRITE
+
 #Argument Options
 global options
 global WILDCARD_REPLACEMENT
@@ -122,67 +104,55 @@ class TimeStructure:
         self.calls = 0
         self.index = ''
 
+def stats(f):
+    fname = f.__name__
+    @functools.wraps(f)
+    def wrapper(self, *args, **kwargs):
+        start = time.time()
+        try:
+            return f(self, *args, **kwargs)
+        finally:
+            end = time.time()
+            update_timing_stats(self, start, end, fname)
+    return wrapper
+
+def update_timing_stats(dev, time_before, time_after, cmd_name):
+    tmp_time = dev.timing_maps[cmd_name]
+    time_elapsed = (time_after - time_before) * 1000.
+    tmp_time.total_elapsed = tmp_time.total_elapsed + time_elapsed
+    if time_elapsed > tmp_time.maximum:
+        tmp_time.maximum = time_elapsed
+    if time_elapsed < tmp_time.minimum or tmp_time.minimum == 0:
+        tmp_time.minimum = time_elapsed
+    tmp_time.calls = tmp_time.calls + 1
+    tmp_time.average = tmp_time.total_elapsed/tmp_time.calls
+
+
+class DataBase(Device):
+    """
+    DataBase TANGO device class
+    """
+    __metaclass__ = DeviceMeta
+
+    # --- attributes ---------------------------------------
 
-cmd_list = ["DbImportDevice", "DbExportDevice", "DbGetHostServerList", "DbGetHostList","DbGetServerList", "DbGetDevicePropertyList", "DbGetClassPropertyList", "DbGetDeviceMemberList", "DbGetDeviceFamilyList", "DbGetDeviceDomainList", "DbGetDeviceProperty", "DbPutDeviceProperty",  "DbDeleteDeviceProperty", "DbInfo", "DbGetDeviceClassList", "DbGetDeviceAttributeProperty", "DbPutDeviceAttributeProperty", "DbGetDeviceAttributeProperty2", "DbPutDeviceAttributeProperty2", "DbUnExportServer", " [...]
+    Timing_maximum = attribute(dtype=('float64',), access=READ_ONLY)
 
-#----- PROTECTED REGION END -----#	//	DataBase.additionnal_import
+    Timing_average = attribute(dtype=('float64',), access=READ_ONLY)
 
-##############################################################################
-## Device States Description
-##
-## No states for this device
-##############################################################################
+    Timing_index = attribute(dtype=('str',), access=READ_ONLY)
 
-class DataBase (PyTango.Device_4Impl):
+    Timing_calls = attribute(dtype=('float64',), access=READ_ONLY)
 
-#--------- Add you global variables here --------------------------
+    Timing_info = attribute(dtype=('str',), access=READ_ONLY)
 
-    def  update_timing_stats(self, time_before, time_after, cmd_name):
-        tmp_time = self.timing_maps[cmd_name]
-        time_elapsed = (time_after - time_before) * 1000.
-        tmp_time.total_elapsed = tmp_time.total_elapsed + time_elapsed
-        if time_elapsed > tmp_time.maximum:
-            tmp_time.maximum = time_elapsed
-        if time_elapsed < tmp_time.minimum or tmp_time.minimum == 0:
-            tmp_time.minimum = time_elapsed
-        tmp_time.calls = tmp_time.calls + 1
-        tmp_time.average = tmp_time.total_elapsed/tmp_time.calls
+    StoredProcedureRelease = attribute(dtype='str', access=READ_ONLY)
+
+    Timing_minimum = attribute(dtype=('float64',), access=READ_ONLY)
 
-    def init_timing_stats(self):
-        self.timing_maps = {}
-        for cmd in cmd_list:
-            self.timing_maps[cmd] = TimeStructure()
-            self.timing_maps[cmd].index = cmd
-
-#----- PROTECTED REGION ID(DataBase.global_variables) ENABLED START -----#
-
-    def get_device_properties(self, device_klass):
-        return
-
-#----- PROTECTED REGION END -----#	//	DataBase.global_variables
-#------------------------------------------------------------------
-#    Device constructor
-#------------------------------------------------------------------
-    def __init__(self, cl, name):
-        PyTango.Device_4Impl.__init__(self, cl, name)
-        self.debug_stream("In " + self.get_name() + ".__init__()")
-        DataBase.init_device(self)
-
-#------------------------------------------------------------------
-#    Device destructor
-#------------------------------------------------------------------
-    def delete_device(self):
-        self.debug_stream("In " + self.get_name() + ".delete_device()")
-        #----- PROTECTED REGION ID(DataBase.delete_device) ENABLED START -----#
-
-        #----- PROTECTED REGION END -----#	//	DataBase.delete_device
-
-#------------------------------------------------------------------
-#    Device initialization
-#------------------------------------------------------------------
     def init_device(self):
-        self.debug_stream("In " + self.get_name() + ".init_device()")
-        #self.get_device_properties(self.get_device_class())
+        self._log = log = logging.getLogger(self.get_name())
+        self._log.debug("In init_device()")
         self.attr_StoredProcedureRelease_read = ''
         self.attr_Timing_average_read = [0.0]
         self.attr_Timing_minimum_read = [0.0]
@@ -191,7 +161,6 @@ class DataBase (PyTango.Device_4Impl):
         self.attr_Timing_index_read = ['']
         self.attr_Timing_info_read = ['']
         self.init_timing_stats()
-        #----- PROTECTED REGION ID(DataBase.init_device) ENABLED START -----#
         m = __import__('db_access.%s' % (options.db_access),None,None,
                        'db_access.%s' % (options.db_access))
         self.db = m.get_db(personal_name = options.argv[1])
@@ -202,396 +171,269 @@ class DataBase (PyTango.Device_4Impl):
             pass
         self.set_state(PyTango.DevState.ON)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.init_device
-
-#------------------------------------------------------------------
-#    Always excuted hook method
-#------------------------------------------------------------------
-    def always_executed_hook(self):
-        self.debug_stream("In " + self.get_name() + ".always_excuted_hook()")
-        #----- PROTECTED REGION ID(DataBase.always_executed_hook) ENABLED START -----#
-
-        #----- PROTECTED REGION END -----#	//	DataBase.always_executed_hook
-
-#==================================================================
-#
-#    DataBase read/write attribute methods
-#
-#==================================================================
-
-#------------------------------------------------------------------
-#    Read StoredProcedureRelease attribute
-#------------------------------------------------------------------
-    def read_StoredProcedureRelease(self, attr):
-        self.debug_stream("In " + self.get_name() + ".read_StoredProcedureRelease()")
-        #----- PROTECTED REGION ID(DataBase.StoredProcedureRelease_read) ENABLED START -----#
-        self.attr_StoredProcedureRelease_read = self.db.get_stored_procedure_release()
-        #----- PROTECTED REGION END -----#	//	DataBase.StoredProcedureRelease_read
-        attr.set_value(self.attr_StoredProcedureRelease_read)
-
-#------------------------------------------------------------------
-#    Read Timing_average attribute
-#------------------------------------------------------------------
-    def read_Timing_average(self, attr):
-        self.debug_stream("In " + self.get_name() + ".read_Timing_average()")
-        #----- PROTECTED REGION ID(DataBase.Timing_average_read) ENABLED START -----#
-
-        self.attr_Timing_average_read[:] = []
-        for tmp_name in cmd_list:
-            self.attr_Timing_average_read.append(self.timing_maps[tmp_name].average)
-        
-        #----- PROTECTED REGION END -----#	//	DataBase.Timing_average_read
-        attr.set_value(self.attr_Timing_average_read)
-
-#------------------------------------------------------------------
-#    Read Timing_minimum attribute
-#------------------------------------------------------------------
-    def read_Timing_minimum(self, attr):
-        self.debug_stream("In " + self.get_name() + ".read_Timing_minimum()")
-        #----- PROTECTED REGION ID(DataBase.Timing_minimum_read) ENABLED START -----#
-
-        self.attr_Timing_minimum_read[:] = []
-        for tmp_name in cmd_list:
-            self.attr_Timing_minimum_read.append(self.timing_maps[tmp_name].minimum)
-
-        #----- PROTECTED REGION END -----#	//	DataBase.Timing_minimum_read
-        attr.set_value(self.attr_Timing_minimum_read)
+    def init_timing_stats(self):
+        self.timing_maps = {}
+        for cmd in dir(self):
+            if cmd.startswith('Db'):
+                self.timing_maps[cmd] = TimeStructure()
+                self.timing_maps[cmd].index = cmd
 
-#------------------------------------------------------------------
-#    Read Timing_maximum attribute
-#------------------------------------------------------------------
-    def read_Timing_maximum(self, attr):
-        self.debug_stream("In " + self.get_name() + ".read_Timing_maximum()")
-        #----- PROTECTED REGION ID(DataBase.Timing_maximum_read) ENABLED START -----#
+    # --- attribute methods --------------------------------
 
+    def read_Timing_maximum(self):
+        self._log.debug("In read_Timing_maximum()")
         self.attr_Timing_maximum_read[:] = []
         for tmp_name in cmd_list:
             self.attr_Timing_maximum_read.append(self.timing_maps[tmp_name].maximum)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.Timing_maximum_read
-        attr.set_value(self.attr_Timing_maximum_read)
+        return self.attr_Timing_maximum_read
 
-#------------------------------------------------------------------
-#    Read Timing_calls attribute
-#------------------------------------------------------------------
-    def read_Timing_calls(self, attr):
-        self.debug_stream("In " + self.get_name() + ".read_Timing_calls()")
-        #----- PROTECTED REGION ID(DataBase.Timing_calls_read) ENABLED START -----#
+    def read_Timing_average(self):
+        self._log.debug("In read_Timing_average()")
 
-        self.attr_Timing_calls_read[:] = []
+        self.attr_Timing_average_read[:] = []
         for tmp_name in cmd_list:
-            self.attr_Timing_calls_read.append(self.timing_maps[tmp_name].calls)
-
-        #----- PROTECTED REGION END -----#	//	DataBase.Timing_calls_read
-        attr.set_value(self.attr_Timing_calls_read)
-
-#------------------------------------------------------------------
-#    Read Timing_index attribute
-#------------------------------------------------------------------
-    def read_Timing_index(self, attr):
-        self.debug_stream("In " + self.get_name() + ".read_Timing_index()")
-        #----- PROTECTED REGION ID(DataBase.Timing_index_read) ENABLED START -----#
+            self.attr_Timing_average_read.append(self.timing_maps[tmp_name].average)
+        return self.attr_Timing_average_read
 
+    def read_Timing_index(self):
+        self._log.debug("In read_Timing_index()")
         for tmp_name in cmd_list:
             self.attr_Timing_index_read.append(self.timing_maps[tmp_name].index)
+        return self.attr_Timing_index_read
 
-        #----- PROTECTED REGION END -----#	//	DataBase.Timing_index_read
-        attr.set_value(self.attr_Timing_index_read)
+    def read_Timing_calls(self):
+        self._log.debug("In read_Timing_calls()")
+        self.attr_Timing_calls_read[:] = []
+        for tmp_name in cmd_list:
+            self.attr_Timing_calls_read.append(self.timing_maps[tmp_name].calls)
+        return self.attr_Timing_calls_read
 
-#------------------------------------------------------------------
-#    Read Timing_info attribute
-#------------------------------------------------------------------
-    def read_Timing_info(self, attr):
-        self.debug_stream("In " + self.get_name() + ".read_Timing_info()")
-        #----- PROTECTED REGION ID(DataBase.Timing_info_read) ENABLED START -----#
-        self.attr_Timing_info_read[:] = []   
+    def read_Timing_info(self):
+        self._log.debug("In read_Timing_info()")
+        self.attr_Timing_info_read[:] = []
         util = PyTango.Util.instance()
         self.attr_Timing_info_read.append("TANGO Database Timing info on host " + util.get_host_name())
         self.attr_Timing_info_read.append(" ")
         self.attr_Timing_info_read.append("command	average	minimum	maximum	calls")
         self.attr_Timing_info_read.append(" ")
-
-                                          
         for tmp_name in cmd_list:
             tmp_info = "%41s\t%6.3f\t%6.3f\t%6.3f\t%.0f"%(tmp_name, self.timing_maps[tmp_name].average, self.timing_maps[tmp_name].minimum, self.timing_maps[tmp_name].maximum, self.timing_maps[tmp_name].calls)
             self.attr_Timing_info_read.append(tmp_info)
-        #----- PROTECTED REGION END -----#	//	DataBase.Timing_info_read
-        attr.set_value(self.attr_Timing_info_read)
-
+        return self.attr_Timing_info_read
 
-#------------------------------------------------------------------
-#    Read Attribute Hardware
-#------------------------------------------------------------------
-    def read_attr_hardware(self, data):
-        self.debug_stream("In " + self.get_name() + ".read_attr_hardware()")
-        #----- PROTECTED REGION ID(DataBase.read_attr_hardware) ENABLED START -----#
-
-        #----- PROTECTED REGION END -----#	//	DataBase.read_attr_hardware
+    def read_StoredProcedureRelease(self):
+        self._log.debug("In read_StoredProcedureRelease()")
+        self.attr_StoredProcedureRelease_read = self.db.get_stored_procedure_release()
+        return self.attr_StoredProcedureRelease_read
 
+    def read_Timing_minimum(self):
+        self._log.debug("In read_Timing_minimum()")
+        self.attr_Timing_minimum_read[:] = []
+        for tmp_name in cmd_list:
+            self.attr_Timing_minimum_read.append(self.timing_maps[tmp_name].minimum)
+        return self.attr_Timing_minimum_read
 
-#==================================================================
-#
-#    DataBase command methods
-#
-#==================================================================
+    # --- commands -----------------------------------------
 
-#------------------------------------------------------------------
-#    DbAddDevice command:
-#------------------------------------------------------------------
-    def DbAddDevice(self, argin):
-        """ Add a Tango class device to a specific device server
-        
-        :param argin: Str[0] = Full device server process name
-        Str[1] = Device name
-        Str[2] = Tango class name
-        :type: PyTango.DevVarStringArray
-        :return: 
-        :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbAddDevice()")
-        #----- PROTECTED REGION ID(DataBase.DbAddDevice) ENABLED START -----#
+    @stats
+    @command(dtype_in='str', doc_in='The wildcard', dtype_out=('str',), doc_out='Device name domain list')
+    def DbGetDeviceDomainList(self, argin):
+        """ Get list of device domain name matching the specified
 
-        if len(argin) < 3:
-            self.warn_stream("DataBase::AddDevice(): incorrect number of input arguments ")
-            th_exc(DB_IncorrectArguments,
-                   "incorrect no. of input arguments, needs at least 3 (server,device,class)",
-                   "DataBase::AddDevice()")
+        :param argin: The wildcard
+        :type: PyTango.DevString
+        :return: Device name domain list
+        :rtype: PyTango.DevVarStringArray """
+        self._log.debug("In DbGetDeviceDomainList()")
+        return self.db.get_device_domain_list(replace_wildcard(argin))
 
-        self.info_stream("DataBase::AddDevice(): insert " + argin[0] + " %s server with device " + argin[1])
-        server_name, d_name, klass_name = argin[:3]
-        if len(argin) > 3:
-            alias = argin[3]
-        else:
-            alias = None
+    @stats
+    @command(dtype_in='str', doc_in='Device server name (executable/instance)', doc_out='none')
+    def DbUnExportServer(self, argin):
+        """ Mark all devices belonging to a specified device server
+        process as non exported
 
-        ret, dev_name, dfm = check_device_name(d_name)
-        if not ret:
-            th_exc(DB_IncorrectDeviceName,
-                  "device name (" + d_name + ") syntax error (should be [tango:][//instance/]domain/family/member)",
-                  "DataBase::AddDevice()")
-        # Lock table
-        self.db.add_device(server_name, (dev_name, dfm) , klass_name, alias=alias)
+        :param argin: Device server name (executable/instance)
+        :type: PyTango.DevString
+        :return:
+        :rtype: PyTango.DevVoid """
+        self._log.debug("In DbUnExportServer()")
+        self.db.unexport_server(argin)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbAddDevice
+    @command(dtype_in=('str',), doc_in='str[0] = device name\nStr[1]...str[n] = attribute name(s)', doc_out='none')
+    def DbDeleteAllDeviceAttributeProperty(self, argin):
+        """ Delete all attribute properties for the specified device attribute(s)
 
-#------------------------------------------------------------------
-#    DbAddServer command:
-#------------------------------------------------------------------
-    def DbAddServer(self, argin):
-        """ Create a device server process entry in database
-        
-        :param argin: Str[0] = Full device server name
-        Str[1] = Device(s) name
-        Str[2] = Tango class name
-        Str[n] = Device name
-        Str[n + 1] = Tango class name
+        :param argin: str[0] = device name
+        Str[1]...str[n] = attribute name(s)
         :type: PyTango.DevVarStringArray
-        :return: 
+        :return:
         :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbAddServer()")
-        #----- PROTECTED REGION ID(DataBase.DbAddServer) ENABLED START -----#
+        self._log.debug("In DbDeleteAllDeviceAttributeProperty()")
 
-        if len(argin) < 3 or not len(argin) % 2:
-            self.warn_stream("DataBase::AddServer(): incorrect number of input arguments ")
+        if len(argin) < 2:
+            self.warn_stream("DataBase::DbDeleteAllDeviceAttributeProperty(): insufficient number of arguments ")
             th_exc(DB_IncorrectArguments,
-                   "incorrect no. of input arguments, needs at least 3 (server,device,class)",
-                   "DataBase::AddServer()")
-        server_name = argin[0]
+                   "insufficient number of arguments to delete all device attribute(s) property",
+                   "DataBase::DbDeleteAllDeviceAttributeProperty()")
 
-        for i in range((len(argin) - 1) / 2):
-            d_name, klass_name = argin[i * 2 + 1], argin[i * 2 + 2]
-            ret, dev_name, dfm = check_device_name(d_name)
-            if not ret:
-                th_exc(DB_IncorrectDeviceName,
-                      "device name (" + d_name + ") syntax error (should be [tango:][//instance/]domain/family/member)",
-                      "DataBase::AddServer()")
-            self.db.add_device(server_name, (dev_name, dfm) , klass_name)
+        dev_name = argin[0]
 
+        ret, d_name, dfm = check_device_name(dev_name)
 
+        if not ret:
+            th_exc(DB_IncorrectDeviceName,
+                  "device name (" + argin + ") syntax error (should be [tango:][//instance/]domain/family/member)",
+                  "DataBase::DbDeleteAllDeviceAttributeProperty()")
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbAddServer
+        self.db.delete_all_device_attribute_property(dev_name, argin[1:])
 
-#------------------------------------------------------------------
-#    DbDeleteAttributeAlias command:
-#------------------------------------------------------------------
+    @command(dtype_in='str', doc_in='Attriibute alias name.', doc_out='none')
     def DbDeleteAttributeAlias(self, argin):
         """ Delete an attribute alias.
-        
+
         :param argin: Attriibute alias name.
         :type: PyTango.DevString
-        :return: 
+        :return:
         :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbDeleteAttributeAlias()")
-        #----- PROTECTED REGION ID(DataBase.DbDeleteAttributeAlias) ENABLED START -----#
-
+        self._log.debug("In DbDeleteAttributeAlias()")
         self.db.delete_attribute_alias(argin)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbDeleteAttributeAlias
+    @command(dtype_in=('str',), doc_in='Str[0] = Tango class\nStr[1] = Attribute name\nStr[2] = Property name', dtype_out=('str',), doc_out='Str[0] = Attribute name\nStr[1] = Property name\nStr[2] = date\nStr[3] = Property value number (array case)\nStr[4] = Property value 1\nStr[n] = Property value n')
+    def DbGetClassAttributePropertyHist(self, argin):
+        """ Retrieve Tango class attribute property history
 
-#------------------------------------------------------------------
-#    DbDeleteClassAttribute command:
-#------------------------------------------------------------------
-    def DbDeleteClassAttribute(self, argin):
-        """ delete a class attribute and all its properties from database
-        
-        :param argin: Str[0] = Tango class name
+        :param argin: Str[0] = Tango class
         Str[1] = Attribute name
+        Str[2] = Property name
         :type: PyTango.DevVarStringArray
-        :return: 
-        :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbDeleteClassAttribute()")
-        #----- PROTECTED REGION ID(DataBase.DbDeleteClassAttribute) ENABLED START -----#
-
-        if len(argin) < 2:
-            self.warn_stream("DataBase::db_delete_class_attribute(): insufficient number of arguments ")
-            th_exc(DB_IncorrectArguments,
-                   "insufficient number of arguments to delete class attribute",
-                   "DataBase::DeleteClassAttribute()")
-
-        klass_name, attr_name = argin[:2]
-
-        self.db.delete_class_attribute(klass_name, attr_name)
+        :return: Str[0] = Attribute name
+        Str[1] = Property name
+        Str[2] = date
+        Str[3] = Property value number (array case)
+        Str[4] = Property value 1
+        Str[n] = Property value n
+        :rtype: PyTango.DevVarStringArray """
+        self._log.debug("In DbGetClassAttributePropertyHist()")
+        class_name = argin[0]
+        attribute = replace_wildcard(argin[1])
+        prop_name = replace_wildcard(argin[2])
+        return self.db.get_class_attribute_property_hist(class_name, attribute, prop_name)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbDeleteClassAttribute
+    @stats
+    @command(dtype_in=('str',), doc_in='Str[0] = Device name\nStr[1] = Attribute number\nStr[2] = Attribute name\nStr[3] = Property number\nStr[4] = Property name\nStr[5] = Property value number (array case)\nStr[5] = Property value 1\nStr[n] = Property value n (array case)\n.....', doc_out='none')
+    def DbPutDeviceAttributeProperty2(self, argin):
+        """ Put device attribute property. This command adds the possibility to have attribute property
+        which are arrays. Not possible with the old DbPutDeviceAttributeProperty command.
+        This old command is not deleted for compatibility reasons.
 
-#------------------------------------------------------------------
-#    DbDeleteClassAttributeProperty command:
-#------------------------------------------------------------------
-    def DbDeleteClassAttributeProperty(self, argin):
-        """ delete class attribute properties from database
-        
-        :param argin: Str[0] = Tango class name
-        Str[1] = Attribute name
-        Str[2] = Property name
-        Str[n] = Property name
+        :param argin: Str[0] = Device name
+        Str[1] = Attribute number
+        Str[2] = Attribute name
+        Str[3] = Property number
+        Str[4] = Property name
+        Str[5] = Property value number (array case)
+        Str[5] = Property value 1
+        Str[n] = Property value n (array case)
+        .....
         :type: PyTango.DevVarStringArray
-        :return: 
+        :return:
         :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbDeleteClassAttributeProperty()")
-        #----- PROTECTED REGION ID(DataBase.DbDeleteClassAttributeProperty) ENABLED START -----#
+        self._log.debug("In DbPutDeviceAttributeProperty2()")
+        device_name = argin[0]
+        nb_attributes = int(argin[1])
+        self.db.put_device_attribute_property2(device_name, nb_attributes, argin[2:])
 
-        if len(argin) < 3:
-            self.warn_stream("DataBase::db_delete_class_attribute_property(): insufficient number of arguments ")
-            th_exc(DB_IncorrectArguments,
-                   "insufficient number of arguments to delete class attribute property",
-                   "DataBase::DeleteClassAttributeProperty()")
+    @command(dtype_in='str', doc_in='attribute alias filter string (eg: att*)', dtype_out=('str',), doc_out='attribute aliases')
+    def DbGetAttributeAliasList(self, argin):
+        """ Get attribute alias list for a specified filter
 
-        klass_name, attr_name = argin[:2]
+        :param argin: attribute alias filter string (eg: att*)
+        :type: PyTango.DevString
+        :return: attribute aliases
+        :rtype: PyTango.DevVarStringArray """
+        self._log.debug("In DbGetAttributeAliasList()")
+        if not argin:
+            argin = "%"
+        else:
+            argin = replace_wildcard(argin)
+        return self.db.get_attribute_alias_list(argin)
 
-        for prop_name in argin[2:]:
-            self.db.delete_class_attribute_property(klass_name, attr_name, prop_name)
+    @command(dtype_in='str', doc_in='Class name', dtype_out=('str',), doc_out='Device exported list')
+    def DbGetExportdDeviceListForClass(self, argin):
+        """ Query the database for device exported for the specified class.
+
+        :param argin: Class name
+        :type: PyTango.DevString
+        :return: Device exported list
+        :rtype: PyTango.DevVarStringArray """
+        self._log.debug("In DbGetExportdDeviceListForClass()")
+        argin = replace_wildcard(argin)
+        return self.db.get_exported_device_list_for_class(argin)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbDeleteClassAttributeProperty
+    @command(dtype_in=('str',), doc_in='Str[0] = attribute name\nStr[1] = attribute alias', doc_out='none')
+    def DbPutAttributeAlias(self, argin):
+        """ Define an alias for an attribute
 
-#------------------------------------------------------------------
-#    DbDeleteClassProperty command:
-#------------------------------------------------------------------
-    def DbDeleteClassProperty(self, argin):
-        """ Delete class properties from database
-        
-        :param argin: Str[0] = Tango class name
-        Str[1] = Property name
-        Str[n] = Property name
+        :param argin: Str[0] = attribute name
+        Str[1] = attribute alias
         :type: PyTango.DevVarStringArray
-        :return: 
+        :return:
         :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbDeleteClassProperty()")
-        #----- PROTECTED REGION ID(DataBase.DbDeleteClassProperty) ENABLED START -----#
+        self._log.debug("In DbPutAttributeAlias()")
 
-        klass_name = argin[0]
+        if len(argin) < 2:
+            self.warn_stream("DataBase::DbPutAttributeAlias(): insufficient number of arguments ")
+            th_exc(DB_IncorrectArguments,
+                   "insufficient number of arguments to put attribute alias",
+                   "DataBase::DbPutAttributeAlias()")
 
-        for prop_name in argin[1:]:
-            self.db.delete_class_property(prop_name)
+        attribute_name = argin[0]
+        attribute_alias = argin[1]
+        self.db.put_attribute_alias(attribute_name, attribute_alias)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbDeleteClassProperty
+    @stats
+    @command(dtype_in='str', doc_in='The filter', dtype_out=('str',), doc_out='Device server process name list')
+    def DbGetServerList(self, argin):
+        """ Get list of device server process defined in database
+        with name matching the specified filter
 
-#------------------------------------------------------------------
-#    DbDeleteDevice command:
-#------------------------------------------------------------------
-    def DbDeleteDevice(self, argin):
-        """ Delete a devcie from database
-        
-        :param argin: device name
+        :param argin: The filter
         :type: PyTango.DevString
-        :return: 
-        :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbDeleteDevice()")
-        #----- PROTECTED REGION ID(DataBase.DbDeleteDevice) ENABLED START -----#
-
-        ret, dev_name, dfm = check_device_name(argin)
-        if not ret:
-            self.warn_stream("DataBase::db_delete_device(): device name " + argin + " incorrect ")
-            th_exc(DB_IncorrectDeviceName,
-                   "failed to delete device, device name incorrect",
-                   "DataBase::DeleteDevice()")
-        self.db.delete_device(dev_name)
+        :return: Device server process name list
+        :rtype: PyTango.DevVarStringArray """
+        self._log.debug("In DbGetServerList()")
+        argin = replace_wildcard(argin)
+        return self.db.get_server_list(argin)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbDeleteDevice
+    @stats
+    @command(dtype_in=('str',), doc_in='Str[0] = Device name\nStr[1] = CORBA IOR\nStr[2] = Device server process host name\nStr[3] = Device server process PID or string ``null``\nStr[4] = Device server process version', doc_out='none')
+    def DbExportDevice(self, argin):
+        """ Export a device to the database
 
-#------------------------------------------------------------------
-#    DbDeleteDeviceAlias command:
-#------------------------------------------------------------------
-    def DbDeleteDeviceAlias(self, argin):
-        """ Delete a device alias.
-        
-        :param argin: device alias name
-        :type: PyTango.DevString
-        :return: 
+        :param argin: Str[0] = Device name
+        Str[1] = CORBA IOR
+        Str[2] = Device server process host name
+        Str[3] = Device server process PID or string ``null``
+        Str[4] = Device server process version
+        :type: PyTango.DevVarStringArray
+        :return:
         :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbDeleteDeviceAlias()")
-        #----- PROTECTED REGION ID(DataBase.DbDeleteDeviceAlias) ENABLED START -----#
-
-        self.db.delete_device_alias(argin)
+        DbExportDevice(self, argin)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbDeleteDeviceAlias
+    @command(dtype_in=('str',), doc_in='Str[0] = Device name\nStr[1] = Attribute name\nStr[2] = Property name\nStr[n] = Property name', doc_out='none')
+    def DbDeleteDeviceAttributeProperty(self, argin):
+        """ delete a device attribute property from the database
 
-#------------------------------------------------------------------
-#    DbDeleteDeviceAttribute command:
-#------------------------------------------------------------------
-    def DbDeleteDeviceAttribute(self, argin):
-        """ Delete  device attribute properties from database
-        
         :param argin: Str[0] = Device name
         Str[1] = Attribute name
+        Str[2] = Property name
+        Str[n] = Property name
         :type: PyTango.DevVarStringArray
-        :return: 
+        :return:
         :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbDeleteDeviceAttribute()")
-        #----- PROTECTED REGION ID(DataBase.DbDeleteDeviceAttribute) ENABLED START -----#
-
-        if len(argin) < 2:
-            self.warn_stream("DataBase::db_delete_device_attribute(): insufficient number of arguments ")
-            th_exc(DB_IncorrectArguments,
-                   "insufficient number of arguments to delete device attribute",
-                   "DataBase::DeleteDeviceAttribute()")
-
-        dev_name, attr_name = argin[:2]
-
-        ret, dev_name, dfm = check_device_name(argin)
-        if not ret:
-            self.warn_stream("DataBase::db_delete_device_attribute(): device name " + argin + " incorrect ")
-            th_exc(DB_IncorrectDeviceName,
-                   "failed to delete device attribute, device name incorrect",
-                   "DataBase::DeleteDeviceAttribute()")
-
-        self.db.delete_device_attribute(dev_name, attr_name)
-
-        #----- PROTECTED REGION END -----#	//	DataBase.DbDeleteDeviceAttribute
-
-#------------------------------------------------------------------
-#    DbDeleteDeviceAttributeProperty command:
-#------------------------------------------------------------------
-    def DbDeleteDeviceAttributeProperty(self, argin):
-        """ delete a device attribute property from the database
-        
-        :param argin: Str[0] = Device name
-        Str[1] = Attribute name
-        Str[2] = Property name
-        Str[n] = Property name
-        :type: PyTango.DevVarStringArray
-        :return: 
-        :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbDeleteDeviceAttributeProperty()")
-        #----- PROTECTED REGION ID(DataBase.DbDeleteDeviceAttributeProperty) ENABLED START -----#
+        self._log.debug("In DbDeleteDeviceAttributeProperty()")
 
         if len(argin) < 3:
             self.warn_stream("DataBase::db_delete_device_attribute_property(): insufficient number of arguments ")
@@ -608,1145 +450,883 @@ class DataBase (PyTango.Device_4Impl):
                    "failed to delete device attribute property, device name incorrect",
                    "DataBase::DeleteDeviceAttributeProperty()")
 
- 
         for prop_name in argin[2:]:
             self.db.delete_device_attribute_property(dev_name, attr_name, prop_name)
 
+    @stats
+    @command(dtype_in='str', doc_in='The wildcard', dtype_out=('str',), doc_out='Family list')
+    def DbGetDeviceFamilyList(self, argin):
+        """ Get a list of device name families for device name matching the
+        specified wildcard
 
+        :param argin: The wildcard
+        :type: PyTango.DevString
+        :return: Family list
+        :rtype: PyTango.DevVarStringArray """
+        self._log.debug("In DbGetDeviceFamilyList()")
+        argin = replace_wildcard(argin)
+        return self.db.get_device_family_list(argin)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbDeleteDeviceAttributeProperty
-
-#------------------------------------------------------------------
-#    DbDeleteDeviceProperty command:
-#------------------------------------------------------------------
-    def DbDeleteDeviceProperty(self, argin):
-        """ Delete device property(ies)
-        
-        :param argin: Str[0] = Device name
-        Str[1] = Property name
-        Str[n] = Property name
-        :type: PyTango.DevVarStringArray
-        :return: 
-        :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbDeleteDeviceProperty()")
-        #----- PROTECTED REGION ID(DataBase.DbDeleteDeviceProperty) ENABLED START -----#
-
-        time_before = time.time()
+    @command(dtype_in='str', doc_in='filter', dtype_out=('str',), doc_out='list of exported devices')
+    def DbGetDeviceWideList(self, argin):
+        """ Get a list of devices whose names satisfy the filter.
 
-        dev_name = argin[0]
-        for prop_name in argin[1:]:
-            self.db.delete_device_property(dev_name, prop_name)
+        :param argin: filter
+        :type: PyTango.DevString
+        :return: list of exported devices
+        :rtype: PyTango.DevVarStringArray """
+        self._log.debug("In DbGetDeviceWideList()")
+        argin = replace_wildcard(argin)
+        return self.db.get_device_wide_list(argin)
 
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbDeleteDeviceProperty")
+    @command(dtype_in=('str',), doc_in='Str[0] = Object name\nStr[1] = Property number\nStr[2] = Property name\nStr[3] = Property value number\nStr[4] = Property value 1\nStr[n] = Property value n\n....', doc_out='none')
+    def DbPutProperty(self, argin):
+        """ Create / Update free object property(ies)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbDeleteDeviceProperty
+        :param argin: Str[0] = Object name
+        Str[1] = Property number
+        Str[2] = Property name
+        Str[3] = Property value number
+        Str[4] = Property value 1
+        Str[n] = Property value n
+        ....
+        :type: PyTango.DevVarStringArray
+        :return:
+        :rtype: PyTango.DevVoid """
+        self._log.debug("In DbPutProperty()")
+        object_name = argin[0]
+        nb_properties = int(argin[1])
+        self.db.put_property(object_name, properties, argin[2:])
 
-#------------------------------------------------------------------
-#    DbDeleteProperty command:
-#------------------------------------------------------------------
+    @command(dtype_in=('str',), doc_in='Str[0]  = Object name\nStr[1] = Property name\nStr[n] = Property name', doc_out='none')
     def DbDeleteProperty(self, argin):
         """ Delete free property from database
-        
+
         :param argin: Str[0]  = Object name
         Str[1] = Property name
         Str[n] = Property name
         :type: PyTango.DevVarStringArray
-        :return: 
+        :return:
         :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbDeleteProperty()")
-        #----- PROTECTED REGION ID(DataBase.DbDeleteProperty) ENABLED START -----#
-
+        self._log.debug("In DbDeleteProperty()")
         obj_name = argin[0]
         for prop_name in argin[1:]:
             self.db.delete_property(obj_name, prop_name)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbDeleteProperty
-
-#------------------------------------------------------------------
-#    DbDeleteServer command:
-#------------------------------------------------------------------
-    def DbDeleteServer(self, argin):
-        """ Delete server from the database but dont delete device properties
-        
-        :param argin: Device server name
-        :type: PyTango.DevString
-        :return: 
-        :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbDeleteServer()")
-        #----- PROTECTED REGION ID(DataBase.DbDeleteServer) ENABLED START -----#
-
-        if '*' in argin or '%' in argin or not '/' in argin:
-            self.warn_stream("DataBase::db_delete_server(): server name " + argin + " incorrect ")
-            th_exc(DB_IncorrectServerName,
-                   "failed to delete server, server name incorrect",
-                   "DataBase::DeleteServer()")
+    @command(dtype_in=('str',), doc_in='Str[0] = Tango class name\nStr[1] = Attribute name\nStr[n] = Attribute name', dtype_out=('str',), doc_out='Str[0] = Tango class name\nStr[1] = Attribute property  number\nStr[2] = Attribute property 1 name\nStr[3] = Attribute property 1 value number (array case)\nStr[4] = Attribute property 1 value\nStr[n] = Attribute property 1 value (array case)\nStr[n + 1] = Attribute property 2 name\nStr[n + 2] = Attribute property 2 value number (array case)\n [...]
+    def DbGetClassAttributeProperty2(self, argin):
+        """ This command supports array property compared to the old command called
+        DbGetClassAttributeProperty. The old command has not been deleted from the
+        server for compatibility reasons.
 
-        self.db.delete_server(argin)
+        :param argin: Str[0] = Tango class name
+        Str[1] = Attribute name
+        Str[n] = Attribute name
+        :type: PyTango.DevVarStringArray
+        :return: Str[0] = Tango class name
+        Str[1] = Attribute property  number
+        Str[2] = Attribute property 1 name
+        Str[3] = Attribute property 1 value number (array case)
+        Str[4] = Attribute property 1 value
+        Str[n] = Attribute property 1 value (array case)
+        Str[n + 1] = Attribute property 2 name
+        Str[n + 2] = Attribute property 2 value number (array case)
+        Str[n + 3] = Attribute property 2 value
+        Str[n + m] = Attribute property 2 value (array case)
+        :rtype: PyTango.DevVarStringArray """
+        self._log.debug("In DbGetClassAttributeProperty2()")
+        class_name = argin[0]
+        return self.db.get_class_attribute_property2(class_name, argin[1:])
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbDeleteServer
+    @stats
+    @command(dtype_in='str', doc_in='filter', dtype_out=('str',), doc_out='list of exported devices')
+    def DbGetDeviceExportedList(self, argin):
+        """ Get a list of exported devices whose names satisfy the filter (wildcard is
 
-#------------------------------------------------------------------
-#    DbDeleteServerInfo command:
-#------------------------------------------------------------------
-    def DbDeleteServerInfo(self, argin):
-        """ delete info related to a Tango devvice server process
-        
-        :param argin: Device server name
+        :param argin: filter
         :type: PyTango.DevString
-        :return: 
-        :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbDeleteServerInfo()")
-        #----- PROTECTED REGION ID(DataBase.DbDeleteServerInfo) ENABLED START -----#
-
-        self.db.delete_server_info(argin)
+        :return: list of exported devices
+        :rtype: PyTango.DevVarStringArray """
+        self._log.debug("In DbGetDeviceExportedList()")
+        argin = replace_wildcard(argin)
+        return self.db.get_device_exported_list(argin)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbDeleteServerInfo
+    @command(dtype_in='str', doc_in='The device name', dtype_out='str', doc_out='The alias found')
+    def DbGetDeviceAlias(self, argin):
+        """ Return alias for device name if found.
 
-#------------------------------------------------------------------
-#    DbExportDevice command:
-#------------------------------------------------------------------
-    def DbExportDevice(self, argin):
-        """ Export a device to the database
-        
-        :param argin: Str[0] = Device name
-        Str[1] = CORBA IOR
-        Str[2] = Device server process host name
-        Str[3] = Device server process PID or string ``null``
-        Str[4] = Device server process version
-        :type: PyTango.DevVarStringArray
-        :return: 
-        :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbExportDevice()")
-        #----- PROTECTED REGION ID(DataBase.DbExportDevice) ENABLED START -----#
-        time_before = time.time()
-        if len(argin) < 5:
-            self.warn_stream("DataBase::DbExportDevice(): insufficient export info for device ")
-            th_exc(DB_IncorrectArguments,
-                   "insufficient export info for device",
-                   "DataBase::ExportDevice()")
+        :param argin: The device name
+        :type: PyTango.DevString
+        :return: The alias found
+        :rtype: PyTango.DevString """
+        self._log.debug("In DbGetDeviceAlias()")
+        ret, dev_name, dfm = check_device_name(argin)
+        if not ret:
+            th_exc(DB_IncorrectDeviceName,
+                  "device name (" + argin + ") syntax error (should be [tango:][//instance/]domain/family/member)",
+                  "DataBase::DbGetDeviceAlias()")
 
-        dev_name, IOR, host, pid, version = argin[:5]
-        dev_name = dev_name.lower()
-        if pid.lower() == 'null':
-            pid = "-1"
-        self.db.export_device(dev_name, IOR, host, pid, version)
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbExportDevice")
+        return self.db.get_device_alias(dev_name)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbExportDevice
+    @command(dtype_in=('str',), doc_in='Str[0] = Tango class name\nStr[1] = Attribute number\nStr[2] = Attribute name\nStr[3] = Property number\nStr[4] = Property name\nStr[5] = Property value\n.....', doc_out='none')
+    def DbPutClassAttributeProperty(self, argin):
+        """ Create/Update class attribute property(ies) in database
 
-#------------------------------------------------------------------
-#    DbExportEvent command:
-#------------------------------------------------------------------
-    def DbExportEvent(self, argin):
-        """ Export Event channel to database
-        
-        :param argin: Str[0] = event channel name (or factory name)
-        Str[1] = CORBA IOR
-        Str[2] = Notifd host name
-        Str[3] = Notifd pid
-        Str[4] = Notifd version
+        :param argin: Str[0] = Tango class name
+        Str[1] = Attribute number
+        Str[2] = Attribute name
+        Str[3] = Property number
+        Str[4] = Property name
+        Str[5] = Property value
+        .....
         :type: PyTango.DevVarStringArray
-        :return: 
+        :return:
         :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbExportEvent()")
-        #----- PROTECTED REGION ID(DataBase.DbExportEvent) ENABLED START -----#
-
-        time_before = time.time()
-        if len(argin) < 5:
-            self.warn_stream("DataBase::db_export_event(): insufficient export info for event ")
-            th_exc(DB_IncorrectArguments,
-                   "insufficient export info for event",
-                   "DataBase::ExportEvent()")
-
-        event, IOR, host, pid, version = argin[:5]
-        event = replace_wildcard(event.lower())
-        self.db.export_event(event, IOR, host, pid, version)
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbExportEvent")
+        self._log.debug("In DbPutClassAttributeProperty()")
+        class_name = argin[0]
+        nb_attributes = int(argin[1])
+        self.db.put_class_attribute_property(class_name, nb_attributes, argin[2:])
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbExportEvent
+    @stats
+    @command(dtype_in='str', doc_in='The filter', dtype_out=('str',), doc_out='Property name list')
+    def DbGetClassPropertyList(self, argin):
+        """ Get property list for a given Tango class with a specified filter
 
-#------------------------------------------------------------------
-#    DbGetAliasDevice command:
-#------------------------------------------------------------------
-    def DbGetAliasDevice(self, argin):
-        """ Get device name from its alias.
-        
-        :param argin: Alias name
+        :param argin: The filter
         :type: PyTango.DevString
-        :return: Device name
-        :rtype: PyTango.DevString """
-        self.debug_stream("In " + self.get_name() + ".DbGetAliasDevice()")
-        argout = ''
-        #----- PROTECTED REGION ID(DataBase.DbGetAliasDevice) ENABLED START -----#
-
+        :return: Property name list
+        :rtype: PyTango.DevVarStringArray """
+        self._log.debug("In DbGetClassPropertyList()")
         if not argin:
             argin = "%"
         else:
             argin = replace_wildcard(argin)
+        return self.db.get_class_property_list(argin)
 
-        argout = self.db.get_alias_device(argin)
-
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetAliasDevice
-        return argout
-
-#------------------------------------------------------------------
-#    DbGetAttributeAlias command:
-#------------------------------------------------------------------
-    def DbGetAttributeAlias(self, argin):
-        """ Get the attribute name for the given alias.
-        If alias not found in database, returns an empty string.
-        
-        :param argin: The attribute alias name
-        :type: PyTango.DevString
-        :return: The attribute name (device/attribute)
-        :rtype: PyTango.DevString """
-        self.debug_stream("In " + self.get_name() + ".DbGetAttributeAlias()")
-        argout = ''
-        #----- PROTECTED REGION ID(DataBase.DbGetAttributeAlias) ENABLED START -----#
-
-        argout = self.db.get_attribute_alias(argin)
-
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetAttributeAlias
-        return argout
+    @command(dtype_in='str', doc_in='The filter', dtype_out=('str',), doc_out='Device alias list')
+    def DbGetDeviceAliasList(self, argin):
+        """ Get device alias name with a specific filter
 
-#------------------------------------------------------------------
-#    DbGetAttributeAliasList command:
-#------------------------------------------------------------------
-    def DbGetAttributeAliasList(self, argin):
-        """ Get attribute alias list for a specified filter
-        
-        :param argin: attribute alias filter string (eg: att*)
+        :param argin: The filter
         :type: PyTango.DevString
-        :return: attribute aliases
+        :return: Device alias list
         :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetAttributeAliasList()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetAttributeAliasList) ENABLED START -----#
-
+        self._log.debug("In DbGetDeviceAliasList()")
         if not argin:
             argin = "%"
         else:
             argin = replace_wildcard(argin)
 
-        argout = self.db.get_attribute_alias_list(argin)
+        return self.db.get_device_alias_list(argin)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetAttributeAliasList
-        return argout
+    @command(dtype_in=('str',), doc_in='Str[0] = Tango class name\nStr[1] = Attribute name', doc_out='none')
+    def DbDeleteClassAttribute(self, argin):
+        """ delete a class attribute and all its properties from database
 
-#------------------------------------------------------------------
-#    DbGetClassAttributeList command:
-#------------------------------------------------------------------
-    def DbGetClassAttributeList(self, argin):
-        """ Get attrilute list for a given Tango class with a specified filter
-        
         :param argin: Str[0] = Tango class name
-        Str[1] = Attribute name filter (eg: att*)
+        Str[1] = Attribute name
         :type: PyTango.DevVarStringArray
-        :return: Str[0] = Class attribute name
-        Str[n] = Class attribute name
-        :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetClassAttributeList()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetClassAttributeList) ENABLED START -----#
+        :return:
+        :rtype: PyTango.DevVoid """
+        self._log.debug("In DbDeleteClassAttribute()")
 
-        class_name = argin[0]
-        wildcard = replace_wildcard(argin[1])
+        if len(argin) < 2:
+            self.warn_stream("DataBase::db_delete_class_attribute(): insufficient number of arguments ")
+            th_exc(DB_IncorrectArguments,
+                   "insufficient number of arguments to delete class attribute",
+                   "DataBase::DeleteClassAttribute()")
+
+        klass_name, attr_name = argin[:2]
 
-        argout = self.db.get_class_attribute_list(class_name, wildcard)
+        self.db.delete_class_attribute(klass_name, attr_name)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetClassAttributeList
-        return argout
+    @command(dtype_in=('str',), doc_in='Str[0] = Tango class\nStr[1] = Property name', dtype_out=('str',), doc_out='Str[0] = Property name\nStr[1] = date\nStr[2] = Property value number (array case)\nStr[3] = Property value 1\nStr[n] = Property value n')
+    def DbGetClassPropertyHist(self, argin):
+        """ Retrieve Tango class property history
 
-#------------------------------------------------------------------
-#    DbGetClassAttributeProperty command:
-#------------------------------------------------------------------
-    def DbGetClassAttributeProperty(self, argin):
-        """ Get Tango class property(ies) value
-        
-        :param argin: Str[0] = Tango class name
-        Str[1] = Attribute name
-        Str[n] = Attribute name
+        :param argin: Str[0] = Tango class
+        Str[1] = Property name
         :type: PyTango.DevVarStringArray
-        :return: Str[0] = Tango class name
-        Str[1] = Attribute property  number
-        Str[2] = Attribute property 1 name
-        Str[3] = Attribute property 1 value
-        Str[n + 1] = Attribute property 2 name
-        Str[n + 2] = Attribute property 2 value
+        :return: Str[0] = Property name
+        Str[1] = date
+        Str[2] = Property value number (array case)
+        Str[3] = Property value 1
+        Str[n] = Property value n
         :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetClassAttributeProperty()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetClassAttributeProperty) ENABLED START -----#
-
+        self._log.debug("In DbGetClassPropertyHist()")
         class_name = argin[0]
-        argout = self.db.get_class_attribute_property(class_name, argin[1:])
+        prop_name = argin[1]
+        return self.db.get_class_property_hist(class_name, prop_name)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetClassAttributeProperty
-        return argout
+    @command(dtype_in=('str',), doc_in='Str[0] = Device name\nStr[1] = Attribute name', doc_out='none')
+    def DbDeleteDeviceAttribute(self, argin):
+        """ Delete  device attribute properties from database
 
-#------------------------------------------------------------------
-#    DbGetClassAttributeProperty2 command:
-#------------------------------------------------------------------
-    def DbGetClassAttributeProperty2(self, argin):
-        """ This command supports array property compared to the old command called
-        DbGetClassAttributeProperty. The old command has not been deleted from the
-        server for compatibility reasons.
-        
-        :param argin: Str[0] = Tango class name
+        :param argin: Str[0] = Device name
         Str[1] = Attribute name
-        Str[n] = Attribute name
         :type: PyTango.DevVarStringArray
-        :return: Str[0] = Tango class name
-        Str[1] = Attribute property  number
-        Str[2] = Attribute property 1 name
-        Str[3] = Attribute property 1 value number (array case)
-        Str[4] = Attribute property 1 value
-        Str[n] = Attribute property 1 value (array case)
-        Str[n + 1] = Attribute property 2 name
-        Str[n + 2] = Attribute property 2 value number (array case)
-        Str[n + 3] = Attribute property 2 value
-        Str[n + m] = Attribute property 2 value (array case)
-        :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetClassAttributeProperty2()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetClassAttributeProperty2) ENABLED START -----#
-
-        class_name = argin[0]
-        argout = self.db.get_class_attribute_property2(class_name, argin[1:])
+        :return:
+        :rtype: PyTango.DevVoid """
+        self._log.debug("In DbDeleteDeviceAttribute()")
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetClassAttributeProperty2
-        return argout
+        if len(argin) < 2:
+            self.warn_stream("DataBase::db_delete_device_attribute(): insufficient number of arguments ")
+            th_exc(DB_IncorrectArguments,
+                   "insufficient number of arguments to delete device attribute",
+                   "DataBase::DeleteDeviceAttribute()")
 
-#------------------------------------------------------------------
-#    DbGetClassAttributePropertyHist command:
-#------------------------------------------------------------------
-    def DbGetClassAttributePropertyHist(self, argin):
-        """ Retrieve Tango class attribute property history
-        
-        :param argin: Str[0] = Tango class
-        Str[1] = Attribute name
-        Str[2] = Property name
-        :type: PyTango.DevVarStringArray
-        :return: Str[0] = Attribute name
-        Str[1] = Property name
-        Str[2] = date
-        Str[3] = Property value number (array case)
-        Str[4] = Property value 1
-        Str[n] = Property value n
-        :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetClassAttributePropertyHist()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetClassAttributePropertyHist) ENABLED START -----#
-        class_name = argin[0]
-        attribute = replace_wildcard(argin[1])
-        prop_name = replace_wildcard(argin[2])
-        argout = self.db.get_class_attribute_property_hist(class_name, attribute, prop_name)
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetClassAttributePropertyHist
-        return argout
+        dev_name, attr_name = argin[:2]
 
-#------------------------------------------------------------------
-#    DbGetClassForDevice command:
-#------------------------------------------------------------------
-    def DbGetClassForDevice(self, argin):
-        """ Get Tango class for the specified device.
-        
-        :param argin: Device name
-        :type: PyTango.DevString
-        :return: Device Tango class
-        :rtype: PyTango.DevString """
-        self.debug_stream("In " + self.get_name() + ".DbGetClassForDevice()")
-        argout = ''
-        #----- PROTECTED REGION ID(DataBase.DbGetClassForDevice) ENABLED START -----#
-
-        argout = self.db.get_class_for_device(argin)
-        print argout
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetClassForDevice
-        return argout
-
-#------------------------------------------------------------------
-#    DbGetClassInheritanceForDevice command:
-#------------------------------------------------------------------
-    def DbGetClassInheritanceForDevice(self, argin):
-        """ Get class inheritance for the specified device.
-        
-        :param argin: Device name
-        :type: PyTango.DevString
-        :return: Classes off the specified device.
-        [0] - is the class of the device.
-        [1] - is the class from the device class is inherited.
-        ........and so on
-        :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetClassInheritanceForDevice()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetClassInheritanceForDevice) ENABLED START -----#
+        ret, dev_name, dfm = check_device_name(argin)
+        if not ret:
+            self.warn_stream("DataBase::db_delete_device_attribute(): device name " + argin + " incorrect ")
+            th_exc(DB_IncorrectDeviceName,
+                   "failed to delete device attribute, device name incorrect",
+                   "DataBase::DeleteDeviceAttribute()")
 
-        argout = self.db.get_class_inheritance_for_device(argin)
+        self.db.delete_device_attribute(dev_name, attr_name)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetClassInheritanceForDevice
-        return argout
+    @stats
+    @command(dtype_in='str', doc_in='MySql Select command', dtype_out='DevVarLongStringArray', doc_out='MySql Select command result\n - svalues : select results\n - lvalue[n] : =0 if svalue[n] is null else =1\n (last lvalue -1) is number of rows, (last lvalue) is number of fields')
+    def DbMySqlSelect(self, argin):
+        """ This is a very low level command.
+        It executes the specified  SELECT command on TANGO database and returns its result without filter.
 
-#------------------------------------------------------------------
-#    DbGetClassList command:
-#------------------------------------------------------------------
-    def DbGetClassList(self, argin):
-        """ Get Tango class list with a specified filter
-        
-        :param argin: Filter
+        :param argin: MySql Select command
         :type: PyTango.DevString
-        :return: Class list
-        :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetClassList()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetClassList) ENABLED START -----#
+        :return: MySql Select command result
+         - svalues : select results
+         - lvalue[n] : =0 if svalue[n] is null else =1
+         (last lvalue -1) is number of rows, (last lvalue) is number of fields
+        :rtype: PyTango.DevVarLongStringArray """
+        self._log.debug("In DbMySqlSelect()")
+        tmp_argin = argin.lower()
 
-        server = replace_wildcard(argin)
-        argout = self.db.get_class_list(server)
+        #  Check if SELECT key is alread inside command
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetClassList
-        return argout
+        cmd = argin
+        tmp_argin = argin.lower()
+        pos = tmp_argin.find('select')
+        if pos == -1:
+            cmd = "SELECT " + cmd
 
-#------------------------------------------------------------------
-#    DbGetClassProperty command:
-#------------------------------------------------------------------
-    def DbGetClassProperty(self, argin):
-        """ 
-        
-        :param argin: Str[0] = Tango class
-        Str[1] = Property name
-        Str[2] = Property name
+        pos = tmp_argin.find(';')
+        if pos != -1 and len(tmp_argin) > (pos + 1):
+            th_exc(DB_IncorrectArguments,
+                   "SQL command not valid: " + argin,
+                   "DataBase::ExportDevice()")
+        return self.db.my_sql_select(cmd)
+
+    @stats
+    @command(dtype_in=('str',), doc_in='Str[0] = Device name\nStr[1] = Attribute number\nStr[2] = Attribute name\nStr[3] = Property number\nStr[4] = Property name\nStr[5] = Property value\n.....', doc_out='none')
+    def DbPutDeviceAttributeProperty(self, argin):
+        """ Create/Update device attribute property(ies) in database
+
+        :param argin: Str[0] = Device name
+        Str[1] = Attribute number
+        Str[2] = Attribute name
+        Str[3] = Property number
+        Str[4] = Property name
+        Str[5] = Property value
+        .....
         :type: PyTango.DevVarStringArray
-        :return: Str[0] = Tango class
-        Str[1] = Property number
-        Str[2] = Property name
-        Str[3] = Property value number (array case)
-        Str[4] = Property value
-        Str[n] = Propery value (array case)
-        ....
-        :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetClassProperty()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetClassProperty) ENABLED START -----#
+        :return:
+        :rtype: PyTango.DevVoid """
+        self._log.debug("In DbPutDeviceAttributeProperty()")
+        device_name = argin[0]
+        nb_attributes = int(argin[1])
+        self.db.put_device_attribute_property(device_name, nb_attributes, argin[2:])
 
-        class_name = argin[0]
-        argout = self.db.get_class_property(class_name,argint[1:])
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetClassProperty
-        return argout
+    @stats
+    @command(dtype_in=('str',), doc_in='Str[0] = Device name\nStr[1] = Attribute name\nStr[n] = Attribute name', dtype_out=('str',), doc_out='Str[0] = Device name\nStr[1] = Attribute property  number\nStr[2] = Attribute property 1 name\nStr[3] = Attribute property 1 value\nStr[n + 1] = Attribute property 2 name\nStr[n + 2] = Attribute property 2 value')
+    def DbGetDeviceAttributeProperty(self, argin):
+        """ Get device attribute property(ies) value
 
-#------------------------------------------------------------------
-#    DbGetClassPropertyHist command:
-#------------------------------------------------------------------
-    def DbGetClassPropertyHist(self, argin):
-        """ Retrieve Tango class property history
-        
-        :param argin: Str[0] = Tango class
-        Str[1] = Property name
+        :param argin: Str[0] = Device name
+        Str[1] = Attribute name
+        Str[n] = Attribute name
         :type: PyTango.DevVarStringArray
-        :return: Str[0] = Property name
-        Str[1] = date
-        Str[2] = Property value number (array case)
-        Str[3] = Property value 1
-        Str[n] = Property value n
+        :return: Str[0] = Device name
+        Str[1] = Attribute property  number
+        Str[2] = Attribute property 1 name
+        Str[3] = Attribute property 1 value
+        Str[n + 1] = Attribute property 2 name
+        Str[n + 2] = Attribute property 2 value
         :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetClassPropertyHist()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetClassPropertyHist) ENABLED START -----#
-
-        class_name = argin[0]
-        prop_name = argin[1]
-        argout = self.db.get_class_property_hist(class_name, prop_name)
+        self._log.debug("In DbGetDeviceAttributeProperty()")
+        dev_name = argin[0]
+        return self.db.get_device_attribute_property(dev_name, argin[1:])
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetClassPropertyHist
-        return argout
+    @stats
+    @command(dtype_in=('str',), doc_in='Str[0] = Object name\nStr[1] = filter', dtype_out=('str',), doc_out='Property name list')
+    def DbGetPropertyList(self, argin):
+        """ Get list of property defined for a free object and matching the
+        specified filter
 
-#------------------------------------------------------------------
-#    DbGetClassPropertyList command:
-#------------------------------------------------------------------
-    def DbGetClassPropertyList(self, argin):
-        """ Get property list for a given Tango class with a specified filter
-        
-        :param argin: The filter
-        :type: PyTango.DevString
+        :param argin: Str[0] = Object name
+        Str[1] = filter
+        :type: PyTango.DevVarStringArray
         :return: Property name list
         :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetClassPropertyList()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetClassPropertyList) ENABLED START -----#
-        time_before = time.time()
-        if not argin:
-            argin = "%"
-        else:
-            argin = replace_wildcard(argin)
-
-        argout = self.db.get_class_property_list(argin)
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbDeleteDeviceProperty")
-        
+        self._log.debug("In DbGetPropertyList()")
+        object_name = argin[0]
+        wildcard = replace_wildcard(argin[1])
+        return self.db.get_property_list(object_name, wildcard)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetClassPropertyList
-        return argout
+    @stats
+    @command(dtype_in='str', doc_in='Device server process name', dtype_out=('str',), doc_out='Str[0] = Device name\nStr[1] = Tango class\nStr[n] = Device name\nStr[n + 1] = Tango class')
+    def DbGetDeviceClassList(self, argin):
+        """ Get Tango classes/device list embedded in a specific device server
 
-#------------------------------------------------------------------
-#    DbGetDeviceAlias command:
-#------------------------------------------------------------------
-    def DbGetDeviceAlias(self, argin):
-        """ Return alias for device name if found.
-        
-        :param argin: The device name
+        :param argin: Device server process name
         :type: PyTango.DevString
-        :return: The alias found
-        :rtype: PyTango.DevString """
-        self.debug_stream("In " + self.get_name() + ".DbGetDeviceAlias()")
-        argout = ''
-        #----- PROTECTED REGION ID(DataBase.DbGetDeviceAlias) ENABLED START -----#
-
-        ret, dev_name, dfm = check_device_name(argin)
-        if not ret:
-            th_exc(DB_IncorrectDeviceName,
-                  "device name (" + argin + ") syntax error (should be [tango:][//instance/]domain/family/member)",
-                  "DataBase::DbGetDeviceAlias()")
+        :return: Str[0] = Device name
+        Str[1] = Tango class
+        Str[n] = Device name
+        Str[n + 1] = Tango class
+        :rtype: PyTango.DevVarStringArray """
+        self._log.debug("In DbGetDeviceClassList()")
+        return self.db.get_device_class_list(argin)
 
-        argout = self.db.get_device_alias(dev_name)
+    @command(dtype_in='str', doc_in='Device name', doc_out='none')
+    def DbUnExportDevice(self, argin):
+        """ Mark a device as non exported in database
 
+        :param argin: Device name
+        :type: PyTango.DevString
+        :return:
+        :rtype: PyTango.DevVoid """
+        self._log.debug("In DbUnExportDevice()")
+        dev_name = argin[0].lower()
+        self.db.unexport_device(dev_name)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetDeviceAlias
-        return argout
+    @command(dtype_in='str', doc_in='Alias name', dtype_out='str', doc_out='Device name')
+    def DbGetAliasDevice(self, argin):
+        """ Get device name from its alias.
 
-#------------------------------------------------------------------
-#    DbGetDeviceAliasList command:
-#------------------------------------------------------------------
-    def DbGetDeviceAliasList(self, argin):
-        """ Get device alias name with a specific filter
-        
-        :param argin: The filter
+        :param argin: Alias name
         :type: PyTango.DevString
-        :return: Device alias list
-        :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetDeviceAliasList()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetDeviceAliasList) ENABLED START -----#
+        :return: Device name
+        :rtype: PyTango.DevString """
+        self._log.debug("In DbGetAliasDevice()")
         if not argin:
             argin = "%"
         else:
             argin = replace_wildcard(argin)
+        return self.db.get_alias_device(argin)
 
-        argout = self.db.get_device_alias_list(argin)
+    @command(dtype_in='str', doc_in='device name', doc_out='none')
+    def DbDeleteDevice(self, argin):
+        """ Delete a devcie from database
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetDeviceAliasList
-        return argout
+        :param argin: device name
+        :type: PyTango.DevString
+        :return:
+        :rtype: PyTango.DevVoid """
+        self._log.debug("In DbDeleteDevice()")
 
-#------------------------------------------------------------------
-#    DbGetDeviceAttributeList command:
-#------------------------------------------------------------------
+        ret, dev_name, dfm = check_device_name(argin)
+        if not ret:
+            self.warn_stream("DataBase::db_delete_device(): device name " + argin + " incorrect ")
+            th_exc(DB_IncorrectDeviceName,
+                   "failed to delete device, device name incorrect",
+                   "DataBase::DeleteDevice()")
+        self.db.delete_device(dev_name)
+
+    @command(dtype_in=('str',), doc_in='Str[0] = Device name\nStr[1] = Wildcard', dtype_out=('str',), doc_out='attribute name list')
     def DbGetDeviceAttributeList(self, argin):
         """ Return list of attributes matching the wildcard
          for the specified device
-        
+
         :param argin: Str[0] = Device name
         Str[1] = Wildcard
         :type: PyTango.DevVarStringArray
         :return: attribute name list
         :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetDeviceAttributeList()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetDeviceAttributeList) ENABLED START -----#
-
+        self._log.debug("In DbGetDeviceAttributeList()")
         dev_name = argin[0]
         wildcard = argin[1]
         if not wildcard:
             wildcard = "%"
         else:
             wildcard = replace_wildcard(wildcard)
+        return self.db.get_device_attribute_list(dev_name, wildcard)
 
-        argout = self.db.get_device_attribute_list(dev_name, wildcard)
-
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetDeviceAttributeList
-        return argout
+    @command(dtype_in='str', doc_in='Host name', dtype_out=('str',), doc_out='Server info for all servers running on specified host')
+    def DbGetHostServersInfo(self, argin):
+        """ Get info about all servers running on specified host, name, mode and level
 
-#------------------------------------------------------------------
-#    DbGetDeviceAttributeProperty command:
-#------------------------------------------------------------------
-    def DbGetDeviceAttributeProperty(self, argin):
-        """ Get device attribute property(ies) value
-        
-        :param argin: Str[0] = Device name
-        Str[1] = Attribute name
-        Str[n] = Attribute name
-        :type: PyTango.DevVarStringArray
-        :return: Str[0] = Device name
-        Str[1] = Attribute property  number
-        Str[2] = Attribute property 1 name
-        Str[3] = Attribute property 1 value
-        Str[n + 1] = Attribute property 2 name
-        Str[n + 2] = Attribute property 2 value
+        :param argin: Host name
+        :type: PyTango.DevString
+        :return: Server info for all servers running on specified host
         :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetDeviceAttributeProperty()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetDeviceAttributeProperty) ENABLED START -----#
-        time_before = time.time()
-        dev_name = argin[0]
-        argout = self.db.get_device_attribute_property(class_name, argin[1:])
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbGetDeviceAttributeProperty")
+        self._log.debug("In DbGetHostServersInfo()")
+        argin = replace_wildcard(argin)
+        return self.db.get_host_servers_info(argin)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetDeviceAttributeProperty
-        return argout
+    @command(dtype_in=('str',), doc_in='s[0] = old device server name (exec/instance)\ns[1] = new device server name (exec/instance)')
+    def DbRenameServer(self, argin):
+        """ Rename a device server process
 
-#------------------------------------------------------------------
-#    DbGetDeviceAttributeProperty2 command:
-#------------------------------------------------------------------
-    def DbGetDeviceAttributeProperty2(self, argin):
-        """ Retrieve device attribute properties. This command has the possibility to retrieve
-        device attribute properties which are arrays. It is not possible with the old
-        DbGetDeviceAttributeProperty command. Nevertheless, the old command has not been
-        deleted for compatibility reason
-        
-        :param argin: Str[0] = Device name
-        Str[1] = Attribute name
-        Str[n] = Attribute name
+        :param argin: str[0] = old device server name (exec/instance)
+        str[1] =  new device server name (exec/instance)
         :type: PyTango.DevVarStringArray
-        :return: Str[0] = Device name
-        Str[1] = Attribute property  number
-        Str[2] = Attribute property 1 name
-        Str[3] = Attribute property 1 value number (array case)
-        Str[4] = Attribute property 1 value
-        Str[n] = Attribute property 1 value (array case)
-        Str[n + 1] = Attribute property 2 name
-        Str[n + 2] = Attribute property 2 value number (array case)
-        Str[n + 3] = Attribute property 2 value
-        Str[n + m] = Attribute property 2 value (array case)
-        :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetDeviceAttributeProperty2()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetDeviceAttributeProperty2) ENABLED START -----#
-
-        time_before = time.time()
+        :return:
+        :rtype: PyTango.DevVoid """
+        self._log.debug("In DbRenameServer()")
 
-        dev_name = argin[0]
-        argout = self.db.get_device_attribute_property2(class_name, argin[1:])
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbGetDeviceAttributeProperty2")
+        if len(argin) < 2:
+            self.warn_stream("DataBase::DbRenameServer(): insufficient number of arguments ")
+            th_exc(DB_IncorrectArguments,
+                   "insufficient number of arguments (two required: old name and new name",
+                   "DataBase::DbRenameServer")
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetDeviceAttributeProperty2
-        return argout
+        old_name = argin[0]
+        new_name = argin[1]
 
-#------------------------------------------------------------------
-#    DbGetDeviceAttributePropertyHist command:
-#------------------------------------------------------------------
-    def DbGetDeviceAttributePropertyHist(self, argin):
-        """ Retrieve device attribute property history
-        
-        :param argin: Str[0] = Device name
-        Str[1] = Attribute name
-        Str[2] = Property name
-        :type: PyTango.DevVarStringArray
-        :return: Str[0] = Attribute name
-        Str[1] = Property name
-        Str[2] = date
-        Str[3] = Property value number (array case)
-        Str[4] = Property value 1
-        Str[n] = Property value n
-        :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetDeviceAttributePropertyHist()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetDeviceAttributePropertyHist) ENABLED START -----#
+        if ('/' not in argin[0]) or ('/' not in argin[1]):
+            self.warn_stream("DataBase::DbRenameServer(): wrong syntax in command args ")
+            th_exc(DB_IncorrectArguments,
+                   "Wrong syntax in command args (ds_exec_name/inst_name)",
+                   "DataBase::DbRenameServer")
 
-        dev_name = argin[0]
-        attribute = replace_wildcard(argin[1])
-        prop_name = replace_wildcard(argin[2])
-        argout = self.db.get_device_attribute_property_hist(dev_name, attribute, prop_name)
+        self.db.rename_server(old_name, new_name)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetDeviceAttributePropertyHist
-        return argout
+    @stats
+    @command(dtype_in='str', doc_in='The filter', dtype_out=('str',), doc_out='Host name list')
+    def DbGetHostList(self, argin):
+        """ Get host list with name matching the specified filter
 
-#------------------------------------------------------------------
-#    DbGetDeviceClassList command:
-#------------------------------------------------------------------
-    def DbGetDeviceClassList(self, argin):
-        """ Get Tango classes/device list embedded in a specific device server
-        
-        :param argin: Device server process name
-        :type: PyTango.DevString
-        :return: Str[0] = Device name
-        Str[1] = Tango class
-        Str[n] = Device name
-        Str[n + 1] = Tango class
-        :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetDeviceClassList()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetDeviceClassList) ENABLED START -----#
-
-        time_before = time.time()
-        
-        argout = self.db.get_device_class_list(argin)
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbGetDeviceClassList")
-
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetDeviceClassList
-        return argout
-
-#------------------------------------------------------------------
-#    DbGetDeviceDomainList command:
-#------------------------------------------------------------------
-    def DbGetDeviceDomainList(self, argin):
-        """ Get list of device domain name matching the specified
-        
-        :param argin: The wildcard
+        :param argin: The filter
         :type: PyTango.DevString
-        :return: Device name domain list
+        :return: Host name list
         :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetDeviceDomainList()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetDeviceDomainList) ENABLED START -----#
-
-        time_before = time.time()
+        self._log.debug("In DbGetHostList()")
         argin = replace_wildcard(argin)
-        argout = self.db.get_device_domain_list(argin)
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbGetDeviceDomainList")
-        
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetDeviceDomainList
-        return argout
-
-#------------------------------------------------------------------
-#    DbGetDeviceExportedList command:
-#------------------------------------------------------------------
-    def DbGetDeviceExportedList(self, argin):
-        """ Get a list of exported devices whose names satisfy the filter (wildcard is
-        
-        :param argin: filter
+        return self.db.get_host_list(argin)
+
+    @command(dtype_in='str', doc_in='Device name', dtype_out=('str',), doc_out='Classes off the specified device.\n[0] - is the class of the device.\n[1] - is the class from the device class is inherited.\n........and so on')
+    def DbGetClassInheritanceForDevice(self, argin):
+        """ Get class inheritance for the specified device.
+
+        :param argin: Device name
         :type: PyTango.DevString
-        :return: list of exported devices
+        :return: Classes off the specified device.
+        [0] - is the class of the device.
+        [1] - is the class from the device class is inherited.
+        ........and so on
         :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetDeviceExportedList()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetDeviceExportedList) ENABLED START -----#
+        self._log.debug("In DbGetClassInheritanceForDevice()")
+        return self.db.get_class_inheritance_for_device(argin)
 
-        time_before = time.time()
-        
-        argin = replace_wildcard(argin)
-        argout = self.db.get_device_exported_list(argin)
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbGetDeviceExportedList")
-
-        
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetDeviceExportedList
-        return argout
+    @stats
+    @command(dtype_in='str', doc_in='Device server name', doc_out='none')
+    def DbDeleteServer(self, argin):
+        """ Delete server from the database but dont delete device properties
 
-#------------------------------------------------------------------
-#    DbGetDeviceFamilyList command:
-#------------------------------------------------------------------
-    def DbGetDeviceFamilyList(self, argin):
-        """ Get a list of device name families for device name matching the
-        specified wildcard
-        
-        :param argin: The wildcard
+        :param argin: Device server name
         :type: PyTango.DevString
-        :return: Family list
-        :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetDeviceFamilyList()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetDeviceFamilyList) ENABLED START -----#
+        :return:
+        :rtype: PyTango.DevVoid """
+        self._log.debug("In DbDeleteServer()")
 
-        time_before = time.time()
+        if '*' in argin or '%' in argin or not '/' in argin:
+            self.warn_stream("DataBase::db_delete_server(): server name " + argin + " incorrect ")
+            th_exc(DB_IncorrectServerName,
+                   "failed to delete server, server name incorrect",
+                   "DataBase::DeleteServer()")
 
-        argin = replace_wildcard(argin)
-        argout = self.db.get_device_family_list(argin)
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbGetDeviceFamilyList")
+        self.db.delete_server(argin)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetDeviceFamilyList
-        return argout
+    @command(dtype_in='str', doc_in='The attribute alias name', dtype_out='str', doc_out='The attribute name (device/attribute)')
+    def DbGetAttributeAlias(self, argin):
+        """ Get the attribute name for the given alias.
+        If alias not found in database, returns an empty string.
 
-#------------------------------------------------------------------
-#    DbGetDeviceInfo command:
-#------------------------------------------------------------------
-    def DbGetDeviceInfo(self, argin):
-        """ Returns info from DbImportDevice and started/stopped dates.
-        
-        :param argin: Device name
+        :param argin: The attribute alias name
         :type: PyTango.DevString
-        :return: Str[0] = Device name
-        Str[1] = CORBA IOR
-        Str[2] = Device version
-        Str[3] = Device Server name
-        Str[4] = Device Server process host name
-        Str[5] = Started date (or ? if not set)
-        Str[6] = Stopped date (or ? if not set)
-        Str[7] = Device class
-        
-        Lg[0] = Device exported flag
-        Lg[1] = Device Server process PID (or -1 if not set)
-        :rtype: PyTango.DevVarLongStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetDeviceInfo()")
-        argout = [0], ['']
+        :return: The attribute name (device/attribute)
+        :rtype: PyTango.DevString """
+        self._log.debug("In DbGetAttributeAlias()")
+        return self.db.get_attribute_alias(argin)
 
-        #----- PROTECTED REGION ID(DataBase.DbGetDeviceInfo) ENABLED START -----#
-        ret, dev_name, dfm = check_device_name(argin)
-        if not ret:
-            th_exc(DB_IncorrectDeviceName,
-                  "device name (" + argin + ") syntax error (should be [tango:][//instance/]domain/family/member)",
-                  "DataBase::DbGetDeviceAlias()")
+    @command(dtype_in=('str',), doc_in='Elt[0] = DS name (exec_name/inst_name), Elt[1] = Host name', dtype_out=('str',), doc_out='All the data needed by the device server during its startup sequence. Precise list depend on the device server')
+    def DbGetDataForServerCache(self, argin):
+        """ This command returns all the data needed by a device server process during its
+        startup sequence. The aim of this command is to minimize database access during
+        device server startup sequence.
 
-        argout = self.db.get_device_info(dev_name)
- 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetDeviceInfo
-        return argout
+        :param argin: Elt[0] = DS name (exec_name/inst_name), Elt[1] = Host name
+        :type: PyTango.DevVarStringArray
+        :return: All the data needed by the device server during its startup sequence. Precise list depend on the device server
+        :rtype: PyTango.DevVarStringArray """
+        self._log.debug("In DbGetDataForServerCache()")
+        ##  TODO
+        return ['']
 
-#------------------------------------------------------------------
-#    DbGetDeviceList command:
-#------------------------------------------------------------------
-    def DbGetDeviceList(self, argin):
-        """ Get a list of devices for specified server and class.
-        
-        :param argin: argin[0] : server name
-        argin[1] : class name
+    @command(dtype_in=('str',), doc_in='Str[0] = Object name\nStr[1] = Property name\nStr[n] = Property name', dtype_out=('str',), doc_out='Str[0] = Object name\nStr[1] = Property number\nStr[2] = Property name\nStr[3] = Property value number (array case)\nStr[4] = Property value 1\nStr[n] = Property value n (array case)\nStr[n + 1] = Property name\nStr[n + 2] = Property value number (array case)\nStr[n + 3] = Property value 1\nStr[n + m] = Property value m')
+    def DbGetProperty(self, argin):
+        """ Get free object property
+
+        :param argin: Str[0] = Object name
+        Str[1] = Property name
+        Str[n] = Property name
         :type: PyTango.DevVarStringArray
-        :return: The list of devices for specified server and class.
+        :return: Str[0] = Object name
+        Str[1] = Property number
+        Str[2] = Property name
+        Str[3] = Property value number (array case)
+        Str[4] = Property value 1
+        Str[n] = Property value n (array case)
+        Str[n + 1] = Property name
+        Str[n + 2] = Property value number (array case)
+        Str[n + 3] = Property value 1
+        Str[n + m] = Property value m
         :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetDeviceList()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetDeviceList) ENABLED START -----#
-        server_name = replace_wildcard(argin[0])
-        class_name = replace_wildcard(argin[1])
-        argout = self.db.get_device_list(server_name, class_name)
-        
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetDeviceList
-        return argout
-
-#------------------------------------------------------------------
-#    DbGetDeviceWideList command:
-#------------------------------------------------------------------
-    def DbGetDeviceWideList(self, argin):
-        """ Get a list of devices whose names satisfy the filter.
-        
-        :param argin: filter
+        self._log.debug("In DbGetProperty()")
+        object_name = argin[0]
+        return self.db.get_property(object_name, argin[1:])
+
+    @command(dtype_in='str', doc_in='device server process name', dtype_out=('str',), doc_out='list of classes for this device server')
+    def DbGetDeviceServerClassList(self, argin):
+        """ Get list of Tango classes for a device server
+
+        :param argin: device server process name
         :type: PyTango.DevString
-        :return: list of exported devices
+        :return: list of classes for this device server
         :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetDeviceWideList()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetDeviceWideList) ENABLED START -----#
-        
+        self._log.debug("In DbGetDeviceServerClassList()")
         argin = replace_wildcard(argin)
-        argout = self.db.get_device_wide_list(argin)
-        
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetDeviceWideList
-        return argout
-
-#------------------------------------------------------------------
-#    DbGetDeviceMemberList command:
-#------------------------------------------------------------------
-    def DbGetDeviceMemberList(self, argin):
-        """ Get a list of device name members for device name matching the
-        specified filter
-        
-        :param argin: The filter
-        :type: PyTango.DevString
-        :return: Device names member list
+        return self.db.get_server_class_list(argin)
+
+    @stats
+    @command(dtype_in=('str',), doc_in='Str[0] = Tango device name\nStr[1] = Property number\nStr[2] = Property name\nStr[3] = Property value number\nStr[4] = Property value 1\nStr[n] = Property value n\n....', doc_out='none')
+    def DbPutDeviceProperty(self, argin):
+        """ Create / Update device property(ies)
+
+        :param argin: Str[0] = Tango device name
+        Str[1] = Property number
+        Str[2] = Property name
+        Str[3] = Property value number
+        Str[4] = Property value 1
+        Str[n] = Property value n
+        ....
+        :type: PyTango.DevVarStringArray
+        :return:
+        :rtype: PyTango.DevVoid """
+        self._log.debug("In DbPutDeviceProperty()")
+        device_name = argin[0]
+        nb_properties = int(argin[1])
+        self.db.put_device_property(device_name, nb_properties, argin[2:])
+
+    @command(doc_in='none', doc_out='none')
+    def ResetTimingValues(self):
+        """ Reset the timing attribute values.
+
+        :param :
+        :type: PyTango.DevVoid
+        :return:
+        :rtype: PyTango.DevVoid """
+        self._log.debug("In ResetTimingValues()")
+        for tmp_timing in timing_maps.itervalues():
+            tmp_timing.average = 0.
+            tmp_timing.minimum = 0.
+            tmp_timing.maximum = 0.
+            tmp_timing.total_elapsed = 0.
+            tmp_timing.calls = 0.
+
+    @command(doc_in='none', dtype_out=('str',), doc_out='List of host:port with one element for each database server')
+    def DbGetCSDbServerList(self):
+        """ Get a list of host:port for all database server defined in the control system
+
+        :param :
+        :type: PyTango.DevVoid
+        :return: List of host:port with one element for each database server
         :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetDeviceMemberList()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetDeviceMemberList) ENABLED START -----#
+        self._log.debug("In DbGetCSDbServerList()")
+        return self.db.get_csdb_server_list()
 
-        time_before = time.time()
+    @stats
+    @command(dtype_in=('str',), doc_in='Str[0] = Tango class name\nStr[1] = Property number\nStr[2] = Property name\nStr[3] = Property value number\nStr[4] = Property value 1\nStr[n] = Property value n\n....', doc_out='none')
+    def DbPutClassProperty(self, argin):
+        """ Create / Update class property(ies)
 
-        argin = replace_wildcard(argin)
-        argout = self.db.get_device_member_list(argin)
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbGetDeviceMemberList")
+        :param argin: Str[0] = Tango class name
+        Str[1] = Property number
+        Str[2] = Property name
+        Str[3] = Property value number
+        Str[4] = Property value 1
+        Str[n] = Property value n
+        ....
+        :type: PyTango.DevVarStringArray
+        :return:
+        :rtype: PyTango.DevVoid """
+        self._log.debug("In DbPutClassProperty()")
+        class_name = argin[0]
+        nb_properties = int(argin[1])
+        self.db.put_class_property(class_name, properties, argin[2:])
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetDeviceMemberList
-        return argout
+    @stats
+    @command(dtype_in='str', doc_in='Device name (or alias)', dtype_out='DevVarLongStringArray', doc_out='Str[0] = device name\nStr[1] = CORBA IOR\nStr[2] = device version\nStr[3] = device server process name\nStr[4] = host name\nStr[5] = Tango class name\n\nLg[0] = Exported flag\nLg[1] = Device server process PID')
+    def DbImportDevice(self, argin):
+        """ Import a device from the database
+
+        :param argin: Device name (or alias)
+        :type: PyTango.DevString
+        :return: Str[0] = device name
+        Str[1] = CORBA IOR
+        Str[2] = device version
+        Str[3] = device server process name
+        Str[4] = host name
+        Str[5] = Tango class name
+
+        Lg[0] = Exported flag
+        Lg[1] = Device server process PID
+        :rtype: PyTango.DevVarLongStringArray """
+        self._log.debug("In DbImportDevice()")
+        return self.db.import_device(argin.lower())
+
+    @stats
+    @command(dtype_in=('str',), doc_in='Str[0] = Device name\nStr[1] = Property name\nStr[n] = Property name', doc_out='none')
+    def DbDeleteDeviceProperty(self, argin):
+        """ Delete device property(ies)
 
-#------------------------------------------------------------------
-#    DbGetDeviceProperty command:
-#------------------------------------------------------------------
-    def DbGetDeviceProperty(self, argin):
-        """ 
-        
         :param argin: Str[0] = Device name
         Str[1] = Property name
         Str[n] = Property name
         :type: PyTango.DevVarStringArray
-        :return: Str[0] = Device name
-        Str[1] = Property number
+        :return:
+        :rtype: PyTango.DevVoid """
+        self._log.debug("In DbDeleteDeviceProperty()")
+        dev_name = argin[0]
+        for prop_name in argin[1:]:
+            self.db.delete_device_property(dev_name, prop_name)
+
+    @command(dtype_in='str', doc_in='Device name', dtype_out='str', doc_out='Device Tango class')
+    def DbGetClassForDevice(self, argin):
+        """ Get Tango class for the specified device.
+
+        :param argin: Device name
+        :type: PyTango.DevString
+        :return: Device Tango class
+        :rtype: PyTango.DevString """
+        self._log.debug("In DbGetClassForDevice()")
+        return self.db.get_class_for_device(argin)
+
+    @command(dtype_in=('str',), doc_in='Str[0] = Device name\nStr[1] = Attribute name\nStr[2] = Property name', dtype_out=('str',), doc_out='Str[0] = Attribute name\nStr[1] = Property name\nStr[2] = date\nStr[3] = Property value number (array case)\nStr[4] = Property value 1\nStr[n] = Property value n')
+    def DbGetDeviceAttributePropertyHist(self, argin):
+        """ Retrieve device attribute property history
+
+        :param argin: Str[0] = Device name
+        Str[1] = Attribute name
         Str[2] = Property name
+        :type: PyTango.DevVarStringArray
+        :return: Str[0] = Attribute name
+        Str[1] = Property name
+        Str[2] = date
         Str[3] = Property value number (array case)
         Str[4] = Property value 1
-        Str[n] = Property value n (array case)
-        Str[n + 1] = Property name
-        Str[n + 2] = Property value number (array case)
-        Str[n + 3] = Property value 1
-        Str[n + m] = Property value m
+        Str[n] = Property value n
         :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetDeviceProperty()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetDeviceProperty) ENABLED START -----#
+        self._log.debug("In DbGetDeviceAttributePropertyHist()")
+        dev_name = argin[0]
+        attribute = replace_wildcard(argin[1])
+        prop_name = replace_wildcard(argin[2])
+        return self.db.get_device_attribute_property_hist(dev_name, attribute, prop_name)
 
-        time_before = time.time()
+    @command(dtype_in='str', doc_in='server name', dtype_out=('str',), doc_out='server info')
+    def DbGetServerInfo(self, argin):
+        """ Get info about host, mode and level for specified server
 
-        device_name = argin[0]
-        argout = self.db.get_device_property(device_name, argin[1:])
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbGetDeviceProperty")
+        :param argin: server name
+        :type: PyTango.DevString
+        :return: server info
+        :rtype: PyTango.DevVarStringArray """
+        self._log.debug("In DbGetServerInfo()")
+        return self.db.get_server_info(argin)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetDeviceProperty
-        return argout
+    @command(dtype_in=('str',), doc_in='Str[0] = device name\nStr[1] = alias name', doc_out='none')
+    def DbPutDeviceAlias(self, argin):
+        """ Define alias for  a given device name
 
-#------------------------------------------------------------------
-#    DbGetDevicePropertyHist command:
-#------------------------------------------------------------------
-    def DbGetDevicePropertyHist(self, argin):
-        """ Retrieve device  property history
-        
-        :param argin: Str[0] = Device name
-        Str[1] = Property name
+        :param argin: Str[0] = device name
+        Str[1] = alias name
         :type: PyTango.DevVarStringArray
-        :return: Str[0] = Property name
-        Str[1] = date
-        Str[2] = Property value number (array case)
-        Str[3] = Property value 1
-        Str[n] = Property value n
-        :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetDevicePropertyHist()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetDevicePropertyHist) ENABLED START -----#
+        :return:
+        :rtype: PyTango.DevVoid """
+        self._log.debug("In DbPutDeviceAlias()")
 
-        device_name = argin[0]
-        prop_name = argin[1]
-        argout = self.db.get_device_property_hist(device_name, prop_name)
-        
+        if len(argin) < 2:
+            self.warn_stream("DataBase::DbPutDeviceAlias(): insufficient number of arguments ")
+            th_exc(DB_IncorrectArguments,
+                   "insufficient number of arguments to put device alias",
+                   "DataBase::DbPutDeviceAlias()")
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetDevicePropertyHist
-        return argout
+        device_name = argin[0]
+        device_alias = argin[1]
+        self.db.put_device_alias(device_name, device_alias)
 
-#------------------------------------------------------------------
-#    DbGetDevicePropertyList command:
-#------------------------------------------------------------------
+    @stats
+    @command(dtype_in=('str',), doc_in='Str[0] = device name\nStr[1] = Filter', dtype_out=('str',), doc_out='Property name list')
     def DbGetDevicePropertyList(self, argin):
         """ Get property list belonging to the specified device and with
         name matching the specified filter
-        
+
         :param argin: Str[0] = device name
         Str[1] = Filter
         :type: PyTango.DevVarStringArray
         :return: Property name list
         :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetDevicePropertyList()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetDevicePropertyList) ENABLED START -----#
-
-        time_before = time.time()
-        
+        self._log.debug("In DbGetDevicePropertyList()")
         device_name = argin[0]
         prop_filter = argin[1]
-    
         prop_filter = replace_wildcard(prop_filter)
-            
-        argout = self.db.get_device_property_list(device_name, prop_filter)
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbGetDevicePropertyList")
-
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetDevicePropertyList
-        return argout
-
-#------------------------------------------------------------------
-#    DbGetDeviceServerClassList command:
-#------------------------------------------------------------------
-    def DbGetDeviceServerClassList(self, argin):
-        """ Get list of Tango classes for a device server
-        
-        :param argin: device server process name
-        :type: PyTango.DevString
-        :return: list of classes for this device server
-        :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetDeviceServerClassList()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetDeviceServerClassList) ENABLED START -----#
-        
-        argin = replace_wildcard(argin)
-            
-        argout = self.db.get_server_class_list(argin)
+        return self.db.get_device_property_list(device_name, prop_filter)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetDeviceServerClassList
-        return argout
+    @stats
+    @command(dtype_in='str', doc_in='The filter', dtype_out=('str',), doc_out='Device server process name list')
+    def DbGetHostServerList(self, argin):
+        """ Get list of device server process name running on host with name matching
+        the specified filter
 
-#------------------------------------------------------------------
-#    DbGetExportdDeviceListForClass command:
-#------------------------------------------------------------------
-    def DbGetExportdDeviceListForClass(self, argin):
-        """ Query the database for device exported for the specified class.
-        
-        :param argin: Class name
+        :param argin: The filter
         :type: PyTango.DevString
-        :return: Device exported list
+        :return: Device server process name list
         :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetExportdDeviceListForClass()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetExportdDeviceListForClass) ENABLED START -----#
-        
+        self._log.debug("In DbGetHostServerList()")
         argin = replace_wildcard(argin)
-            
-        argout = self.db.get_exported_device_list_for_class(argin)
+        return self.db.get_host_server_list(argin)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetExportdDeviceListForClass
-        return argout
+    @command(dtype_in=('str',), doc_in='Str[0] = Tango class\nStr[1] = Property name\nStr[2] = Property name', dtype_out=('str',), doc_out='Str[0] = Tango class\nStr[1] = Property number\nStr[2] = Property name\nStr[3] = Property value number (array case)\nStr[4] = Property value\nStr[n] = Propery value (array case)\n....')
+    def DbGetClassProperty(self, argin):
+        """
 
-#------------------------------------------------------------------
-#    DbGetHostList command:
-#------------------------------------------------------------------
-    def DbGetHostList(self, argin):
-        """ Get host list with name matching the specified filter
-        
-        :param argin: The filter
-        :type: PyTango.DevString
-        :return: Host name list
+        :param argin: Str[0] = Tango class
+        Str[1] = Property name
+        Str[2] = Property name
+        :type: PyTango.DevVarStringArray
+        :return: Str[0] = Tango class
+        Str[1] = Property number
+        Str[2] = Property name
+        Str[3] = Property value number (array case)
+        Str[4] = Property value
+        Str[n] = Propery value (array case)
+        ....
         :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetHostList()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetHostList) ENABLED START -----#
-
-        time_before = time.time()
-        
-        argin = replace_wildcard(argin)           
-        argout = self.db.get_host_list(argin)
-
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbGetHostList")
+        self._log.debug("In DbGetClassProperty()")
+        class_name = argin[0]
+        return self.db.get_class_property(class_name,argin[1:])
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetHostList
-        return argout
+    @command(dtype_in='str', doc_in='The filter', dtype_out=('str',), doc_out='Object name list')
+    def DbGetObjectList(self, argin):
+        """ Get list of free object defined in database with name
+        matching the specified filter
 
-#------------------------------------------------------------------
-#    DbGetHostServerList command:
-#------------------------------------------------------------------
-    def DbGetHostServerList(self, argin):
-        """ Get list of device server process name running on host with name matching
-        the specified filter
-        
         :param argin: The filter
         :type: PyTango.DevString
-        :return: Device server process name list
+        :return: Object name list
         :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetHostServerList()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetHostServerList) ENABLED START -----#
-
-        time_before = time.time()
-        
-        argin = replace_wildcard(argin)            
-        argout = self.db.get_host_server_list(argin)
+        self._log.debug("In DbGetObjectList()")
+        argin = replace_wildcard(argin)
+        return self.db.get_object_list(argin)
 
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbGetHostServerList")
+    @command(dtype_in=('str',), doc_in='Str[0] = Tango class name\nStr[1] = Attribute name\nStr[2] = Property name\nStr[n] = Property name', doc_out='none')
+    def DbDeleteClassAttributeProperty(self, argin):
+        """ delete class attribute properties from database
 
+        :param argin: Str[0] = Tango class name
+        Str[1] = Attribute name
+        Str[2] = Property name
+        Str[n] = Property name
+        :type: PyTango.DevVarStringArray
+        :return:
+        :rtype: PyTango.DevVoid """
+        self._log.debug("In DbDeleteClassAttributeProperty()")
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetHostServerList
-        return argout
+        if len(argin) < 3:
+            self.warn_stream("DataBase::db_delete_class_attribute_property(): insufficient number of arguments ")
+            th_exc(DB_IncorrectArguments,
+                   "insufficient number of arguments to delete class attribute property",
+                   "DataBase::DeleteClassAttributeProperty()")
 
-#------------------------------------------------------------------
-#    DbGetHostServersInfo command:
-#------------------------------------------------------------------
-    def DbGetHostServersInfo(self, argin):
-        """ Get info about all servers running on specified host, name, mode and level
-        
-        :param argin: Host name
-        :type: PyTango.DevString
-        :return: Server info for all servers running on specified host
-        :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetHostServersInfo()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetHostServersInfo) ENABLED START -----#
-        
-        argin = replace_wildcard(argin)
-            
-        argout = self.db.get_host_servers_info(argin)
+        klass_name, attr_name = argin[:2]
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetHostServersInfo
-        return argout
+        for prop_name in argin[2:]:
+            self.db.delete_class_attribute_property(klass_name, attr_name, prop_name)
 
-#------------------------------------------------------------------
-#    DbGetInstanceNameList command:
-#------------------------------------------------------------------
+    @command(dtype_in='str', doc_in='Server name', dtype_out=('str',), doc_out='The instance names found for specified server.')
     def DbGetInstanceNameList(self, argin):
         """ Returns the instance names found for specified server.
-        
+
         :param argin: Server name
         :type: PyTango.DevString
         :return: The instance names found for specified server.
         :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetInstanceNameList()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetInstanceNameList) ENABLED START -----#
-        
-        argout = self.db.get_instance_name_list(argin)
-        
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetInstanceNameList
-        return argout
-
-#------------------------------------------------------------------
-#    DbGetObjectList command:
-#------------------------------------------------------------------
-    def DbGetObjectList(self, argin):
-        """ Get list of free object defined in database with name
-        matching the specified filter
-        
-        :param argin: The filter
+        self._log.debug("In DbGetInstanceNameList()")
+        return self.db.get_instance_name_list(argin)
+
+    @command(dtype_in='str', doc_in='The attribute name (dev_name/att_name)', dtype_out='str', doc_out='The attribute alias name (or empty string)')
+    def DbGetAttributeAlias2(self, argin):
+        """ Get the attribute alias from the attribute name.
+        Returns one empty string if nothing found in database
+
+        :param argin: The attribute name (dev_name/att_name)
         :type: PyTango.DevString
-        :return: Object name list
-        :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetObjectList()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetObjectList) ENABLED START -----#
-        
-        argin = replace_wildcard(argin)
-        argout = self.db.get_object_list(argin)
-        
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetObjectList
-        return argout
-
-#------------------------------------------------------------------
-#    DbGetProperty command:
-#------------------------------------------------------------------
-    def DbGetProperty(self, argin):
-        """ Get free object property
-        
-        :param argin: Str[0] = Object name
-        Str[1] = Property name
-        Str[n] = Property name
+        :return: The attribute alias name (or empty string)
+        :rtype: PyTango.DevString """
+        self._log.debug("In DbGetAttributeAlias2()")
+        attr_name = argin[0]
+        return self.db.get_attribute_alias2(attr_name)
+
+    @command(dtype_in=('str',), doc_in='Str[0] = Full device server name\nStr[1] = Device(s) name\nStr[2] = Tango class name\nStr[n] = Device name\nStr[n + 1] = Tango class name', doc_out='none')
+    def DbAddServer(self, argin):
+        """ Create a device server process entry in database
+
+        :param argin: Str[0] = Full device server name
+        Str[1] = Device(s) name
+        Str[2] = Tango class name
+        Str[n] = Device name
+        Str[n + 1] = Tango class name
         :type: PyTango.DevVarStringArray
-        :return: Str[0] = Object name
-        Str[1] = Property number
-        Str[2] = Property name
-        Str[3] = Property value number (array case)
-        Str[4] = Property value 1
-        Str[n] = Property value n (array case)
-        Str[n + 1] = Property name
-        Str[n + 2] = Property value number (array case)
-        Str[n + 3] = Property value 1
-        Str[n + m] = Property value m
-        :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetProperty()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetProperty) ENABLED START -----#
+        :return:
+        :rtype: PyTango.DevVoid """
+        self._log.debug("In DbAddServer()")
 
-        object_name = argin[0]
-        argout = self.db.get_property(object_name, argin[1:])
+        if len(argin) < 3 or not len(argin) % 2:
+            self.warn_stream("DataBase::AddServer(): incorrect number of input arguments ")
+            th_exc(DB_IncorrectArguments,
+                   "incorrect no. of input arguments, needs at least 3 (server,device,class)",
+                   "DataBase::AddServer()")
+        server_name = argin[0]
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetProperty
-        return argout
+        for i in range((len(argin) - 1) / 2):
+            d_name, klass_name = argin[i * 2 + 1], argin[i * 2 + 2]
+            ret, dev_name, dfm = check_device_name(d_name)
+            if not ret:
+                th_exc(DB_IncorrectDeviceName,
+                      "device name (" + d_name + ") syntax error (should be [tango:][//instance/]domain/family/member)",
+                      "DataBase::AddServer()")
+            self.db.add_device(server_name, (dev_name, dfm) , klass_name)
 
-#------------------------------------------------------------------
-#    DbGetPropertyHist command:
-#------------------------------------------------------------------
-    def DbGetPropertyHist(self, argin):
-        """ Retrieve object  property history
-        
-        :param argin: Str[0] = Object name
-        Str[2] = Property name
+    @stats
+    @command(dtype_in='str', doc_in='name of event channel or factory', dtype_out='DevVarLongStringArray', doc_out='export information e.g. IOR')
+    def DbImportEvent(self, argin):
+        """ Get event channel info from database
+
+        :param argin: name of event channel or factory
+        :type: PyTango.DevString
+        :return: export information e.g. IOR
+        :rtype: PyTango.DevVarLongStringArray """
+        self._log.debug("In DbImportEvent()")
+        argin = replace_wildcard(argin.lower())
+        return self.db.import_event(argin)
+
+    @command(dtype_in=('str',), doc_in='Str[0] = Device name\nStr[2] = Property name', dtype_out=('str',), doc_out='Str[0] = Property name\nStr[1] = date\nStr[2] = Property value number (array case)\nStr[3] = Property value 1\nStr[n] = Property value n')
+    def DbGetDevicePropertyHist(self, argin):
+        """ Retrieve device  property history
+
+        :param argin: Str[0] = Device name
+        Str[1] = Property name
         :type: PyTango.DevVarStringArray
         :return: Str[0] = Property name
         Str[1] = date
@@ -1754,174 +1334,85 @@ class DataBase (PyTango.Device_4Impl):
         Str[3] = Property value 1
         Str[n] = Property value n
         :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetPropertyHist()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetPropertyHist) ENABLED START -----#
-
-        object_name = argin[0]
+        self._log.debug("In DbGetDevicePropertyHist()")
+        device_name = argin[0]
         prop_name = argin[1]
-        argout = self.db.get_property_hist(object_name, prop_name)
-
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetPropertyHist
-        return argout
-
-#------------------------------------------------------------------
-#    DbGetPropertyList command:
-#------------------------------------------------------------------
-    def DbGetPropertyList(self, argin):
-        """ Get list of property defined for a free object and matching the
-        specified filter
-        
-        :param argin: Str[0] = Object name
-        Str[1] = filter
-        :type: PyTango.DevVarStringArray
-        :return: Property name list
-        :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetPropertyList()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetPropertyList) ENABLED START -----#
-
-        object_name = argin[0]
-        wildcard = replace_wildcard(argin[1])
-
-        argout = self.db.get_property_list(object_name, wildcard)
-
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetPropertyList
-        return argout
-
-#------------------------------------------------------------------
-#    DbGetServerInfo command:
-#------------------------------------------------------------------
-    def DbGetServerInfo(self, argin):
-        """ Get info about host, mode and level for specified server
-        
-        :param argin: server name
-        :type: PyTango.DevString
-        :return: server info
-        :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetServerInfo()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetServerInfo) ENABLED START -----#
-        
-        argout = self.db.get_server_info(argin)
-
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetServerInfo
-        return argout
-
-#------------------------------------------------------------------
-#    DbGetServerList command:
-#------------------------------------------------------------------
-    def DbGetServerList(self, argin):
-        """ Get list of device server process defined in database
-        with name matching the specified filter
-        
-        :param argin: The filter
-        :type: PyTango.DevString
-        :return: Device server process name list
-        :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetServerList()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetServerList) ENABLED START -----#
+        return self.db.get_device_property_hist(device_name, prop_name)
 
-        time_before = time.time()
-
-        argin = replace_wildcard(argin)
-        argout = self.db.get_server_list(argin)
-
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbGetServerList")
-        
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetServerList
-        return argout
-
-#------------------------------------------------------------------
-#    DbGetServerNameList command:
-#------------------------------------------------------------------
+    @command(dtype_in='str', doc_in='wildcard for server names.', dtype_out=('str',), doc_out='server names found.')
     def DbGetServerNameList(self, argin):
         """ Returns the list of server names found for the wildcard specified.
         It returns only the server executable name without instance name as DbGetServerList.
-        
+
         :param argin: wildcard for server names.
         :type: PyTango.DevString
         :return: server names found.
         :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetServerNameList()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetServerNameList) ENABLED START ----
-
+        self._log.debug("In DbGetServerNameList()")
         argin = replace_wildcard(argin)
-        argout = self.db.get_server_name_list(argin)
+        return self.db.get_server_name_list(argin)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetServerNameList
-        return argout
+    @stats
+    @command(dtype_in=('str',), doc_in='Str[0] = Device name\nStr[1] = Attribute name\nStr[n] = Attribute name', dtype_out=('str',), doc_out='Str[0] = Device name\nStr[1] = Attribute property  number\nStr[2] = Attribute property 1 name\nStr[3] = Attribute property 1 value number (array case)\nStr[4] = Attribute property 1 value\nStr[n] = Attribute property 1 value (array case)\nStr[n + 1] = Attribute property 2 name\nStr[n + 2] = Attribute property 2 value number (array case)\nStr[n + 3] [...]
+    def DbGetDeviceAttributeProperty2(self, argin):
+        """ Retrieve device attribute properties. This command has the possibility to retrieve
+        device attribute properties which are arrays. It is not possible with the old
+        DbGetDeviceAttributeProperty command. Nevertheless, the old command has not been
+        deleted for compatibility reason
 
-#------------------------------------------------------------------
-#    DbImportDevice command:
-#------------------------------------------------------------------
-    def DbImportDevice(self, argin):
-        """ Import a device from the database
-        
-        :param argin: Device name (or alias)
-        :type: PyTango.DevString
-        :return: Str[0] = device name
-        Str[1] = CORBA IOR
-        Str[2] = device version
-        Str[3] = device server process name
-        Str[4] = host name
-        Str[5] = Tango class name
-        
-        Lg[0] = Exported flag
-        Lg[1] = Device server process PID
-        :rtype: PyTango.DevVarLongStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbImportDevice()")
-        argout = [0], ['']
-        #----- PROTECTED REGION ID(DataBase.DbImportDevice) ENABLED START -----#
-
-        time_before = time.time()
-        
-        argout = self.db.import_device(argin.lower())
-
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbImportDevice")
-        
-        #----- PROTECTED REGION END -----#	//	DataBase.DbImportDevice
-        return argout
-
-#------------------------------------------------------------------
-#    DbImportEvent command:
-#------------------------------------------------------------------
-    def DbImportEvent(self, argin):
-        """ Get event channel info from database
-        
-        :param argin: name of event channel or factory
-        :type: PyTango.DevString
-        :return: export information e.g. IOR
-        :rtype: PyTango.DevVarLongStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbImportEvent()")
-        argout = [0], ['']
-        #----- PROTECTED REGION ID(DataBase.DbImportEvent) ENABLED START -----#
+        :param argin: Str[0] = Device name
+        Str[1] = Attribute name
+        Str[n] = Attribute name
+        :type: PyTango.DevVarStringArray
+        :return: Str[0] = Device name
+        Str[1] = Attribute property  number
+        Str[2] = Attribute property 1 name
+        Str[3] = Attribute property 1 value number (array case)
+        Str[4] = Attribute property 1 value
+        Str[n] = Attribute property 1 value (array case)
+        Str[n + 1] = Attribute property 2 name
+        Str[n + 2] = Attribute property 2 value number (array case)
+        Str[n + 3] = Attribute property 2 value
+        Str[n + m] = Attribute property 2 value (array case)
+        :rtype: PyTango.DevVarStringArray """
+        self._log.debug("In DbGetDeviceAttributeProperty2()")
+        dev_name = argin[0]
+        return self.db.get_device_attribute_property2(dev_name, argin[1:])
 
-        time_before = time.time()
-        
-        argin = replace_wildcard(argin.lower())
+    @command(dtype_in=('str',), doc_in='Str[0] = Tango class name\nStr[1] = Property name\nStr[n] = Property name', doc_out='none')
+    def DbDeleteClassProperty(self, argin):
+        """ Delete class properties from database
 
-        argout = self.db.import_event(argin)
+        :param argin: Str[0] = Tango class name
+        Str[1] = Property name
+        Str[n] = Property name
+        :type: PyTango.DevVarStringArray
+        :return:
+        :rtype: PyTango.DevVoid """
+        self._log.debug("In DbDeleteClassProperty()")
+        klass_name = argin[0]
+        for prop_name in argin[1:]:
+            self.db.delete_class_property(prop_name)
 
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbImportEvent")
-        
+    @command(dtype_in='str', doc_in='name of event channel or factory to unexport', doc_out='none')
+    def DbUnExportEvent(self, argin):
+        """ Mark one event channel as non exported in database
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbImportEvent
-        return argout
+        :param argin: name of event channel or factory to unexport
+        :type: PyTango.DevString
+        :return: none
+        :rtype: PyTango.DevVoid """
+        self._log.debug("In DbUnExportEvent()")
+        event_name = argin[0].lower()
+        self.db.unexport_event(event_name)
 
-#------------------------------------------------------------------
-#    DbInfo command:
-#------------------------------------------------------------------
+    @stats
+    @command(doc_in='none', dtype_out=('str',), doc_out='Miscellaneous info like:\n- Device defined in database\n- Device marked as exported in database\n- Device server process defined in database\n- Device server process marked as exported in database\n- Device properties defined in database\n- Class properties defined in database\n- Device attribute properties defined in database\n- Class attribute properties defined in database\n- Object properties defined in database')
     def DbInfo(self):
         """ Get miscellaneous numbers on information
         stored in database
-        
-        :param : 
+
+        :param :
         :type: PyTango.DevVoid
         :return: Miscellaneous info like:
         - Device defined in database
@@ -1934,83 +1425,33 @@ class DataBase (PyTango.Device_4Impl):
         - Class attribute properties defined in database
         - Object properties defined in database
         :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbInfo()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbInfo) ENABLED START -----#
-
-        time_before = time.time()
-
-        argout = self.db.info()
-
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbInfo")
-
-        #----- PROTECTED REGION END -----#	//	DataBase.DbInfo
-        return argout
-
-#------------------------------------------------------------------
-#    DbPutAttributeAlias command:
-#------------------------------------------------------------------
-    def DbPutAttributeAlias(self, argin):
-        """ Define an alias for an attribute
-        
-        :param argin: Str[0] = attribute name
-        Str[1] = attribute alias
-        :type: PyTango.DevVarStringArray
-        :return: 
-        :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbPutAttributeAlias()")
-        #----- PROTECTED REGION ID(DataBase.DbPutAttributeAlias) ENABLED START -----#
-
-        if len(argin) < 2:
-            self.warn_stream("DataBase::DbPutAttributeAlias(): insufficient number of arguments ")
-            th_exc(DB_IncorrectArguments,
-                   "insufficient number of arguments to put attribute alias",
-                   "DataBase::DbPutAttributeAlias()")
-
-        attribute_name = argin[0]
-        attribute_alias = argin[1]
-        self.db.put_attribute_alias(attribute_name, attribute_alias)
+        self._log.debug("In DbInfo()")
+        return self.db.info()
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbPutAttributeAlias
+    @command(dtype_in=('str',), doc_in='Str[0] = Tango class name\nStr[1] = Attribute name\nStr[n] = Attribute name', dtype_out=('str',), doc_out='Str[0] = Tango class name\nStr[1] = Attribute property  number\nStr[2] = Attribute property 1 name\nStr[3] = Attribute property 1 value\nStr[n + 1] = Attribute property 2 name\nStr[n + 2] = Attribute property 2 value')
+    def DbGetClassAttributeProperty(self, argin):
+        """ Get Tango class property(ies) value
 
-#------------------------------------------------------------------
-#    DbPutClassAttributeProperty command:
-#------------------------------------------------------------------
-    def DbPutClassAttributeProperty(self, argin):
-        """ Create/Update class attribute property(ies) in database
-        
         :param argin: Str[0] = Tango class name
-        Str[1] = Attribute number
-        Str[2] = Attribute name
-        Str[3] = Property number
-        Str[4] = Property name
-        Str[5] = Property value
-        .....
+        Str[1] = Attribute name
+        Str[n] = Attribute name
         :type: PyTango.DevVarStringArray
-        :return: 
-        :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbPutClassAttributeProperty()")
-        #----- PROTECTED REGION ID(DataBase.DbPutClassAttributeProperty) ENABLED START -----#
-        
+        :return: Str[0] = Tango class name
+        Str[1] = Attribute property  number
+        Str[2] = Attribute property 1 name
+        Str[3] = Attribute property 1 value
+        Str[n + 1] = Attribute property 2 name
+        Str[n + 2] = Attribute property 2 value
+        :rtype: PyTango.DevVarStringArray """
+        self._log.debug("In DbGetClassAttributeProperty()")
         class_name = argin[0]
-        nb_attributes = int(argin[1])
-        
-        
-        self.info_stream("DataBase::DbPutClassAttributeProperty(): put " + str(nb_attributes) + " attributes for class " + class_name)
-        
-        self.db.put_class_attribute_property(class_name, nb_attributes, argin[2:])
-        
-        
-        #----- PROTECTED REGION END -----#	//	DataBase.DbPutClassAttributeProperty
+        return self.db.get_class_attribute_property(class_name, argin[1:])
 
-#------------------------------------------------------------------
-#    DbPutClassAttributeProperty2 command:
-#------------------------------------------------------------------
+    @command(dtype_in=('str',), doc_in='Str[0] = Tango class name\nStr[1] = Attribute number\nStr[2] = Attribute name\nStr[3] = Property number\nStr[4] = Property name\nStr[5] = Property value number (array case)\nStr[5] = Property value 1\nStr[n] = Property value n (array case)\n.....', doc_out='none')
     def DbPutClassAttributeProperty2(self, argin):
         """ This command adds support for array properties compared to the previous one
         called DbPutClassAttributeProperty. The old comman is still there for compatibility reason
-        
+
         :param argin: Str[0] = Tango class name
         Str[1] = Attribute number
         Str[2] = Attribute name
@@ -2021,225 +1462,22 @@ class DataBase (PyTango.Device_4Impl):
         Str[n] = Property value n (array case)
         .....
         :type: PyTango.DevVarStringArray
-        :return: 
+        :return:
         :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbPutClassAttributeProperty2()")
-        #----- PROTECTED REGION ID(DataBase.DbPutClassAttributeProperty2) ENABLED START -----#
+        self._log.debug("In DbPutClassAttributeProperty2()")
         class_name = argin[0]
         nb_attributes = int(argin[1])
-        
-        self.info_stream("DataBase::DbPutClassAttributeProperty2(): put " + str(nb_attributes) + " attributes for class " + class_name)
-        
         self.db.put_class_attribute_property2(class_name, nb_attributes, argin[2:])
-        
-        #----- PROTECTED REGION END -----#	//	DataBase.DbPutClassAttributeProperty2
-
-#------------------------------------------------------------------
-#    DbPutClassProperty command:
-#------------------------------------------------------------------
-    def DbPutClassProperty(self, argin):
-        """ Create / Update class property(ies)
-        
-        :param argin: Str[0] = Tango class name
-        Str[1] = Property number
-        Str[2] = Property name
-        Str[3] = Property value number
-        Str[4] = Property value 1
-        Str[n] = Property value n
-        ....
-        :type: PyTango.DevVarStringArray
-        :return: 
-        :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbPutClassProperty()")
-        #----- PROTECTED REGION ID(DataBase.DbPutClassProperty) ENABLED START -----#
-
-        time_before = time.time()
-
-        class_name = argin[0]
-        nb_properties = int(argin[1])
-        
-        self.info_stream("DataBase::DbPutClassProperty(): put " + str(nb_properties) + " attributes for class " + class_name)
-        
-        self.db.put_class_property(class_name, properties, argin[2:])
-
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbPutClassProperty")
-
-        
-        #----- PROTECTED REGION END -----#	//	DataBase.DbPutClassProperty
-
-#------------------------------------------------------------------
-#    DbPutDeviceAlias command:
-#------------------------------------------------------------------
-    def DbPutDeviceAlias(self, argin):
-        """ Define alias for  a given device name
-        
-        :param argin: Str[0] = device name
-        Str[1] = alias name
-        :type: PyTango.DevVarStringArray
-        :return: 
-        :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbPutDeviceAlias()")
-        #----- PROTECTED REGION ID(DataBase.DbPutDeviceAlias) ENABLED START -----#
-
-        if len(argin) < 2:
-            self.warn_stream("DataBase::DbPutDeviceAlias(): insufficient number of arguments ")
-            th_exc(DB_IncorrectArguments,
-                   "insufficient number of arguments to put device alias",
-                   "DataBase::DbPutDeviceAlias()")
-
-        device_name = argin[0]
-        device_alias = argin[1]
-        self.db.put_device_alias(device_name, device_alias)
-
-
-        
-        #----- PROTECTED REGION END -----#	//	DataBase.DbPutDeviceAlias
-
-#------------------------------------------------------------------
-#    DbPutDeviceAttributeProperty command:
-#------------------------------------------------------------------
-    def DbPutDeviceAttributeProperty(self, argin):
-        """ Create/Update device attribute property(ies) in database
-        
-        :param argin: Str[0] = Device name
-        Str[1] = Attribute number
-        Str[2] = Attribute name
-        Str[3] = Property number
-        Str[4] = Property name
-        Str[5] = Property value
-        .....
-        :type: PyTango.DevVarStringArray
-        :return: 
-        :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbPutDeviceAttributeProperty()")
-        #----- PROTECTED REGION ID(DataBase.DbPutDeviceAttributeProperty) ENABLED START -----#
 
-        time_before = time.time()
-
-        device_name = argin[0]
-        nb_attributes = int(argin[1])
-              
-        self.info_stream("DataBase::DbPutDeviceAttributeProperty(): put " + str(nb_attributes) + " attributes for device " + device_name)
-        
-        self.db.put_device_attribute_property(device_name, nb_attributes, argin[2:])
-
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbPutDeviceAttributeProperty")
-
-        #----- PROTECTED REGION END -----#	//	DataBase.DbPutDeviceAttributeProperty
-
-#------------------------------------------------------------------
-#    DbPutDeviceAttributeProperty2 command:
-#------------------------------------------------------------------
-    def DbPutDeviceAttributeProperty2(self, argin):
-        """ Put device attribute property. This command adds the possibility to have attribute property
-        which are arrays. Not possible with the old DbPutDeviceAttributeProperty command.
-        This old command is not deleted for compatibility reasons.
-        
-        :param argin: Str[0] = Device name
-        Str[1] = Attribute number
-        Str[2] = Attribute name
-        Str[3] = Property number
-        Str[4] = Property name
-        Str[5] = Property value number (array case)
-        Str[5] = Property value 1
-        Str[n] = Property value n (array case)
-        .....
-        :type: PyTango.DevVarStringArray
-        :return: 
-        :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbPutDeviceAttributeProperty2()")
-        #----- PROTECTED REGION ID(DataBase.DbPutDeviceAttributeProperty2) ENABLED START -----#
-
-        time_before = time.time()
-
-        device_name = argin[0]
-        nb_attributes = int(argin[1])
-        
-        self.info_stream("DataBase::DbPutDeviceAttributeProperty2(): put " + str(nb_attributes) + " attributes for device " + device_name)
-        
-        self.db.put_device_attribute_property2(device_name, nb_attributes, argin[2:])
-
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbPutDeviceAttributeProperty2")
-
-
-        #----- PROTECTED REGION END -----#	//	DataBase.DbPutDeviceAttributeProperty2
-
-#------------------------------------------------------------------
-#    DbPutDeviceProperty command:
-#------------------------------------------------------------------
-    def DbPutDeviceProperty(self, argin):
-        """ Create / Update device property(ies)
-        
-        :param argin: Str[0] = Tango device name
-        Str[1] = Property number
-        Str[2] = Property name
-        Str[3] = Property value number
-        Str[4] = Property value 1
-        Str[n] = Property value n
-        ....
-        :type: PyTango.DevVarStringArray
-        :return: 
-        :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbPutDeviceProperty()")
-        #----- PROTECTED REGION ID(DataBase.DbPutDeviceProperty) ENABLED START -----#
-
-        time_before = time.time()
-
-        device_name = argin[0]
-        nb_properties = int(argin[1])
-        
-        self.info_stream("DataBase::DbPutDeviceProperty(): put " + str(nb_properties) + " attributes for device " + device_name)
-        
-        self.db.put_device_property(device_name, properties, argin[2:])
-
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbPutDeviceProperty")
-
-        #----- PROTECTED REGION END -----#	//	DataBase.DbPutDeviceProperty
-
-#------------------------------------------------------------------
-#    DbPutProperty command:
-#------------------------------------------------------------------
-    def DbPutProperty(self, argin):
-        """ Create / Update free object property(ies)
-        
-        :param argin: Str[0] = Object name
-        Str[1] = Property number
-        Str[2] = Property name
-        Str[3] = Property value number
-        Str[4] = Property value 1
-        Str[n] = Property value n
-        ....
-        :type: PyTango.DevVarStringArray
-        :return: 
-        :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbPutProperty()")
-        #----- PROTECTED REGION ID(DataBase.DbPutProperty) ENABLED START -----#
-
-        object_name = argin[0]
-        nb_properties = int(argin[1])
-        
-        self.info_stream("DataBase::DbPutProperty(): put " + str(nb_properties) + " attributes for object " + object_name)
-        
-        self.db.put_property(object_name, properties, argin[2:])
-
-        #----- PROTECTED REGION END -----#	//	DataBase.DbPutProperty
-
-#------------------------------------------------------------------
-#    DbPutServerInfo command:
-#------------------------------------------------------------------
+    @command(dtype_in=('str',), doc_in='server info', doc_out='none')
     def DbPutServerInfo(self, argin):
         """ Update server info including host, mode and level
-        
+
         :param argin: server info
         :type: PyTango.DevVarStringArray
-        :return: 
+        :return:
         :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbPutServerInfo()")
-        #----- PROTECTED REGION ID(DataBase.DbPutServerInfo) ENABLED START -----#
+        self._log.debug("In DbPutServerInfo()")
 
         if len(argin) < 4:
             self.warn_stream("DataBase::DbPutServerInfo(): insufficient number of arguments ")
@@ -2254,646 +1492,256 @@ class DataBase (PyTango.Device_4Impl):
         tmp_extra = []
         if len(argin) > 4:
             tmp_extra = argin[4:]
-        
-        tmp_len = len(argin) - 1
-        self.info_stream("DataBase::DbPutServerInfo(): put " + tmp_len + "  export info for device " + tmp_server)
-
-        self.db.put_server_info(tmp_server, tmp_host, tmp_mode, tmp_level, tmp_extra)
-
-        #----- PROTECTED REGION END -----#	//	DataBase.DbPutServerInfo
-
-#------------------------------------------------------------------
-#    DbUnExportDevice command:
-#------------------------------------------------------------------
-    def DbUnExportDevice(self, argin):
-        """ Mark a device as non exported in database
-        
-        :param argin: Device name
-        :type: PyTango.DevString
-        :return: 
-        :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbUnExportDevice()")
-        #----- PROTECTED REGION ID(DataBase.DbUnExportDevice) ENABLED START -----#
-
-        dev_name = argin[0].lower()
-
-        self.db.unexport_device(dev_name)
-
-        #----- PROTECTED REGION END -----#	//	DataBase.DbUnExportDevice
-
-#------------------------------------------------------------------
-#    DbUnExportEvent command:
-#------------------------------------------------------------------
-    def DbUnExportEvent(self, argin):
-        """ Mark one event channel as non exported in database
-        
-        :param argin: name of event channel or factory to unexport
-        :type: PyTango.DevString
-        :return: none
-        :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbUnExportEvent()")
-        #----- PROTECTED REGION ID(DataBase.DbUnExportEvent) ENABLED START -----#
-
-        event_name = argin[0].lower()
-
-        self.db.unexport_event(event_name)
-
-        #----- PROTECTED REGION END -----#	//	DataBase.DbUnExportEvent
-
-#------------------------------------------------------------------
-#    DbUnExportServer command:
-#------------------------------------------------------------------
-    def DbUnExportServer(self, argin):
-        """ Mark all devices belonging to a specified device server
-        process as non exported
-        
-        :param argin: Device server name (executable/instance)
-        :type: PyTango.DevString
-        :return: 
-        :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbUnExportServer()")
-        #----- PROTECTED REGION ID(DataBase.DbUnExportServer) ENABLED START -----#
-
-        time_before = time.time()
-
-        server_name = argin[0].lower()
-
-        self.db.unexport_server(server_name)
-
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbUnExportServer")
-
-        #----- PROTECTED REGION END -----#	//	DataBase.DbUnExportServer
-
-#------------------------------------------------------------------
-#    ResetTimingValues command:
-#------------------------------------------------------------------
-    def ResetTimingValues(self):
-        """ Reset the timing attribute values.
-        
-        :param : 
-        :type: PyTango.DevVoid
-        :return: 
-        :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".ResetTimingValues()")
-        #----- PROTECTED REGION ID(DataBase.ResetTimingValues) ENABLED START -----#
-        for tmp_timing in timing_maps.itervalues():
-            tmp_timing.average = 0.
-            tmp_timing.minimum = 0.
-            tmp_timing.maximum = 0.
-            tmp_timing.total_elapsed = 0.
-            tmp_timing.calls = 0.
-
-        #----- PROTECTED REGION END -----#	//	DataBase.ResetTimingValues
-
-#------------------------------------------------------------------
-#    DbGetDataForServerCache command:
-#------------------------------------------------------------------
-    def DbGetDataForServerCache(self, argin):
-        """ This command returns all the data needed by a device server process during its
-        startup sequence. The aim of this command is to minimize database access during
-        device server startup sequence.
-        
-        :param argin: Elt[0] = DS name (exec_name/inst_name), Elt[1] = Host name
-        :type: PyTango.DevVarStringArray
-        :return: All the data needed by the device server during its startup sequence. Precise list depend on the device server
-        :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetDataForServerCache()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetDataForServerCache) ENABLED START -----#
 
-        time_before = time.time()
+        tmp_len = len(argin) - 1
+        self.db.put_server_info(tmp_server, tmp_host, tmp_mode, tmp_level, tmp_extra)
 
-        ##  TODO
+    @command(dtype_in='str', doc_in='device alias name', doc_out='none')
+    def DbDeleteDeviceAlias(self, argin):
+        """ Delete a device alias.
 
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbDbGetDataForServerCache")
+        :param argin: device alias name
+        :type: PyTango.DevString
+        :return:
+        :rtype: PyTango.DevVoid """
+        self._log.debug("In DbDeleteDeviceAlias()")
+        self.db.delete_device_alias(argin)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetDataForServerCache
-        return argout
+    @stats
+    @command(dtype_in=('str',), doc_in='Str[0] = event channel name (or factory name)\nStr[1] = CORBA IOR\nStr[2] = Notifd host name\nStr[3] = Notifd pid\nStr[4] = Notifd version', doc_out='none')
+    def DbExportEvent(self, argin):
+        """ Export Event channel to database
 
-#------------------------------------------------------------------
-#    DbDeleteAllDeviceAttributeProperty command:
-#------------------------------------------------------------------
-    def DbDeleteAllDeviceAttributeProperty(self, argin):
-        """ Delete all attribute properties for the specified device attribute(s)
-        
-        :param argin: str[0] = device name
-        Str[1]...str[n] = attribute name(s)
+        :param argin: Str[0] = event channel name (or factory name)
+        Str[1] = CORBA IOR
+        Str[2] = Notifd host name
+        Str[3] = Notifd pid
+        Str[4] = Notifd version
         :type: PyTango.DevVarStringArray
-        :return: 
+        :return:
         :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbDeleteAllDeviceAttributeProperty()")
-        #----- PROTECTED REGION ID(DataBase.DbDeleteAllDeviceAttributeProperty) ENABLED START -----#
+        self._log.debug("In DbExportEvent()")
 
-        if len(argin) < 2:
-            self.warn_stream("DataBase::DbDeleteAllDeviceAttributeProperty(): insufficient number of arguments ")
+        if len(argin) < 5:
+            self.warn_stream("DataBase::db_export_event(): insufficient export info for event ")
             th_exc(DB_IncorrectArguments,
-                   "insufficient number of arguments to delete all device attribute(s) property",
-                   "DataBase::DbDeleteAllDeviceAttributeProperty()")
+                   "insufficient export info for event",
+                   "DataBase::ExportEvent()")
 
-        dev_name = argin[0]
+        event, IOR, host, pid, version = argin[:5]
+        event = replace_wildcard(event.lower())
+        self.db.export_event(event, IOR, host, pid, version)
 
-        ret, d_name, dfm = check_device_name(dev_name)
-        
-        if not ret:
-            th_exc(DB_IncorrectDeviceName,
-                  "device name (" + argin + ") syntax error (should be [tango:][//instance/]domain/family/member)",
-                  "DataBase::DbDeleteAllDeviceAttributeProperty()")
+    @stats
+    @command(dtype_in=('str',), doc_in='Str[0] = Device name\nStr[1] = Property name\nStr[n] = Property name', dtype_out=('str',), doc_out='Str[0] = Device name\nStr[1] = Property number\nStr[2] = Property name\nStr[3] = Property value number (array case)\nStr[4] = Property value 1\nStr[n] = Property value n (array case)\nStr[n + 1] = Property name\nStr[n + 2] = Property value number (array case)\nStr[n + 3] = Property value 1\nStr[n + m] = Property value m')
+    def DbGetDeviceProperty(self, argin):
+        """
 
-        self.db.delete_all_device_attribute_property(dev_name, argin[1:])
+        :param argin: Str[0] = Device name
+        Str[1] = Property name
+        Str[n] = Property name
+        :type: PyTango.DevVarStringArray
+        :return: Str[0] = Device name
+        Str[1] = Property number
+        Str[2] = Property name
+        Str[3] = Property value number (array case)
+        Str[4] = Property value 1
+        Str[n] = Property value n (array case)
+        Str[n + 1] = Property name
+        Str[n + 2] = Property value number (array case)
+        Str[n + 3] = Property value 1
+        Str[n + m] = Property value m
+        :rtype: PyTango.DevVarStringArray """
+        self._log.debug("In DbGetDeviceProperty()")
+        device_name = argin[0]
+        return self.db.get_device_property(device_name, argin[1:])
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbDeleteAllDeviceAttributeProperty
+    @command(dtype_in='str', doc_in='Device name', dtype_out='DevVarLongStringArray', doc_out='Str[0] = Device name\nStr[1] = CORBA IOR\nStr[2] = Device version\nStr[3] = Device Server name\nStr[4] = Device Server process host name\nStr[5] = Started date (or ? if not set)\nStr[6] = Stopped date (or ? if not set)\nStr[7] = Device class\n\nLg[0] = Device exported flag\nLg[1] = Device Server process PID (or -1 if not set)')
+    def DbGetDeviceInfo(self, argin):
+        """ Returns info from DbImportDevice and started/stopped dates.
 
-#------------------------------------------------------------------
-#    DbMySqlSelect command:
-#------------------------------------------------------------------
-    def DbMySqlSelect(self, argin):
-        """ This is a very low level command.
-        It executes the specified  SELECT command on TANGO database and returns its result without filter.
-        
-        :param argin: MySql Select command
+        :param argin: Device name
         :type: PyTango.DevString
-        :return: MySql Select command result
-         - svalues : select results
-         - lvalue[n] : =0 if svalue[n] is null else =1
-         (last lvalue -1) is number of rows, (last lvalue) is number of fields
-        :rtype: PyTango.DevVarLongStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbMySqlSelect()")
-        argout = [0], ['']
-        #----- PROTECTED REGION ID(DataBase.DbMySqlSelect) ENABLED START -----#
-
-        time_before = time.time()
-
-        tmp_argin = argin.lower()
-        
-        #  Check if SELECT key is alread inside command
-
-        cmd = argin
-        tmp_argin = argin.lower()
-        pos = tmp_argin.find('select')
-        if pos == -1:
-            cmd = "SELECT " + cmd
+        :return: Str[0] = Device name
+        Str[1] = CORBA IOR
+        Str[2] = Device version
+        Str[3] = Device Server name
+        Str[4] = Device Server process host name
+        Str[5] = Started date (or ? if not set)
+        Str[6] = Stopped date (or ? if not set)
+        Str[7] = Device class
 
-        pos = tmp_argin.find(';')
-        if pos != -1 and len(tmp_argin) > (pos + 1):
-            th_exc(DB_IncorrectArguments,
-                   "SQL command not valid: " + argin,
-                   "DataBase::ExportDevice()")
-        logging.info("DataBase::db_my_sql_select(): \n %s" % cmd)
-        
-        argout = self.db.my_sql_select(cmd)
+        Lg[0] = Device exported flag
+        Lg[1] = Device Server process PID (or -1 if not set)
+        :rtype: PyTango.DevVarLongStringArray """
+        self._log.debug("In DbGetDeviceInfo()")
+        ret, dev_name, dfm = check_device_name(argin)
+        if not ret:
+            th_exc(DB_IncorrectDeviceName,
+                  "device name (" + argin + ") syntax error (should be [tango:][//instance/]domain/family/member)",
+                  "DataBase::DbGetDeviceAlias()")
 
-        time_after = time.time()
-        self.update_timing_stats(time_before, time_after, "DbMySqlSelect")
+        return self.db.get_device_info(dev_name)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbMySqlSelect
-        return argout
+    @command(dtype_in=('str',), doc_in='Str[0] = Object name\nStr[2] = Property name', dtype_out=('str',), doc_out='Str[0] = Property name\nStr[1] = date\nStr[2] = Property value number (array case)\nStr[3] = Property value 1\nStr[n] = Property value n')
+    def DbGetPropertyHist(self, argin):
+        """ Retrieve object  property history
 
-#------------------------------------------------------------------
-#    DbGetCSDbServerList command:
-#------------------------------------------------------------------
-    def DbGetCSDbServerList(self):
-        """ Get a list of host:port for all database server defined in the control system
-        
-        :param : 
-        :type: PyTango.DevVoid
-        :return: List of host:port with one element for each database server
+        :param argin: Str[0] = Object name
+        Str[2] = Property name
+        :type: PyTango.DevVarStringArray
+        :return: Str[0] = Property name
+        Str[1] = date
+        Str[2] = Property value number (array case)
+        Str[3] = Property value 1
+        Str[n] = Property value n
         :rtype: PyTango.DevVarStringArray """
-        self.debug_stream("In " + self.get_name() + ".DbGetCSDbServerList()")
-        argout = ['']
-        #----- PROTECTED REGION ID(DataBase.DbGetCSDbServerList) ENABLED START -----#
-
-        argout = self.db.get_csdb_server_list()
+        self._log.debug("In DbGetPropertyHist()")
+        object_name = argin[0]
+        prop_name = argin[1]
+        return self.db.get_property_hist(object_name, prop_name)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetCSDbServerList
-        return argout
+    @stats
+    @command(dtype_in='str', doc_in='The filter', dtype_out=('str',), doc_out='Device names member list')
+    def DbGetDeviceMemberList(self, argin):
+        """ Get a list of device name members for device name matching the
+        specified filter
 
-#------------------------------------------------------------------
-#    DbGetAttributeAlias2 command:
-#------------------------------------------------------------------
-    def DbGetAttributeAlias2(self, argin):
-        """ Get the attribute alias from the attribute name.
-        Returns one empty string if nothing found in database
-        
-        :param argin: The attribute name (dev_name/att_name)
+        :param argin: The filter
         :type: PyTango.DevString
-        :return: The attribute alias name (or empty string)
-        :rtype: PyTango.DevString """
-        self.debug_stream("In " + self.get_name() + ".DbGetAttributeAlias2()")
-        argout = ''
-        #----- PROTECTED REGION ID(DataBase.DbGetAttributeAlias2) ENABLED START -----#
+        :return: Device names member list
+        :rtype: PyTango.DevVarStringArray """
+        self._log.debug("In DbGetDeviceMemberList()")
+        argin = replace_wildcard(argin)
+        return self.db.get_device_member_list(argin)
 
-        attr_name = argin[0]
-        argout = self.db.get_attribute_alias2(attr_name)
+    @command(dtype_in='str', doc_in='Filter', dtype_out=('str',), doc_out='Class list')
+    def DbGetClassList(self, argin):
+        """ Get Tango class list with a specified filter
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetAttributeAlias2
-        return argout
+        :param argin: Filter
+        :type: PyTango.DevString
+        :return: Class list
+        :rtype: PyTango.DevVarStringArray """
+        self._log.debug("In DbGetClassList()")
+        server = replace_wildcard(argin)
+        return self.db.get_class_list(server)
 
-#------------------------------------------------------------------
-#    DbGetAliasAttribute command:
-#------------------------------------------------------------------
+    @command(dtype_in='str', doc_in='The attribute alias', dtype_out='str', doc_out='The attribute name (dev_name/att_name)')
     def DbGetAliasAttribute(self, argin):
         """ Get the attribute name from the given alias.
         If the given alias is not found in database, returns an empty string
-        
+
         :param argin: The attribute alias
         :type: PyTango.DevString
         :return: The attribute name (dev_name/att_name)
         :rtype: PyTango.DevString """
-        self.debug_stream("In " + self.get_name() + ".DbGetAliasAttribute()")
-        argout = ''
-        #----- PROTECTED REGION ID(DataBase.DbGetAliasAttribute) ENABLED START -----#
-
+        self._log.debug("In DbGetAliasAttribute()")
         alias_name = argin[0]
-        argout = self.db.get_alias_attribute(alias_name)
+        return self.db.get_alias_attribute(alias_name)
 
-        #----- PROTECTED REGION END -----#	//	DataBase.DbGetAliasAttribute
-        return argout
+    @command(dtype_in='str', doc_in='Device server name', doc_out='none')
+    def DbDeleteServerInfo(self, argin):
+        """ delete info related to a Tango devvice server process
 
-#------------------------------------------------------------------
-#    DbRenameServer command:
-#------------------------------------------------------------------
-    def DbRenameServer(self, argin):
-        """ Rename a device server process
-        
-        :param argin: str[0] = old device server name (exec/instance)
-        str[1] =  new device server name (exec/instance)
-        :type: PyTango.DevVarStringArray
-        :return: 
+        :param argin: Device server name
+        :type: PyTango.DevString
+        :return:
         :rtype: PyTango.DevVoid """
-        self.debug_stream("In " + self.get_name() + ".DbRenameServer()")
-        #----- PROTECTED REGION ID(DataBase.DbRenameServer) ENABLED START -----#
+        self._log.debug("In DbDeleteServerInfo()")
+        self.db.delete_server_info(argin)
 
-        if len(argin) < 2:
-            self.warn_stream("DataBase::DbRenameServer(): insufficient number of arguments ")
-            th_exc(DB_IncorrectArguments,
-                   "insufficient number of arguments (two required: old name and new name",
-                   "DataBase::DbRenameServer")
-        
+    @command(dtype_in=('str',), doc_in='Str[0] = Tango class name\nStr[1] = Attribute name filter (eg: att*)', dtype_out=('str',), doc_out='Str[0] = Class attribute name\nStr[n] = Class attribute name')
+    def DbGetClassAttributeList(self, argin):
+        """ Get attrilute list for a given Tango class with a specified filter
 
-        old_name = argin[0]
-        new_name = argin[1]
-        
-        if ('/' not in argin[0]) or ('/' not in argin[1]):
-            self.warn_stream("DataBase::DbRenameServer(): wrong syntax in command args ")
-            th_exc(DB_IncorrectArguments,
-                   "Wrong syntax in command args (ds_exec_name/inst_name)",
-                   "DataBase::DbRenameServer")
+        :param argin: Str[0] = Tango class name
+        Str[1] = Attribute name filter (eg: att*)
+        :type: PyTango.DevVarStringArray
+        :return: Str[0] = Class attribute name
+        Str[n] = Class attribute name
+        :rtype: PyTango.DevVarStringArray """
+        self._log.debug("In DbGetClassAttributeList()")
+        class_name = argin[0]
+        wildcard = replace_wildcard(argin[1])
+        return self.db.get_class_attribute_list(class_name, wildcard)
 
-        self.db.rename_server(old_name, new_name)
-            
-        
-
-        #----- PROTECTED REGION END -----#	//	DataBase.DbRenameServer
-
-#==================================================================
-#
-#    DataBaseClass class definition
-#
-#==================================================================
-class DataBaseClass(PyTango.DeviceClass):
-
-    #    Class Properties
-    class_property_list = {
-        }
-
-
-    #    Device Properties
-    device_property_list = {
-        }
-
-
-    #    Command definitions
-    cmd_list = {
-        'DbAddDevice':
-            [[PyTango.DevVarStringArray, "Str[0] = Full device server process name\nStr[1] = Device name\nStr[2] = Tango class name"],
-            [PyTango.DevVoid, "none"]],
-        'DbAddServer':
-            [[PyTango.DevVarStringArray, "Str[0] = Full device server name\nStr[1] = Device(s) name\nStr[2] = Tango class name\nStr[n] = Device name\nStr[n + 1] = Tango class name"],
-            [PyTango.DevVoid, "none"]],
-        'DbDeleteAttributeAlias':
-            [[PyTango.DevString, "Attriibute alias name."],
-            [PyTango.DevVoid, "none"]],
-        'DbDeleteClassAttribute':
-            [[PyTango.DevVarStringArray, "Str[0] = Tango class name\nStr[1] = Attribute name"],
-            [PyTango.DevVoid, "none"]],
-        'DbDeleteClassAttributeProperty':
-            [[PyTango.DevVarStringArray, "Str[0] = Tango class name\nStr[1] = Attribute name\nStr[2] = Property name\nStr[n] = Property name"],
-            [PyTango.DevVoid, "none"]],
-        'DbDeleteClassProperty':
-            [[PyTango.DevVarStringArray, "Str[0] = Tango class name\nStr[1] = Property name\nStr[n] = Property name"],
-            [PyTango.DevVoid, "none"]],
-        'DbDeleteDevice':
-            [[PyTango.DevString, "device name"],
-            [PyTango.DevVoid, "none"]],
-        'DbDeleteDeviceAlias':
-            [[PyTango.DevString, "device alias name"],
-            [PyTango.DevVoid, "none"]],
-        'DbDeleteDeviceAttribute':
-            [[PyTango.DevVarStringArray, "Str[0] = Device name\nStr[1] = Attribute name"],
-            [PyTango.DevVoid, "none"]],
-        'DbDeleteDeviceAttributeProperty':
-            [[PyTango.DevVarStringArray, "Str[0] = Device name\nStr[1] = Attribute name\nStr[2] = Property name\nStr[n] = Property name"],
-            [PyTango.DevVoid, "none"]],
-        'DbDeleteDeviceProperty':
-            [[PyTango.DevVarStringArray, "Str[0] = Device name\nStr[1] = Property name\nStr[n] = Property name"],
-            [PyTango.DevVoid, "none"]],
-        'DbDeleteProperty':
-            [[PyTango.DevVarStringArray, "Str[0]  = Object name\nStr[1] = Property name\nStr[n] = Property name"],
-            [PyTango.DevVoid, "none"]],
-        'DbDeleteServer':
-            [[PyTango.DevString, "Device server name"],
-            [PyTango.DevVoid, "none"]],
-        'DbDeleteServerInfo':
-            [[PyTango.DevString, "Device server name"],
-            [PyTango.DevVoid, "none"]],
-        'DbExportDevice':
-            [[PyTango.DevVarStringArray, "Str[0] = Device name\nStr[1] = CORBA IOR\nStr[2] = Device server process host name\nStr[3] = Device server process PID or string ``null``\nStr[4] = Device server process version"],
-            [PyTango.DevVoid, "none"]],
-        'DbExportEvent':
-            [[PyTango.DevVarStringArray, "Str[0] = event channel name (or factory name)\nStr[1] = CORBA IOR\nStr[2] = Notifd host name\nStr[3] = Notifd pid\nStr[4] = Notifd version"],
-            [PyTango.DevVoid, "none"]],
-        'DbGetAliasDevice':
-            [[PyTango.DevString, "Alias name"],
-            [PyTango.DevString, "Device name"]],
-        'DbGetAttributeAlias':
-            [[PyTango.DevString, "The attribute alias name"],
-            [PyTango.DevString, "The attribute name (device/attribute)"]],
-        'DbGetAttributeAliasList':
-            [[PyTango.DevString, "attribute alias filter string (eg: att*)"],
-            [PyTango.DevVarStringArray, "attribute aliases"]],
-        'DbGetClassAttributeList':
-            [[PyTango.DevVarStringArray, "Str[0] = Tango class name\nStr[1] = Attribute name filter (eg: att*)"],
-            [PyTango.DevVarStringArray, "Str[0] = Class attribute name\nStr[n] = Class attribute name"]],
-        'DbGetClassAttributeProperty':
-            [[PyTango.DevVarStringArray, "Str[0] = Tango class name\nStr[1] = Attribute name\nStr[n] = Attribute name"],
-            [PyTango.DevVarStringArray, "Str[0] = Tango class name\nStr[1] = Attribute property  number\nStr[2] = Attribute property 1 name\nStr[3] = Attribute property 1 value\nStr[n + 1] = Attribute property 2 name\nStr[n + 2] = Attribute property 2 value"]],
-        'DbGetClassAttributeProperty2':
-            [[PyTango.DevVarStringArray, "Str[0] = Tango class name\nStr[1] = Attribute name\nStr[n] = Attribute name"],
-            [PyTango.DevVarStringArray, "Str[0] = Tango class name\nStr[1] = Attribute property  number\nStr[2] = Attribute property 1 name\nStr[3] = Attribute property 1 value number (array case)\nStr[4] = Attribute property 1 value\nStr[n] = Attribute property 1 value (array case)\nStr[n + 1] = Attribute property 2 name\nStr[n + 2] = Attribute property 2 value number (array case)\nStr[n + 3] = Attribute property 2 value\nStr[n + m] = Attribute property 2 value (array case)"]],
-        'DbGetClassAttributePropertyHist':
-            [[PyTango.DevVarStringArray, "Str[0] = Tango class\nStr[1] = Attribute name\nStr[2] = Property name"],
-            [PyTango.DevVarStringArray, "Str[0] = Attribute name\nStr[1] = Property name\nStr[2] = date\nStr[3] = Property value number (array case)\nStr[4] = Property value 1\nStr[n] = Property value n"]],
-        'DbGetClassForDevice':
-            [[PyTango.DevString, "Device name"],
-            [PyTango.DevString, "Device Tango class"]],
-        'DbGetClassInheritanceForDevice':
-            [[PyTango.DevString, "Device name"],
-            [PyTango.DevVarStringArray, "Classes off the specified device.\n[0] - is the class of the device.\n[1] - is the class from the device class is inherited.\n........and so on"]],
-        'DbGetClassList':
-            [[PyTango.DevString, "Filter"],
-            [PyTango.DevVarStringArray, "Class list"]],
-        'DbGetClassProperty':
-            [[PyTango.DevVarStringArray, "Str[0] = Tango class\nStr[1] = Property name\nStr[2] = Property name"],
-            [PyTango.DevVarStringArray, "Str[0] = Tango class\nStr[1] = Property number\nStr[2] = Property name\nStr[3] = Property value number (array case)\nStr[4] = Property value\nStr[n] = Propery value (array case)\n...."]],
-        'DbGetClassPropertyHist':
-            [[PyTango.DevVarStringArray, "Str[0] = Tango class\nStr[1] = Property name"],
-            [PyTango.DevVarStringArray, "Str[0] = Property name\nStr[1] = date\nStr[2] = Property value number (array case)\nStr[3] = Property value 1\nStr[n] = Property value n"]],
-        'DbGetClassPropertyList':
-            [[PyTango.DevString, "The filter"],
-            [PyTango.DevVarStringArray, "Property name list"]],
-        'DbGetDeviceAlias':
-            [[PyTango.DevString, "The device name"],
-            [PyTango.DevString, "The alias found"]],
-        'DbGetDeviceAliasList':
-            [[PyTango.DevString, "The filter"],
-            [PyTango.DevVarStringArray, "Device alias list"]],
-        'DbGetDeviceAttributeList':
-            [[PyTango.DevVarStringArray, "Str[0] = Device name\nStr[1] = Wildcard"],
-            [PyTango.DevVarStringArray, "attribute name list"]],
-        'DbGetDeviceAttributeProperty':
-            [[PyTango.DevVarStringArray, "Str[0] = Device name\nStr[1] = Attribute name\nStr[n] = Attribute name"],
-            [PyTango.DevVarStringArray, "Str[0] = Device name\nStr[1] = Attribute property  number\nStr[2] = Attribute property 1 name\nStr[3] = Attribute property 1 value\nStr[n + 1] = Attribute property 2 name\nStr[n + 2] = Attribute property 2 value"]],
-        'DbGetDeviceAttributeProperty2':
-            [[PyTango.DevVarStringArray, "Str[0] = Device name\nStr[1] = Attribute name\nStr[n] = Attribute name"],
-            [PyTango.DevVarStringArray, "Str[0] = Device name\nStr[1] = Attribute property  number\nStr[2] = Attribute property 1 name\nStr[3] = Attribute property 1 value number (array case)\nStr[4] = Attribute property 1 value\nStr[n] = Attribute property 1 value (array case)\nStr[n + 1] = Attribute property 2 name\nStr[n + 2] = Attribute property 2 value number (array case)\nStr[n + 3] = Attribute property 2 value\nStr[n + m] = Attribute property 2 value (array case)"]],
-        'DbGetDeviceAttributePropertyHist':
-            [[PyTango.DevVarStringArray, "Str[0] = Device name\nStr[1] = Attribute name\nStr[2] = Property name"],
-            [PyTango.DevVarStringArray, "Str[0] = Attribute name\nStr[1] = Property name\nStr[2] = date\nStr[3] = Property value number (array case)\nStr[4] = Property value 1\nStr[n] = Property value n"]],
-        'DbGetDeviceClassList':
-            [[PyTango.DevString, "Device server process name"],
-            [PyTango.DevVarStringArray, "Str[0] = Device name\nStr[1] = Tango class\nStr[n] = Device name\nStr[n + 1] = Tango class"]],
-        'DbGetDeviceDomainList':
-            [[PyTango.DevString, "The wildcard"],
-            [PyTango.DevVarStringArray, "Device name domain list"]],
-        'DbGetDeviceExportedList':
-            [[PyTango.DevString, "filter"],
-            [PyTango.DevVarStringArray, "list of exported devices"]],
-        'DbGetDeviceFamilyList':
-            [[PyTango.DevString, "The wildcard"],
-            [PyTango.DevVarStringArray, "Family list"]],
-        'DbGetDeviceInfo':
-            [[PyTango.DevString, "Device name"],
-            [PyTango.DevVarLongStringArray, "Str[0] = Device name\nStr[1] = CORBA IOR\nStr[2] = Device version\nStr[3] = Device Server name\nStr[4] = Device Server process host name\nStr[5] = Started date (or ? if not set)\nStr[6] = Stopped date (or ? if not set)\nStr[7] = Device class\n\nLg[0] = Device exported flag\nLg[1] = Device Server process PID (or -1 if not set)"]],
-        'DbGetDeviceList':
-            [[PyTango.DevVarStringArray, "argin[0] : server name\nargin[1] : class name"],
-            [PyTango.DevVarStringArray, "The list of devices for specified server and class."]],
-        'DbGetDeviceWideList':
-            [[PyTango.DevString, "filter"],
-            [PyTango.DevVarStringArray, "list of exported devices"]],
-        'DbGetDeviceMemberList':
-            [[PyTango.DevString, "The filter"],
-            [PyTango.DevVarStringArray, "Device names member list"]],
-        'DbGetDeviceProperty':
-            [[PyTango.DevVarStringArray, "Str[0] = Device name\nStr[1] = Property name\nStr[n] = Property name"],
-            [PyTango.DevVarStringArray, "Str[0] = Device name\nStr[1] = Property number\nStr[2] = Property name\nStr[3] = Property value number (array case)\nStr[4] = Property value 1\nStr[n] = Property value n (array case)\nStr[n + 1] = Property name\nStr[n + 2] = Property value number (array case)\nStr[n + 3] = Property value 1\nStr[n + m] = Property value m"]],
-        'DbGetDevicePropertyHist':
-            [[PyTango.DevVarStringArray, "Str[0] = Device name\nStr[2] = Property name"],
-            [PyTango.DevVarStringArray, "Str[0] = Property name\nStr[1] = date\nStr[2] = Property value number (array case)\nStr[3] = Property value 1\nStr[n] = Property value n"]],
-        'DbGetDevicePropertyList':
-            [[PyTango.DevVarStringArray, "Str[0] = device name\nStr[1] = Filter"],
-            [PyTango.DevVarStringArray, "Property name list"]],
-        'DbGetDeviceServerClassList':
-            [[PyTango.DevString, "device server process name"],
-            [PyTango.DevVarStringArray, "list of classes for this device server"]],
-        'DbGetExportdDeviceListForClass':
-            [[PyTango.DevString, "Class name"],
-            [PyTango.DevVarStringArray, "Device exported list"]],
-        'DbGetHostList':
-            [[PyTango.DevString, "The filter"],
-            [PyTango.DevVarStringArray, "Host name list"]],
-        'DbGetHostServerList':
-            [[PyTango.DevString, "The filter"],
-            [PyTango.DevVarStringArray, "Device server process name list"]],
-        'DbGetHostServersInfo':
-            [[PyTango.DevString, "Host name"],
-            [PyTango.DevVarStringArray, "Server info for all servers running on specified host"]],
-        'DbGetInstanceNameList':
-            [[PyTango.DevString, "Server name"],
-            [PyTango.DevVarStringArray, "The instance names found for specified server."]],
-        'DbGetObjectList':
-            [[PyTango.DevString, "The filter"],
-            [PyTango.DevVarStringArray, "Object name list"]],
-        'DbGetProperty':
-            [[PyTango.DevVarStringArray, "Str[0] = Object name\nStr[1] = Property name\nStr[n] = Property name"],
-            [PyTango.DevVarStringArray, "Str[0] = Object name\nStr[1] = Property number\nStr[2] = Property name\nStr[3] = Property value number (array case)\nStr[4] = Property value 1\nStr[n] = Property value n (array case)\nStr[n + 1] = Property name\nStr[n + 2] = Property value number (array case)\nStr[n + 3] = Property value 1\nStr[n + m] = Property value m"]],
-        'DbGetPropertyHist':
-            [[PyTango.DevVarStringArray, "Str[0] = Object name\nStr[2] = Property name"],
-            [PyTango.DevVarStringArray, "Str[0] = Property name\nStr[1] = date\nStr[2] = Property value number (array case)\nStr[3] = Property value 1\nStr[n] = Property value n"]],
-        'DbGetPropertyList':
-            [[PyTango.DevVarStringArray, "Str[0] = Object name\nStr[1] = filter"],
-            [PyTango.DevVarStringArray, "Property name list"]],
-        'DbGetServerInfo':
-            [[PyTango.DevString, "server name"],
-            [PyTango.DevVarStringArray, "server info"]],
-        'DbGetServerList':
-            [[PyTango.DevString, "The filter"],
-            [PyTango.DevVarStringArray, "Device server process name list"]],
-        'DbGetServerNameList':
-            [[PyTango.DevString, "wildcard for server names."],
-            [PyTango.DevVarStringArray, "server names found."]],
-        'DbImportDevice':
-            [[PyTango.DevString, "Device name (or alias)"],
-            [PyTango.DevVarLongStringArray, "Str[0] = device name\nStr[1] = CORBA IOR\nStr[2] = device version\nStr[3] = device server process name\nStr[4] = host name\nStr[5] = Tango class name\n\nLg[0] = Exported flag\nLg[1] = Device server process PID"]],
-        'DbImportEvent':
-            [[PyTango.DevString, "name of event channel or factory"],
-            [PyTango.DevVarLongStringArray, "export information e.g. IOR"]],
-        'DbInfo':
-            [[PyTango.DevVoid, "none"],
-            [PyTango.DevVarStringArray, "Miscellaneous info like:\n- Device defined in database\n- Device marked as exported in database\n- Device server process defined in database\n- Device server process marked as exported in database\n- Device properties defined in database\n- Class properties defined in database\n- Device attribute properties defined in database\n- Class attribute properties defined in database\n- Object properties defined in database"]],
-        'DbPutAttributeAlias':
-            [[PyTango.DevVarStringArray, "Str[0] = attribute name\nStr[1] = attribute alias"],
-            [PyTango.DevVoid, "none"]],
-        'DbPutClassAttributeProperty':
-            [[PyTango.DevVarStringArray, "Str[0] = Tango class name\nStr[1] = Attribute number\nStr[2] = Attribute name\nStr[3] = Property number\nStr[4] = Property name\nStr[5] = Property value\n....."],
-            [PyTango.DevVoid, "none"]],
-        'DbPutClassAttributeProperty2':
-            [[PyTango.DevVarStringArray, "Str[0] = Tango class name\nStr[1] = Attribute number\nStr[2] = Attribute name\nStr[3] = Property number\nStr[4] = Property name\nStr[5] = Property value number (array case)\nStr[5] = Property value 1\nStr[n] = Property value n (array case)\n....."],
-            [PyTango.DevVoid, "none"]],
-        'DbPutClassProperty':
-            [[PyTango.DevVarStringArray, "Str[0] = Tango class name\nStr[1] = Property number\nStr[2] = Property name\nStr[3] = Property value number\nStr[4] = Property value 1\nStr[n] = Property value n\n...."],
-            [PyTango.DevVoid, "none"]],
-        'DbPutDeviceAlias':
-            [[PyTango.DevVarStringArray, "Str[0] = device name\nStr[1] = alias name"],
-            [PyTango.DevVoid, "none"]],
-        'DbPutDeviceAttributeProperty':
-            [[PyTango.DevVarStringArray, "Str[0] = Device name\nStr[1] = Attribute number\nStr[2] = Attribute name\nStr[3] = Property number\nStr[4] = Property name\nStr[5] = Property value\n....."],
-            [PyTango.DevVoid, "none"]],
-        'DbPutDeviceAttributeProperty2':
-            [[PyTango.DevVarStringArray, "Str[0] = Device name\nStr[1] = Attribute number\nStr[2] = Attribute name\nStr[3] = Property number\nStr[4] = Property name\nStr[5] = Property value number (array case)\nStr[5] = Property value 1\nStr[n] = Property value n (array case)\n....."],
-            [PyTango.DevVoid, "none"]],
-        'DbPutDeviceProperty':
-            [[PyTango.DevVarStringArray, "Str[0] = Tango device name\nStr[1] = Property number\nStr[2] = Property name\nStr[3] = Property value number\nStr[4] = Property value 1\nStr[n] = Property value n\n...."],
-            [PyTango.DevVoid, "none"]],
-        'DbPutProperty':
-            [[PyTango.DevVarStringArray, "Str[0] = Object name\nStr[1] = Property number\nStr[2] = Property name\nStr[3] = Property value number\nStr[4] = Property value 1\nStr[n] = Property value n\n...."],
-            [PyTango.DevVoid, "none"]],
-        'DbPutServerInfo':
-            [[PyTango.DevVarStringArray, "server info"],
-            [PyTango.DevVoid, "none"]],
-        'DbUnExportDevice':
-            [[PyTango.DevString, "Device name"],
-            [PyTango.DevVoid, "none"]],
-        'DbUnExportEvent':
-            [[PyTango.DevString, "name of event channel or factory to unexport"],
-            [PyTango.DevVoid, "none"]],
-        'DbUnExportServer':
-            [[PyTango.DevString, "Device server name (executable/instance)"],
-            [PyTango.DevVoid, "none"]],
-        'ResetTimingValues':
-            [[PyTango.DevVoid, "none"],
-            [PyTango.DevVoid, "none"]],
-        'DbGetDataForServerCache':
-            [[PyTango.DevVarStringArray, "Elt[0] = DS name (exec_name/inst_name), Elt[1] = Host name"],
-            [PyTango.DevVarStringArray, "All the data needed by the device server during its startup sequence. Precise list depend on the device server"]],
-        'DbDeleteAllDeviceAttributeProperty':
-            [[PyTango.DevVarStringArray, "str[0] = device name\nStr[1]...str[n] = attribute name(s)"],
-            [PyTango.DevVoid, "none"]],
-        'DbMySqlSelect':
-            [[PyTango.DevString, "MySql Select command"],
-            [PyTango.DevVarLongStringArray, "MySql Select command result\n - svalues : select results\n - lvalue[n] : =0 if svalue[n] is null else =1\n (last lvalue -1) is number of rows, (last lvalue) is number of fields"]],
-        'DbGetCSDbServerList':
-            [[PyTango.DevVoid, "none"],
-            [PyTango.DevVarStringArray, "List of host:port with one element for each database server"]],
-        'DbGetAttributeAlias2':
-            [[PyTango.DevString, "The attribute name (dev_name/att_name)"],
-            [PyTango.DevString, "The attribute alias name (or empty string)"]],
-        'DbGetAliasAttribute':
-            [[PyTango.DevString, "The attribute alias"],
-            [PyTango.DevString, "The attribute name (dev_name/att_name)"]],
-        'DbRenameServer':
-            [[PyTango.DevVoid, "none"],
-            [PyTango.DevVarStringArray, "s[0] = old device server name (exec/instance)\ns[1] = new device server name (exec/instance)"]],
-        }
-
-
-    #    Attribute definitions
-    attr_list = {
-        'StoredProcedureRelease':
-            [[PyTango.DevString,
-            PyTango.SCALAR,
-            PyTango.READ]],
-        'Timing_average':
-            [[PyTango.DevDouble,
-            PyTango.SPECTRUM,
-            PyTango.READ, 64]],
-        'Timing_minimum':
-            [[PyTango.DevDouble,
-            PyTango.SPECTRUM,
-            PyTango.READ, 64]],
-        'Timing_maximum':
-            [[PyTango.DevDouble,
-            PyTango.SPECTRUM,
-            PyTango.READ, 64]],
-        'Timing_calls':
-            [[PyTango.DevDouble,
-            PyTango.SPECTRUM,
-            PyTango.READ, 64]],
-        'Timing_index':
-            [[PyTango.DevString,
-            PyTango.SPECTRUM,
-            PyTango.READ, 64]],
-        'Timing_info':
-            [[PyTango.DevString,
-            PyTango.SPECTRUM,
-            PyTango.READ, 64]],
-        }
-
-
-#------------------------------------------------------------------
-#    DataBaseClass Constructor
-#------------------------------------------------------------------
-    def __init__(self, name):
-        PyTango.DeviceClass.__init__(self, name)
-        self.set_type(name);
-
-    def device_factory(self, names):
-        names = [get_db_name()]
-        return PyTango.DeviceClass.device_factory(self, names)
+    @command(dtype_in=('str',), doc_in='Str[0] = Full device server process name\nStr[1] = Device name\nStr[2] = Tango class name', doc_out='none')
+    def DbAddDevice(self, argin):
+        """ Add a Tango class device to a specific device server
 
-    def device_factory(self, device_list):
-        """for internal usage only"""
+        :param argin: Str[0] = Full device server process name
+        Str[1] = Device name
+        Str[2] = Tango class name
+        :type: PyTango.DevVarStringArray
+        :return:
+        :rtype: PyTango.DevVoid """
+        self._log.debug("In DbAddDevice()")
 
-        dev_name = get_db_name()
-        
-        klass = self.__class__
-        klass_name = klass.__name__
-        info, klass = get_class_by_class(klass), get_constructed_class_by_class(klass)
-        
-        if info is None:
-            raise RuntimeError("Device class '%s' is not registered" % klass_name)
+        if len(argin) < 3:
+            self.warn_stream("DataBase::AddDevice(): incorrect number of input arguments ")
+            th_exc(DB_IncorrectArguments,
+                   "incorrect no. of input arguments, needs at least 3 (server,device,class)",
+                   "DataBase::AddDevice()")
 
-        if klass is None:
-            raise RuntimeError("Device class '%s' as not been constructed" % klass_name)
-        
-        deviceClassClass, deviceImplClass, deviceImplName = info
-        deviceImplClass._device_class_instance = klass
+        self.info_stream("DataBase::AddDevice(): insert %s server with device %s",argin[0],argin[1])
+        server_name, d_name, klass_name = argin[:3]
+        if len(argin) > 3:
+            alias = argin[3]
+        else:
+            alias = None
 
-        device = deviceImplClass(klass, dev_name)
-        self._add_device(device)
-        tmp_dev_list = [device]
+        ret, dev_name, dfm = check_device_name(d_name)
+        if not ret:
+            th_exc(DB_IncorrectDeviceName,
+                  "device name (" + d_name + ") syntax error (should be [tango:][//instance/]domain/family/member)",
+                  "DataBase::AddDevice()")
+        # Lock table
+        self.db.add_device(server_name, (dev_name, dfm) , klass_name, alias=alias)
+
+    @command(dtype_in=('str',), doc_in='argin[0] : server name\nargin[1] : class name', dtype_out=('str',), doc_out='The list of devices for specified server and class.')
+    def DbGetDeviceList(self, argin):
+        """ Get a list of devices for specified server and class.
+
+        :param argin: argin[0] : server name
+        argin[1] : class name
+        :type: PyTango.DevVarStringArray
+        :return: The list of devices for specified server and class.
+        :rtype: PyTango.DevVarStringArray """
+        self._log.debug("In DbGetDeviceList()")
+        server_name = replace_wildcard(argin[0])
+        class_name = replace_wildcard(argin[1])
+        return self.db.get_device_list(server_name, class_name)
+
+
+# DbExportDevice is executed in the post_init_cb function below.
+# It needs to be separated from the actual device to prevent the device in
+# gevent mode to queue the request to the gevent thread and waitting for it.
+def DbExportDevice(self, argin):
+    """ Export a device to the database
+
+    :param argin: Str[0] = Device name
+    Str[1] = CORBA IOR
+    Str[2] = Device server process host name
+    Str[3] = Device server process PID or string ``null``
+    Str[4] = Device server process version
+    :type: PyTango.DevVarStringArray
+    :return:
+    :rtype: PyTango.DevVoid """
+    self._log.debug("In DbExportDevice()")
+    if len(argin) < 5:
+        self.warn_stream("DataBase::DbExportDevice(): insufficient export info for device ")
+        th_exc(DB_IncorrectArguments,
+               "insufficient export info for device",
+               "DataBase::ExportDevice()")
+
+    dev_name, IOR, host, pid, version = argin[:5]
+    dev_name = dev_name.lower()
+    if pid.lower() == 'null':
+        pid = "-1"
+    self.db.export_device(dev_name, IOR, host, pid, version)
 
-        self.dyn_attr(tmp_dev_list)
 
-        self.export_device(device, "database")
-        self.py_dev_list += tmp_dev_list
-        
-#==================================================================
-#
-#    DataBase class main method
-#
-#==================================================================
 def main():
     #Parameters management
     global options
@@ -2903,6 +1751,8 @@ def main():
                             help="database type")
         parser.add_argument("-e", "--embedded",dest="embedded",default=False,
                             action="store_true")
+        parser.add_argument("--logging_level","-l",dest="logging_level",type=int,
+                            default=0,help="logging_level 0:WARNING,1:INFO,2:DEBUG")
         parser.add_argument('argv',nargs=argparse.REMAINDER)
         options = parser.parse_args()
         options.argv = ["DataBaseds"] + options.argv
@@ -2910,13 +1760,21 @@ def main():
         parser = OptionParser()
         parser.add_option("--db_access",dest="db_access",default="sqlite3",
                           help="database type")
+        parser.add_option("-l", "--logging_level",dest="logging_level",default=0,
+                          help="logging_level 0:WARNING,1:INFO,2:DEBUG")
         parser.add_option("-e","--embedded",dest="embedded",default=False,
                           action="store_true")
         (options,args) = parser.parse_args()
         options.argv = ["DataBaseds"] + args
 
     log_fmt = '%(threadName)-14s %(levelname)-8s %(asctime)s %(name)s: %(message)s'
-    logging.basicConfig(format=log_fmt, stream=sys.stdout, level=logging.INFO)
+    if options.logging_level == 1:
+        logging_level = logging.INFO
+    elif options.logging_level == 2:
+        logging_level = logging.DEBUG
+    else:
+        logging_level = logging.WARNING
+    logging.basicConfig(format=log_fmt, stream=sys.stdout,level=logging_level)
     try:
         db_name = "sys/database/" + options.argv[1]
         set_db_name(db_name)
@@ -2928,51 +1786,89 @@ def main():
         import traceback
         traceback.print_exc()
 
+
+def __monkey_patch_database_class():
+    DataBaseClass = DataBase.TangoClassClass
+
+    def device_factory(self, device_list):
+        """for internal usage only"""
+
+        dev_name = get_db_name()
+
+        klass = self.__class__
+        klass_name = klass.__name__
+        info = get_class_by_class(klass)
+        klass = get_constructed_class_by_class(klass)
+
+        if info is None:
+            raise RuntimeError("Device class '%s' is not " \
+                               "registered" % klass_name)
+
+        if klass is None:
+            raise RuntimeError("Device class '%s' as not been " \
+                               "constructed" % klass_name)
+
+        deviceClassClass, deviceImplClass, deviceImplName = info
+        deviceImplClass._device_class_instance = klass
+
+        device = deviceImplClass(klass, dev_name)
+        self._add_device(device)
+        tmp_dev_list = [device]
+
+        self.dyn_attr(tmp_dev_list)
+
+        self.export_device(device, "database")
+        self.py_dev_list += tmp_dev_list
+
+    DataBaseClass.device_factory = device_factory
+
+
+def __monkey_patch_util(util):
+    # trick util to execute orb_run instead of the usual server_run
+    util._original_server_run = util.server_run
+    util.server_run = util.orb_run
+
+
 def __run(db_name,argv):
     """
     Runs the Database DS as a standalone database. Run it with::
-    
+
         ./DataBaseds pydb-test -ORBendPoint giop:tcp::11000
     """
     PyTango.Util.set_use_db(False)
     util = PyTango.Util(argv)
-    util.add_class(DataBaseClass, DataBase, 'DataBase')
+    __monkey_patch_util(util)
+    __monkey_patch_database_class()
 
     dbi = DbInter()
     util.set_interceptors(dbi)
-    #util.set_serial_model(PyTango.SerialModel.NO_SYNC)
-    util.server_init()
 
-    dserver = util.get_dserver_device()
-    dserver_name = dserver.get_name()
-    dserver_ior = util.get_dserver_ior(dserver)
-
-    dbase = util.get_device_by_name(db_name)
-    dbase_name = dbase.get_name()
-    dbase_ior = util.get_device_ior(dbase)
-
-    host = util.get_host_name()
-    pid = util.get_pid_str()
-    version = util.get_version_str()
-        
-    dbase.DbExportDevice([dserver_name, dserver_ior, host, pid, version])
-    dbase.DbExportDevice([dbase_name, dbase_ior, host, pid, version])
+    def post_init_cb():
+        logging.debug("post_init_cb()")
+        util = PyTango.Util.instance()
+        dserver = util.get_dserver_device()
+        dserver_name = dserver.get_name()
+        dserver_ior = util.get_dserver_ior(dserver)
+        dbase = util.get_device_by_name(db_name)
+        dbase_name = dbase.get_name()
+        dbase_ior = util.get_device_ior(dbase)
+        host = util.get_host_name()
+        pid = util.get_pid_str()
+        version = util.get_version_str()
+        DbExportDevice(dbase, [dserver_name, dserver_ior, host, pid, version])
+        DbExportDevice(dbase, [dbase_name, dbase_ior, host, pid, version])
+
+    run((DataBase,), args=argv, util=util, post_init_callback=post_init_cb,
+        green_mode=GreenMode.Gevent, verbose=True)
 
-    print("Ready to accept request")
-    util.orb_run()
-#    util.server_run()
 
 def __run_embedded(db_name,argv):
     """Runs the Database device server embeded in another TANGO Database
     (just like any other TANGO device server)"""
+    __monkey_patch_database_class()
+
+    run((DataBase,), args=argv, util=util, green_mode=GreenMode.Gevent)
 
-    py_util = PyTango.Util(argv)
-    py_util.add_class(DataBaseClass, DataBase, 'DataBase')
 
-    util = PyTango.Util.instance()
-    util.server_init()
-    print("Ready to accept request")
-    util.server_run()
-    
 if __name__ == '__main__':
     main()

-- 
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