#######################################################
#
# Configuration options for the Mckoi SQL Database.
#
# NOTE: Lines starting with '#' are comments.
#
#######################################################

#
# database_path - The path where the database data files
#   are located.
#   See the 'root_path' configuration property for the
#   details of how the engine resolves this to an
#   absolute path in your file system.

database_path=./data

#
# log_path - The path the log files are written.
#   See the 'root_path' configuration property for the
#   details of how the engine resolves this to an
#   absolute path in your file system.
#   The log path must point to a writable directory.  If
#   no log files are to be kept, then comment out (or
#   remove) the 'log_path' variable.

log_path=./log

#
# root_path - If this is set to 'jvm' then the root
#   path of all database files is the root path of the
#   JVM (Java virtual machine) running the database
#   engine.  If this property is set to 'configuration'
#   or if it is not present then the root path is the
#   path of this configuration file.
#   This property is useful if you are deploying a
#   database and need this configuration file to be the
#   root of the directory tree of the database files.

root_path=configuration
#root_path=jvm

#
# jdbc_server_port - The TCP/IP port on this host where
#   the database server is mounted.  The default port
#   of the Mckoi SQL Database server is '9157'

jdbc_server_port=9157

#
# ignore_case_for_identifiers - If enabled all
#   identifiers are compared case insensitive.  If
#   disabled (the default) the case of the identifier
#   is important.
#   For example, if a table called 'MyTable' contains
#   a column called 'my_column' and this property is
#   enabled, the identifier 'MYTAble.MY_COlumN' will
#   correctly reference the column of the table.  If
#   this property is disable a not found error is
#   generated.
#   This property is intended for compatibility with
#   other database managements systems where the case
#   of identifiers is not important.

ignore_case_for_identifiers=disabled

#
# socket_polling_frequency - Mckoi SQL maintains a pool
#   of connections on the server to manage dispatching
#   of commands to worker threads.  All connections on
#   the jdbc port are polled frequently, and ping
#   requests are sent to determine if the TCP
#   connection has closed or not.  This value determines
#   how frequently the connections are polled via the
#   'available' method.
#   The value is the number of milliseconds between each
#   poll of the 'available' method of the connections
#   input socket stream.  Different Java implementations
#   will undoubtedly require this value to be tweaked.
#   A value of '3' works great on the Sun NT Java 1.2.2
#   and 1.3 Java runtimes.
#
#   NOTE: This 'socket polling' module is a horrible hack
#   and will be removed at some point when the threading
#   performance improves or there is an API for non-
#   blocking IO.  I'll probably write an alternative
#   version for use with the improved Java version.

socket_polling_frequency=3



# ----- PLUG-INS -----

#
# database_services - The services (as a Java class) that
#   are registered at database boot time.  Each service
#   class is separated by a semi-colon (;) character.
#   A database service must extend
#   com.mckoi.database.ServerService
#
#database_services=mypackage.MyService

#
# function_factories - Registers one or more FunctionFactory
#   classes with the database at boot time.  A
#   FunctionFactory allows user-defined functions to be
#   incorporated into the SQL language.  Each factory class
#   is separated by a semi-colon (;) character.
#
#function_factories=mypackage.MyFunctionFactory

#
# The Java regular expression library to use.  Currently
# the engine supports the Apache Jakarta regular expression
# library, and the GNU LGPL regular expression library.
# These two regular expression libraries can be found at the
# following web sites:
#
# GNU Regexp: http://www.cacas.org/~wes/java/
# Apache Regexp: http://jakarta.apache.org/regexp/
#
# The libraries provide similar functionality, however they
# are released under a different license.  The GNU library
# is released under the LGPL and is compatible with GPL
# distributions of the database.  The Apache Jakarta library
# is released under the Apache Software License and must not
# be linked into GPL distributions.
#
# Use 'regex_library=gnu.regexp' to use the GNU library, or
# 'regex_library=org.apache.regexp' to use the Apache
# library.
#
# NOTE: To use either library, you must include the
#  respective .jar package in the Java classpath.

regex_library=gnu.regexp




# ----- PERFORMANCE -----

#
# data_cache_size - The maximum amount of memory (in bytes)
#   to allow the memory cache to grow to.  If this is set
#   to a value < 4096 then the internal cache is disabled.
#   It is recommended that a database server should provide
#   a cache of 4 Megabytes (4194304).  A stand alone
#   database need not have such a large cache.

# data_cache_size=4194304
data_cache_size=0

#
# max_cache_entry_size - The maximum size of an element
#   in the data cache.  This is available for tuning
#   reasons and the value here is dependant on the type
#   of data being stored.  If your data has more larger
#   fields that would benefit from being stored in the
#   cache then increase this value from its default of
#   8192 (8k).

max_cache_entry_size=8192

#
# lookup_comparison_list - When this is set to 'enabled'
#   the database attempts to optimize sorting by generating
#   an internal lookup table that enables the database to
#   quickly calculate the order of a column without having
#   to look at the data directly.  The column lookup
#   tables are only generated under certain query
#   conditions.  Set this to 'disabled' if the memory
#   resources are slim.

lookup_comparison_list=enabled

#
# lookup_comparison_cache_size - The maximum amount of
#   memory (in bytes) to allow for column lookup tables.
#   If the maximum amount of memory is reached, the lookup
#   table is either cached to disk so that is may be
#   reloaded later if necessary, or removed from memory
#   entirely.  The decision is based on how long ago the
#   table was last used.
#
#   This property only makes sense if the
#   'lookup_comparison_list' property is enabled.
#
# NOTE: This property does nothing yet...

lookup_comparison_cache_size=2097152

#
# index_cache_size - The maximum amount of memory (in
#   bytes) to allow for the storage of column indices.
#   If the number of column indices in memory reaches
#   this memory threshold then the index blocks are
#   cached to disk.
#
# ISSUE: This is really an implementation of internal
#   memory page caching but in Java.  Is it necessary?
#   Why not let the OS handle it with its page file?
#
# NOTE: This property does nothing yet...

index_cache_size=2097152

#
# max_worker_threads - The maximum number of worker
#   threads that can be spawned to handle incoming
#   requests.  The higher this number, the more
#   'multi-threaded' the database becomes.  The
#   default setting is '4'.

maximum_worker_threads=4

#
# soft_index_storage - If this is set to 'enabled', the
#   database engine will keep all column indices behind a
#   soft reference.  This enables the JVM garbage collector
#   to reclaim memory used by the indexing system if the
#   memory is needed.
#
#   This is useful for an embedded database where requests
#   are rare.  When the database part is idle, the index 
#   memory (that can take up significant space for large
#   tables) is reclaimed for other uses.  For a dedicated
#   database server it is recommended this is disabled.
#
#   Enable this if you need the engine to use less memory.
#   I would recommend the config property
#   'lookup_comparison_list' is disabled if this is enabled.
#   The default setting is 'disabled'.

soft_index_storage=disabled

#
# dont_synch_filesystem - If this is enabled, the engine
#   will not synchronize the file handle when a table change
#   is committed.  This will mean the data is not as
#   safe but the 'commit' command will work faster.  If this
#   is enabled, there is a chance that committed changes will
#   not get a chance to flush to the file system if the
#   system crashes.
#
#   It is recommended this property is left commented out.
#
#dont_synch_filesystem=enabled

#
# transaction_error_on_dirty_select - If this is disabled
#   the 4th conflict (dirty read on modified table) will
#   not be detected.  This has transactional consequences
#   that will cause data modifications to sometimes be
#   out of syncronization.  For example, one transaction
#   adds an entry, and another concurrent transaction
#   deletes all entries.  If this is disabled this
#   conflict will not be detected.  The table will end up
#   with the one entry added after commit.
#
#   It is recommended this property is left commented out.
#
#transaction_error_on_dirty_select=disabled






# ----- SPECIAL -----

#
# read_only - If this is set to 'enabled' then the database
#   is readable and not writable.  You may boot a database
#   in read only mode from multiple VM's.  If the database
#   data files are stored on a read only medium such as a
#   CD, then the property must be enabled else it will not
#   be possible to boot the database.
#   ( Uncomment the line below for read only mode )
#read_only=enabled




# ----- DEBUGGING -----

#
# debug_log_file - The file that is used to log all debug
#   information.  This file is stored in the 'log_path'
#   path.

debug_log_file=debug.log

#
# debug_level - The minimum debug level of messages that
#   are written to the log file.  Reducing this number
#   will cause more debug information to be written to
#   the log.
#     10 = INFORMATION
#     20 = WARNINGS
#     30 = ALERTS
#     40 = ERRORS

debug_level=20

#
# table_lock_check - If this is enabled, every time a
#   table is accessed a check is performed to ensure that
#   the table owns the correct locks.  If a lock assertion
#   fails then an error is generated in the log file.
#   This should not be enabled in a production system
#   because the lock assertion check is expensive. However
#   it should be used during testing because it helps to
#   ensure locks are being made correctly.

table_lock_check=disabled