.. _without_sql_db:

Running a device server without SQL database
============================================

:audience:`administrators, developers`

Device server using file as database
------------------------------------

For device servers not able to access the Tango database (most of the
time due to network route or security reason), it is possible to start
them using file instead of a real database. This is done via the device
server

-file=<file name>

command line option. In this case,

-  Getting, setting and deleting class properties

-  Getting, setting and deleting device properties

-  Getting, setting and deleting class attribute properties

-  Getting, setting and deleting device attribute properties

are handled using the specified file instead of the Tango database. The
file is an ASCII file and follows a well-defined syntax with predefined
keywords. The simplest way to generate the file for a specific device
server is to use the Jive application. See [Jive]_
to get Jive documentation. The Tango database is not only used to store
device configuration parameters, it is also used to store device network
access parameter (the CORBA IOR). To allow an application to connect to
a device hosted by a device server using file instead of database, you
need to start it on a pre-defined port, and you must use one of the
underlying ORB option called *endPoint* like

myserver myinstance\_name -file=/tmp/MyServerFile -ORBendPoint
giop:tcp::<port number>

to start your device server. The device name passed to the client
application must also be modified in order to refect the non-database
usage. See :ref:`device naming <tango_object_naming>` to learn about Tango device name syntax.
Nevertheless, using this Tango feature prevents some other features to
be used :

-  No check that the same device server is running twice.

-  No device or attribute alias name.

-  In case of several device servers running on the same host, the user
   must manually manage a list of already used network port.

.. _device_server_without_database:

Device server without database
------------------------------

In some very specific cases (Running a device server within a lab during
hardware development...), it could be very useful to have a device
server able to run even if there is no database in the control system.
Obviously, running a Tango device server without a database means
loosing Tango features. The lost features are :

-  No check that the same device server is running twice.

-  No device configuration via properties.

-  No event generated by the server.

-  No memorized attributes

-  No device attribute configuration via the database.

-  No check that the same device name is used twice within the same
   control system.

-  In case of several device servers running on the same host, the user
   must manually manage a list of already used network port.

To run a device server without a database, the **-nodb** command line
option must be used. One problem when running a device server without
the database is to pass device name(s) to the device server. Within
Tango, it is possible to define these device names at two different
levels :

#. At the command line with the **-dlist** option: In case of device
   server with several device pattern implementation, the device name
   list given at command line is only for the last device pattern
   created in the *class\_factory()* method. In the device name list,
   the device name separator is the comma character.

#. At the device pattern implementation level: In the class inherited
   from the Tango::DeviceClass class via the re-definition of a well
   defined method called *device\_name\_factory()*

If none of these two possibilities is used, the tango core classes
defined one default device name for each device pattern implementation.
This default device name is *NoName*. Device definition at the command
line has the highest priority.

Example of device server started without database usage
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Without database, you need to start a Tango device server on a
pre-defined port, and you must use one of the underlying ORB option
called *endPoint* like

:command:`myserver myinstance\_name -ORBendPoint giop:tcp::<port number> -nodb
-dlist a/b/c`

The following is two examples of starting a device server not using the
database when the *device\_name\_factory()* method is not re-defined.

-  | StepperMotor et -nodb -dlist id11/motor/1,id11/motor/2
   | This command line starts the device server with two devices named
     *id11/motor/1* and *id11/motor/2*

-  | StepperMotor et -nodb
   | This command line starts a device server with one device named
     *NoName*

When the *device\_name\_factory()* method is re-defined within the
StepperMotorClass class.

.. code:: cpp
  :number-lines:

    void StepperMotorClass::device_name_factory(vector<string> &list)
    {
        list.push_back("sr/cav-tuner/1");
        list.push_back("sr/cav-tuner/2");
    }

-  | StepperMotor et -nodb
   | This commands starts a device server with two devices named
     *sr/cav-tuner/1* and *sr/cav-tuner/2*.

-  | StepperMotor et -nodb -dlist id12/motor/1
   | Starts a device server with only one device named id12/motor/1

Connecting client to device within a device server started without database
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In this case, the host and port on which the device server is running
are part of the device name. If the device name is *a/b/c*, the host is
*mycomputer* and the port *1234*, the device name to be used by client
is

mycomputer:1234/a/b/c#dbase=no

Some clients like atkpanel require *tango://* prefix:

tango://mycomputer:1234/a/b/c#dbase=no

See :ref:`device naming <tango_object_naming>` for all details about Tango object naming.


