qcubed/framework

View on GitHub
travis/configuration.inc.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php

// Config file for travis build

if (!defined('SERVER_INSTANCE')) {
    // The Server Instance constant is used to help ease web applications with multiple environments.
    // Feel free to use, change or ignore.
    define('SERVER_INSTANCE', 'dev');

    /** Define constants here to control the differences between your development, test and production environments. */

    switch (SERVER_INSTANCE) {
        case 'dev':
            define('__DESIGN_MODE__', 1);
            define('ALLOW_REMOTE_ADMIN', true);
            break;

        case 'test':
        case 'stage':
            /* Constant to allow/disallow remote access to the admin pages
             * e.g. the generated form_drafts, codegen, or any other script that calls QApplication::CheckRemoteAdmin()
             *
             * If set to TRUE, anyone can access those pages.
             * If set to FALSE, only localhost can access those pages.
             * If set to an IP address (e.g. "12.34.56.78"), then only localhost and 12.34.56.78 can access those pages.
             * If set to a comma-separate list of IP addresses, then localhoost and any of those IP addresses can access those pages.
             *
             * Of course, you can also feel free to remove QApplication::CheckRemoteAdmin() call on any of these pages,
             * which will completely ignore ALLOW_REMOTE_ADMIN altogether.
             */
            define('ALLOW_REMOTE_ADMIN', true);
            break;

        case 'prod':
            define('__MINIMIZE__', true);    // remove comments and minimize html output on production server
            define('ALLOW_REMOTE_ADMIN', false);
            break;
    }

    /**
     * The constants below are initially setup for a development environment. As your product matures, move specific
     * constants into the switch statement above as needed.
     */

    /* Constants for Document Root (and Virtual Directories / Subfoldering)
     *
     * IMPORTANT NOTE FOR WINDOWS USERS
     * Please note that all paths should use standard "forward" slashes instead of "backslashes".
     * So windows paths would look like "c:/wwwroot" instead of "c:\wwwroot".
     *
     * QCubed uses __DOCROOT__, __VIRTUAL_DIRECTORY__, and __SUBDIRECTORY__ as shortcuts to help
     * specify the various paths to files using the constants later in this file. However, you
     * are free to define the individual constants how you would like, in order to set up a custom
     * configuration on your sever.
     *
     * For purposes here, 'http://hostname/' . __VIRTUAL_DIRECTORY__ . __SUBDIRECTORY__ when entered into a 
     * browser should correspond to __DOCROOT__ . __SUBDIRECTORY__ in your file system.
     *
     * For example, if your example web application where http://my.domain.com/index.php points to
     * /home/web/htdocs/index.php, then you should specify:
     *        __DOCROOT__ = '/home/web/htdocs' (note the leading slash and no ending slash)
     * On Windows, if you have http://my.domain.com/index.php pointing to c:\webroot\files\index.php, then:
     *        __DOCROOT__ = 'c:/webroot/files' (again, note the leading c:/ and no ending slash)
     *
     * If you are using Virtual Directories, where http://not.my.domain.com/~my_user/index.php
     * points to /home/my_user/public_html/index.php, then:
     *        __DOCROOT__ = '/home/my_user/public_html'
     *        __SUBDIRECTORY__ = ''
     *        __VIRTUAL_DIRECTORY__ = '/~my_user'
     *
     * If you have installed QCubed within a SubDirectory of the Document Root, so for example
     * the QCubed "index.php" page is accessible at http://my.domain.com/frameworks/qcubed/index.php, and
     * is located on your server at /home/my_user/public_html/frameworks/qcubed/index.php, then:
     *        __DOCROOT__ = '/home/my_user/public_html'
     *        __SUBDIRECTORY__ = '/frameworks/qcubed' (again, note the leading and no ending slash)
     *        __VIRTUAL_DIRECTORY__ = ''
     *
     * In combination with Virtual Directories, if you (for example) have the QCubed "index.php" page
     * accessible at http://not.my.domain.com/~my_user/qcubed/index.php, and the index.php resides at
     * c:\users\my_user\public_html\index.php, then:
     *        __DOCROOT__ = 'c:/users/my_user/public_html'
     *        __VIRTUAL_DIRECTORY__ = '/~my_user'
     *        __SUBDIRECTORY__ = '/qcubed'
     */

    define ('__DOCROOT__', __WORKING_DIR__);
    define ('__VIRTUAL_DIRECTORY__', '');
    if (!defined ('__SUBDIRECTORY__')) {
        define ('__SUBDIRECTORY__', '');
    }

    /*
     * The project directory is where your editable project files go. These include files
     * that will be generated by the code generator. 
     */

    // for travis build only, we point to the project directory inside the install directory
    define ('__PROJECT__', __DOCROOT__ . __SUBDIRECTORY__ . '/install/project');
    define ('__INCLUDES__', __PROJECT__ . '/includes');
    define ('__QCUBED__', __INCLUDES__); // on the way to deprecation

    /*
     * These definitions will hardly change, but you may change them based on your setup
     */
    // Will be defined in the test.php file
    //define ('__CONFIGURATION__', __INCLUDES__ . '/configuration');
    // The directory where the external libraries are placed, that are not in composer
    define ('__EXTERNAL_LIBRARIES__', __DOCROOT__ . __SUBDIRECTORY__ . '/vendor');
    // The application includes directory
    define ('__APP_INCLUDES__', __INCLUDES__ . '/app_includes');

    /*
     * If you are using Apache-based mod_rewrite to perform URL rewrites, please specify "apache" here.
     * Otherwise, specify as "none"
     */
    define ('__URL_REWRITE__', 'none');

    /* Absolute File Paths for Internal Directories
     *
     * Please specify the absolute file path for all the following directories in your QCubed-based web
     * application.
     *
     * Note that all paths must start with a slash or 'x:\' (for windows users) and must have
     * no ending slashes.  (We take advantage of the __INCLUDES__ to help simplify this section.
     * But note that this is NOT required.  These directories can also reside outside of the
     * Document Root altogether.  So feel free to use or not use the __DOCROOT__ and __INCLUDES__
     * constants as you wish/need in defining your other directory constants.)
     */

    // The QCubed Directories
    // Includes subdirectories for QCubed Customizations in CodeGen and QForms, i18n PO files, QCache storage, etc.
    // Also includes the _core subdirectory for the QCubed Core
    define ('__PLUGINS__', __DOCROOT__ . __SUBDIRECTORY__ . '/vendor/qcubed/plugin');

    define ('__TMP__', __PROJECT__  . '/tmp');
    define ('__FILE_CACHE__', __TMP__ . '/cache');
    define ('__PLUGIN_TMP__', __TMP__ . '/plugin.tmp/');

    // The QCubed Core
    define ('__QCUBED_CORE__', __DOCROOT__ . __SUBDIRECTORY__ . '/includes');

    // Destination for Code Generated class files
    define ('__MODEL__', __INCLUDES__ . '/model' );
    define ('__MODEL_GEN__', __PROJECT__ . '/generated/model_base' );
    define ('__MODEL_CONNECTOR__', __INCLUDES__ . '/connector' );
    define ('__MODEL_CONNECTOR_GEN__', __PROJECT__ . '/generated/connector_base' );
    define ('__DIALOG__', __INCLUDES__ . '/dialog' );
    define ('__DIALOG_GEN__', __PROJECT__ . '/generated/dialog_base' );
    define ('__PANEL__', __INCLUDES__ . '/panel' );
    define ('__PANEL_GEN__', __PROJECT__ . '/generated/panel_base' );

    /* Relative File Paths for Web Accessible Directories
     *
     * Please specify the file path RELATIVE FROM THE DOCROOT for all the following web-accessible directories
     * in your QCubed-based web application.
     *
     * For some directories (e.g. the Examples site), if you are no longer using it, you STILL need to
     * have the constant defined.  But feel free to define the directory constant as blank (e.g. '') or null.
     *
     * Note that constants must have a leading slash and no ending slash, and they MUST reside within
     * the Document Root.
     *
     * (We take advantage of the __SUBDIRECTORY__ constant defined above to help simplify this section.
     * Note that this is NOT required.  Feel free to use or ignore.)
     */

    // Destination for generated forms. Relative to __DOCROOT__.
    define ('__FORMS__', __SUBDIRECTORY__ . '/install/project/forms');

    define ('__FORM_LIST_ITEMS_PER_PAGE__', 20);


    // __DOCROOT__ relative location of QCubed-specific Web Assets (JavaScripts, CSS, Images, and PHP Pages/Popups)
    // Note: These locations are for use by the framework only. You should put your own files in __APP*_ASSETS__ directories defined below
    define ('__PROJECT_ASSETS__', __SUBDIRECTORY__ . '/install/project/assets');
    define ('__VENDOR_ASSETS__', __SUBDIRECTORY__ . '/vendor');
    define ('__QCUBED_ASSETS__', __SUBDIRECTORY__ . '/assets');
    define ('__PLUGIN_ASSETS__',  __VENDOR_ASSETS__ . '/qcubed/plugin');

    define ('__JS_ASSETS__', __QCUBED_ASSETS__ . '/js');
    define ('__CSS_ASSETS__', __QCUBED_ASSETS__ . '/css');
    define ('__IMAGE_ASSETS__', __QCUBED_ASSETS__ . '/images');
    define ('__PHP_ASSETS__', __QCUBED_ASSETS__ . '/php');

    define ('__CACHE_ASSETS__', __QCUBED_ASSETS__ . '/cache');
    define ('__CACHE__', __DOCROOT__ . __CACHE_ASSETS__);

    define ('__IMAGE_CACHE_ASSETS__', __CACHE_ASSETS__ . '/images');
    define ('__IMAGE_CACHE__', __DOCROOT__ . __IMAGE_CACHE_ASSETS__);


    // For special situations that support viewing of uploaded files in the browser. You can remove this define for addeed security
    define ('__QCUBED_UPLOAD_ASSETS__', __QCUBED_ASSETS__ . '/upload');
    define ('__QCUBED_UPLOAD__', __DOCROOT__ . __QCUBED_UPLOAD_ASSETS__);


    // Location of asset files for your application
    /** The path prefix for your publicly accessible javascript files to be used in URI generation */
    define ('__APP_JS_ASSETS__', __PROJECT_ASSETS__ . '/js');
    /** The path prefix for your publicly accessible CSS files to be used in URI generation */
    define ('__APP_CSS_ASSETS__', __PROJECT_ASSETS__ . '/css');
    /** The path prefix for your publicly accessible image files to be used in URI generation */
    define ('__APP_IMAGE_ASSETS__', __PROJECT_ASSETS__ . '/images');
    /** The path prefix for your publicly accessible php files to be used in URI generation */
    define ('__APP_PHP_ASSETS__', __PROJECT_ASSETS__ . '/php');

    /** The path prefix for your publicly accessible cache files to be used in URI generation */
    define ('__APP_CACHE_ASSETS__', __PROJECT_ASSETS__ . '/cache');
    /** The path prefix for your cache files to be used in the filesystem path generation */
    define ('__APP_CACHE__', __DOCROOT__ . __APP_CACHE_ASSETS__);

    /** The path prefix for your publicly accessible image cache files to be used in URI generation */
    define ('__APP_IMAGE_CACHE_ASSETS__', __APP_CACHE_ASSETS__ . '/images');
    /** The path prefix for your image cache files to be used in the filesystem path generation */
    define ('__APP_IMAGE_CACHE__', __DOCROOT__ . __APP_IMAGE_CACHE_ASSETS__);

    /** The path prefix for your publicly accessible upload directory to be used in URI generation */
    define ('__APP_UPLOAD_ASSETS__', __PROJECT_ASSETS__ . '/upload');
    /** The path prefix for your publicly accessible upload directory to be used in the filesystem path generation */
    define ('__APP_UPLOAD__', __DOCROOT__ . __APP_UPLOAD_ASSETS__);

    // There are two ways to add jQuery JS files to QCubed. Either by absolute paths (Google CDN of
    // the jQuery library is awesome! It's the default option below) - or by using the jQuery
    // installation that's local to QCubed (in that case, paths must be relative to __JS_ASSETS__

    define ('__JQUERY_BASE__', ' http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js');
    define ('__JQUERY_EFFECTS__', ' http://ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.js');

    // The original, non-minified jQuery for debugging purposes.
    //define ('__JQUERY_BASE__', ' http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.js');
    //define ('__JQUERY_EFFECTS__', ' http://ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/jquery-ui.js');

    // If you want to use the local jQuery files, specify the paths relative to __JS_ASSETS__
    // or just uncomment the 2 lines below.
    // define ('__JQUERY_BASE__',  'jquery/jquery.min.js,jquery/jquery-migrate.min.js');
    // define ('__JQUERY_EFFECTS__',   'jquery/jquery-ui.custom.min.js');

    // The original, non-minified jQuery for debugging purposes.
    // define ('__JQUERY_BASE__',  'jquery/jquery.js,jquery/jquery-migrate.js');
    // define ('__JQUERY_EFFECTS__',   'jquery/jquery-ui.custom.js');

    // The core qcubed javascript file to be used.
    define ('__QCUBED_JS_CORE__',  'qcubed.js');

    define ('__JQUERY_CSS__', 'jquery-ui-themes/ui-qcubed/jquery-ui.custom.css');

    // Location of the QCubed-specific web-based development tools, like codegen.php
    define ('__DEVTOOLS_ASSETS__', __PHP_ASSETS__ . '/_devtools');

    // Location of the Examples site
    define ('__EXAMPLES__', __PHP_ASSETS__ . '/examples');

    // Location of .po translation files
    define ('__QI18N_PO_PATH__', __INCLUDES__ . '/i18n');

    /* Database Connection SerialArrays
     *
     * Note that all Database Connections are defined as constant serialized arrays.  QCubed supports
     * connections to an unlimited number of different database sources.  Each database source, referenced by
     * a numeric index, will have its DB Connection SerialArray stored in a DB_CONNECTION_# constant
     * (where # is the numeric index).
     *
     * The SerialArray can have the following keys:
     * "adapter" (Required), options are:
     *        MySql (MySQL v4.x, using the old mysql extension)
     *        MySqli (MySQL v4.x, using the new mysqli extension)
     *        MySqli5 (MySQL v5.x, using the new mysqli extension)
     *        SqlServer (Microsoft SQL Server)
     *        SqlServer2005 (Microsoft SQL Server 2005/2008 using new sqlsrv extension, Windows only)
     *        PostgreSql (PostgreSQL)
     * "server" (Required) is the db server's name or IP address, e.g. localhost, 10.1.1.5, etc.
     * "port" is the port number - default is the server-specified default
     * "database", "username", "password" should be self explanatory
     * "dateformat" is an optional value for the desired db date format, the default value is
     *        'YYYY-MM-DD hhhh:mm:ss' if not defined or null
     * "profiling" is true or false, defining whether or not you want to enable DB profiling - default is false
     *        NOTE: Profiling should only be enabled when you are actively wanting to profile a
     *        specific PHP script or scripts.  Because of SIGNIFICANT performance degradation,
     *        it should otherwise always be OFF.
     * "encoding": Only used for MYSQL. Specifies the encoding for traffic between the client and the database.
     * "onlyfullgroupby": This controls whether your database can accept ambiguous select fields when doing
     *   aggregate clauses (see the QQ::Select example for more detail). You only need to set this if your
     *   database adapter doesn't have the right value. In some databases, this is configurable.
     *   In particular, MYSQL 5.7.5 changed the default of this value to true.  Our adapter has this set to false.
     *   You can see what your setting is by executing 'SELECT @@sql_mode' in mysql; If ONLY_FULL_GROUP_BY appears
     *   in the list, you should set this configuration value to true.
     *
     * Note: any option not used or set to blank will result in using the default value for that option
     */
    require_once (getenv("DB") . '.inc.php');

    /*<--
    define('DB_CONNECTION_1', serialize(array(
    'adapter' => '{db1_adapter}',
    'server' => '{db1_serverAddress}',
    'port' => '{db1_serverport}',
    'database' => '{db1_dbname}',
    'username' => '{db1_username}',
    'password' => '{db1_password}',
    'caching' => false,
    'profiling' => false,
    'encoding' => 'utf8',
    'dateformat' => null,
    'onlyfullgroupby' => defined by db adapter)));
    -->*/

    // Additional Database Connection Strings can be defined here (e.g. for connection #2, #3, #4, #5, etc.)
    //            define('DB_CONNECTION_2', serialize(array('adapter'=>'SqlServer', 'server'=>'localhost', 'port'=>null, 'database'=>'qcubed', 'username'=>'root', 'password'=>'', 'profiling'=>false, 'encoding' => 'utf8')));
    //            define('DB_CONNECTION_3', serialize(array('adapter'=>'MySqli', 'server'=>'localhost', 'port'=>null, 'database'=>'qcubed', 'username'=>'root', 'password'=>'', 'profiling'=>false, 'encoding' => 'utf8')));
    //            define('DB_CONNECTION_4', serialize(array('adapter'=>'MySql', 'server'=>'localhost', 'port'=>null, 'database'=>'qcubed', 'username'=>'root', 'password'=>'', 'profiling'=>false, 'encoding' => 'utf8')));
    //            define('DB_CONNECTION_5', serialize(array('adapter'=>'PostgreSql', 'server'=>'localhost', 'port'=>null, 'database'=>'qcubed', 'username'=>'root', 'password'=>'', 'profiling'=>false, 'encoding' => 'utf8')));
    //            define('DB_CONNECTION_6', serialize(array('adapter' => 'InformixPdo', 'host' => 'maxdata', 'server' => 'maxdata', 'service' => 9088, 'protocol' => 'onsoctcp', 'database' => 'qcubed', 'username' => 'root', 'password' => '', 'profiling' => false, 'encoding' => 'utf8')));

    // Maximum index of the DB connections defined by DB_CONNECTION_# constants above
    // When reading the DB_CONNECTION_# constants, it will only go up to (and including) the index defined here
    // See ApplicationBase::InitializeDatabaseConnections()
    define ('MAX_DB_CONNECTION_INDEX', 1);

    /** The value for QApplication::$EncodingType constant */
    define('__QAPPLICATION_ENCODING_TYPE__', 'UTF-8');

    // (For PHP > v5.1) Setup the default timezone (if not already specified in php.ini)
    if ((function_exists('date_default_timezone_set')) && (!ini_get('date.timezone')))
        date_default_timezone_set('America/Los_Angeles');


    /*
     * Caching support for QCubed (Vaibhav Kaushal Jan 21, 2012)
     * Determines which class as a Cache Provider. It should be a subclass of QAbstractCacheProvider.
     * Setting it to null will disable caching. Current implentations are
     *
     * "QCacheProviderMemcache": this will use Memcache as the caching provider.
     *   You must have the 'php5-memcache' package installed for this provider to work.
     *
     * "QCacheProviderLocalMemory": a local memory cache provider with a lifespan of the request
     *   or session (if KeepInSession is configured).
     *
     * "QCacheProviderAPC": supports the APC interface. To use it, use PECL to install either
     * APC or APCu.
     *
     * "QCacheProviderNoCahce": provider which does no caching at all
     *
     * "QMultiLevelCacheProvider": a provider that can combine multiple providers into one.
     *   This can be used for example to combine the LocalMemory cache provider with the Memcache based provider.
     */
    define("CACHE_PROVIDER_CLASS", null);

    /*
     * Options passed to the constructor of the Caching Provider class above.
     * For QCacheProviderMemcache, it's an array, where each item is an associative array of
     * server configuration options.
     * Please see the documentation for the constructor for each provider for a description of the accepted
     * options.
     */
    define ('CACHE_PROVIDER_OPTIONS' , serialize(
        array(
             array('host' => '127.0.0.1', 'port' => 11211, ),
             //array('host' => '10.0.2.2', 'port' => 11211, ), // adds a second server
        )
    ) );

    /*
     * Support for Watchers and automated updating of objects that display the results of table queries.
     *
     * The preferred way to setup your watcher is to make changes to the
     * public/includes/controls/QWatcher.class.php file. However, you can also set up your watcher here
     * using the following define. The main purpose of the define is to help with automated testing
     * and the examples site.
     */
    //define ('WATCHER_CLASS', 'QWatcherDB');

    /* Form State Handler. Determines which class is used to serialize the form in-between Ajax callbacks.
     *
     * Possible values are:
     * "QFormStateHandler": This is the "standard" FormState handler, storing the base64 encoded session data
     *    (and if requested by QForm, encrypted) as a hidden form variable on the page, itself.
     *
     * "QSessionFormStateHandler": Simple Session-based FormState handler.  Uses PHP Sessions so it's very straightforward
     *    and simple, utilizing the session handling and cleanup functionality in PHP, itself.
     *    The downside is that for long running sessions, each individual session file can get
     *    very, very large, storing all hte various formstate data.  Eventually (if individual
     *    session files are larger than 10MB), you can theoretically observe a geometrical
     *    degradation of performance.
     *
     * "QFileFormStateHandler": This will store the formstate in a pre-specified directory (__FILE_FORM_STATE_HANDLER_PATH__)
     *    on the file system. This offers significant speed advantage over PHP SESSION because EACH
     *    form state is saved in its own file, and only the form state that is needed for loading will
     *    be accessed (as opposed to with session, ALL the form states are loaded into memory
     *    every time).
     *    The downside is that because it doesn't utilize PHP's session management subsystem,
     *    this class must take care of its own garbage collection/deleting of old/outdated
     *    formstate files.
     *
     * "QDbBackedFormStateHandler": This will store the formstate in a predefined table in one of the DBs in the array above.
     *    It provides a way to maintain the FormStates without creating too many files on the server.
     *    It also makes sure that the application remains fast and provides all the features of QFileFormStateHandler.
     *    The algorithm to periodically clean up the DB is also provided (just like QFileFormStateHandler) .
     *
     *    To use the QDbBackedFormStateHandler, the following two constants must be defined:
     *       1. __DB_BACKED_FORM_STATE_HANDLER_DB_INDEX__ : It is the numerical index of the DB from the list of DBs defined
     *             above where the table to store the FormStates is present. Note, it is the numerical Index, not the DB name.
     *             e.g. If it is present in the DB_CONNECTION_1, then the value must be defined as '1'.
     *       2. __DB_BACKED_FORM_STATE_HANDLER_TABLE_NAME__ : It is the name of the table where the FormStates must be stored
     *              It must have following 4 columns:
     *                  i) page_id: varchar(80) - It must be the primary key.
     *                 ii) save_time: integer - This column should be indexed for performance reasons
     *                iii) session_id: varchar(32) - This column should be indexed for performance reasons
     *                 iv) state_data: text - This column must NOT be indexed otherwise it will degrade the performance.
     *
     * NOTE: Formstates can be large, depending on the complexity of your forms.
     *       For MySQL, you might have to increase the max_allowed_packet variable in your my.cnf file to the maximum size of a formstate.
     *       Also for MySQL, you should choose a MEDIUMTEXT type of column, rather than TEXT. TEXT is limited to 64KB,
     *       which will not be big enough for moderately complex forms, and will result in data errors.
     */
    define('__FORM_STATE_HANDLER__', 'QFormStateHandler');

    // If using the QFileFormStateHandler, specify the path where QCubed will save the session state files (has to be writeable!)
    define('__FILE_FORM_STATE_HANDLER_PATH__', __PROJECT__ . '/tmp');

    // If using the QDbBackedSessionHandler, define the DB index where the table to store the formstates is present
    define('__DB_BACKED_FORM_STATE_HANDLER_DB_INDEX__', 1);
    // If using QDbBackedSessionHandler, specify the table name which would hold the formstates (must meet the requirements laid out above)
    define('__DB_BACKED_FORM_STATE_HANDLER_TABLE_NAME__', 'qc_formstate');


    /*
     * QCubed allows you to save / read / write your user PHP sessions in a database.
     * This is immensely helpful when you want to develop your QCubed based application
     * to support running on two different web servers with same data backends or with load balancing.
     * If you are using QSessionFormStateHandler, it also automatically centralizes your formstates.
     *
     * To avail this feature, you must have a dedicated table in one of your databases above.
     * The table must have 3 columns with follwing names and datatypes (note that column names should match exactly):
     *
     * [Column 1]
     *      Name = id
     *      Data Type = varchar / character with variable length. Must hold session number + session name. Typically this is 34 characters, but
     *                         you should make it big enough to handle any situation you may encounter.
     *
     * [Column 2]
     *      Name = last_access_time
     *      Data type = integer
     *
     * [Column 3]
     *      Name = data
     *      Data type = text
     *
     * For this to work, we need to know two things:
     * 1. The DB_CONNECTION index (repeat: the numerical index) of the database from the list of databases above
     *          where this table is located.
     * 2. The name of the table in  the database.
     *
     * Notes:
     * 1. if you do not want to use this feature, set the value of DB_BACKED_SESSION_HANDLER_DB_INDEX to 0.
     * 2. It is recommended that you create a primary key on the 'id' field and an index on the 'last_access_time' field
     *      to speed up the database queries.
     * 3. This feature does not make use of the codegen feature. So you may exclude this table from being codegened.
     */
    // The database index where the Session storage tables are present. Remember, define it as an integer.
    define("DB_BACKED_SESSION_HANDLER_DB_INDEX", 0);

    // The table name to be used for session data storage (must meet the requirements laid out above)
    define("DB_BACKED_SESSION_HANDLER_TABLE_NAME", "qc_session");

    // Define the Filepath for the error page (path MUST be relative from the DOCROOT)
    define('ERROR_PAGE_PATH', __PHP_ASSETS__ . '/error_page.php');

    // Define the Filepath for any logged errors
    define('ERROR_LOG_PATH', __TMP__ . '/error_log');

    // Name of session variable used to save the state of form objects.
    define('__SESSION_SAVED_STATE__', 'QSavedState');

    // To Log ALL errors that have occurred, set flag to true
    //            define('ERROR_LOG_FLAG', true);

    // To enable the display of "Friendly" error pages and messages, define them here (path MUST be relative from the DOCROOT)
    //            define('ERROR_FRIENDLY_PAGE_PATH', __PHP_ASSETS__ . '/friendly_error_page.php');
    //            define('ERROR_FRIENDLY_AJAX_MESSAGE', 'Oops!  An error has occurred.\r\n\r\nThe error was logged, and we will take a look into this right away.');

    // If using HTML Purifier, the location of the writeable cache directory.
    //define ('__PURIFIER_CACHE__', __FILE_CACHE__ . '/purifier');

    /** Uncomment if you are using QTimer to do performance testing. Will automatically output the results of your timers to the file. */
    //define ('__TIMER_OUT_FILE__', __TMP__ . '/timers.txt');

    // Some controls depend on FontAwesome, an open-source library of icons embedded in a font. This way of doing icons allows them to be easily scaled
    // The default define grabs it from a public repository. However, if you need it even when not connected to the internet,
    // you can also install it locally through composer.
    define('__FONT_AWESOME__', 'https://opensource.keycdn.com/fontawesome/4.6.3/font-awesome.min.css');
    // To instead install with composer:
    // composer require fortawesome/font-awesome ^4.6
    // and set your define to:
    // define('__FONT_AWESOME__', __VENDOR_ASSETS__ . '/fortawesome/font-awesome/css/font-awesome.min.css');
}