Database configuration objects

Updated: April 19, 2023

QDB databases are managed with configuration objects, each of which configures one database. The configuration objects are text files that specify the paths to the database schema and storage files as well as policy settings such as backups.

The files are named after the databases that they configure. For example, suppose you have two media content databases named hdd and cdrom. You would then create two configuration objects named hdd and cdrom. For an overview of all database-related files, see Summary of database files.

By using a separate SQLite storage file for each database, QDB allows you to dynamically load and unload individual databases so you can keep in memory only the data needed for the active client application.

Note: QDB doesn't support “on-the-fly” configuration changes after a database is loaded. To modify the configuration, you must unload the database, update its configuration object, and reload the database. You must also ensure that the changes are compatible with the previous configuration.

Configuration object contents

The database configuration object gets parsed by QDB to set up the database. Lines specifying parameters are in the form key::value. Unknown parameter types are ignored and so they can be made into comments, but you must still use the :: delimiter on the comment line. For example, you can enter MyComment:: on a line and QDB will treat it as an unsupported parameter and ignore that line. For an example of a database configuration, see Sample configuration object.

The configuration object must contain this parameter:
Filename
The name of the database storage file, which is the raw SQLite file. It must have an absolute path but it can refer to any file location. At database loading time, either this file or its parent directory must exist; otherwise, the loading attempt fails and QDB sets the status to Error. If the database file doesn't exist but its parent directory does, the file is restored from the newest valid backup (if possible) or a blank database file is created.
All other database configuration parameters are optional. You can define these parameters:
AutoAttach
A comma-separated list of other databases to attach to the current one (using the SQL ATTACH DATABASE statement) whenever a database connection is established.
Attached databases are a convenience to provide access to tables that are physically stored in different database files. This is useful for breaking up a database into separate pieces for performance reasons (each piece gets its own lock, which makes multi-user access more responsive). It's also useful for transfering parts of a database to different storage medias such as RAM filesystems.
QDB allows you to include attached databases in other maintenance operations, such as backup or vacuum.
Note: If any attached database is unavailable at loading time, QDB sets the current database's status to AttachWait and makes the database inaccessible.
BackupAttached, SizeAttached, VacuumAttached
These entries control what maintenance operations should apply to attached databases when a command is issued to the main database. Each parameter lists the attached databases affected by the operation.
Suppose you have a main database named mp3_tunes_0 with two attached databases named mp3_tunes_1 and mp3_tunes_2 and you define these paramaters:
AutoAttach::mp3_tunes_1,mp3_tunes_2
VacuumAttached::mp3_tunes_1
In this case, a qdb_vacuum() operation on mp3_tunes_0 will also vacuum mp3_tunes_1 but not mp3_tunes_2.
Note: Any database named in an operation-based attachment parameter such as VacuumAttached must also be named in AutoAttach, or that database won't be processed during the operation.
For more details on the scope of maintenance operations for attached databases, refer to qdb_backup(), qdb_getdbsize(), and qdb_vacuum().
BackupDir
A comma-separated list of directories that store database backups. When you specify multiple directories, they're used in rotation to store the backup files. This feature ensures that should a backup be interrupted or aborted by a power failure, another older backup is still available.
These directories must exist at loading time (though they don't need to contain valid backups); otherwise, the loading attempt fails and QDB sets the database status to Error. If any existing backup files are located in these directories, they are sorted by date and overwritten oldest-to-newest when performing backup operations and used in newest-to-oldest order when restoring a missing or corrupt database.
BackupVia
An interim directory that the database is copied into as part of the backup. To ensure the backup is consistent, QDB puts a read lock on the database while copying and compressing it, so the database may be locked a long time if the destination is slow (e.g., flash).
Suppose you specify:
BackupVia::/dev/shmem
When backing up, QDB locks the database, copies it to /dev/shmem, and releases the lock. Then, in a second step, QDB copies and compresses the database into the location specified by BackupDir, without needing to lock the database.
ClientSchemaFile
The name of the file (with an absolute path) that contains the SQL commands to execute every time a client calls qdb_connect().
Use this feature for changing database settings that can't be premanently modified. An example would be the PRAGMA commands, which modify non-table data such as journaling mode or case-sensitive-like status. Don't use client schema files to do regular database work because doing so slows down new connections.
You can also use this mechanism to implement cross-database triggers.
Collation, Function
These entries install user-provided collation (sorting) routines and scalar/aggregate functions. The argument format is a comma-separated list of library symbols in the form tag@library.so, where tag is the symbol name of the function description structure and library.so is the name of the shared library containing the code.
Unlike the paths to other key files, the library paths can be relative or absolute. Relative paths are looked up in the library search directories (refer to dlopen() in the QNX Neutrino C Library Reference for more details).
In this release, you can install multiple collation functions as well as multiple scalar functions per database. You can also specify symbols from as many shared libraries as you want. For example, you could write:
Collation::UTF-8_Sort@libsort.so,UTF-16_Sort@libsort.so
Function::sampleData@libstats.so,implToMtrc@libunits.so
For information about the function description structures and the setup and sorting functions that you must define, see the Writing User-Defined Functions chapter.
QDB checks for the existence of the libraries and the specified symbols at loading time. If any are not found, the loading attempt fails and QDB sets the database status to Error.
Compression
The compression algorithm to apply to backups. The supported options are:
  • none (for no compression, which is the default)
  • lzo (for LZO compression)
  • bzip (for BZIP2 compression)
  • diocopy (for direct I/O copy)
The lzo compression algorithm is the fastest but the bzip algorithm offers the highest compression. Direct I/O doesn't perform any compression; instead, QDB uses the fileset utility to copy the database using direct memory access (DMA). Direct I/O is a fast way to back up data if the persistent storage supports DMA.
The compressed files are named by adding the appropriate extensions to the original database filenames. By default, backup files aren't compressed.
CompressionVia
This entry is used with the BackupVia entry and any Compression setting specified for the backup. By default, the BackupVia feature first makes a raw/uncompressed copy of the database in the temporary directory and then performs the compression. This works if you have enough space and it read-locks the database for the least amount of time, but you can use less space (at the expense of more time) by compressing during the copy. This option is false by default; if you set it to true, the compression is done in the first step.
DataSchemaFile
The name of the file (with an absolute path) that creates the initial data in the database. This text file contains the SQL commands to populate the database when it is created.
This option is processed only if the SchemaFile option is set.
SchemaFile
The name of the file (with an absolute path) that contains the SQL commands to create the initial schema of tables, indexes, and views for the database. The schema file is used only to set up the database if it didn't already exist.
An initial schema is optional; without an initial schema, a new database will be empty.

Sample configuration object

This basic database configuration names the files for storing the database, defining the schema, and populating the database with initial data:
Filename::/root/tmp/cdrom0_db
SchemaFile::/etc/mm/sql/mmsync.sql
DataSchemaFile::/etc/mm/sql/mmsync_data.sql

You would give the configuration object the same name as the database storage file (cdrom0_db).