/*

   Derby - Class org.apache.derby.iapi.reference.Attribute

   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to you under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

 */

package org.apache.derby.iapi.reference;


/**
	List of all connection (JDBC) attributes by the system.


	<P>
	This class exists for two reasons
	<Ol>
	<LI> To act as the internal documentation for the attributes. 
	<LI> To remove the need to declare a java static field for the attributes
	name in the protocol/implementation class. This reduces the footprint as
	the string is final and thus can be included simply as a String constant pool entry.
	</OL>
	<P>
	This class should not be shipped with the product.

	<P>
	This class has no methods, all it contains are String's which by
	are public, static and final since they are declared in an interface.
    
    <P>
    At some point this class should be replaced by
    org.apache.derby.shared.common.reference.Attribute.
    The issue is that this class is used by ij to check attributes,
    ij uses reflection on this class to get the list of valid attributes.
    The expanded class in shared has the client attributes as well.
    Ideally ij would work of an explicit list of attributes and not
    infer the set from reflection. See DERBY-1151
*/

public interface Attribute {

	/**
		Not an attribute but the root for the JDBC URL that Derby supports.
	*/
	String PROTOCOL = "jdbc:derby:";
		
	/**
	 * The SQLJ protocol for getting the default connection
	 * for server side jdbc
	 */
	String SQLJ_NESTED = "jdbc:default:connection";

	
	// Network Protocols.  These need to be rejected by the embedded driver.
	
	/**
	 * The protocol for Derby Network Client 
	 */ 
	String DNC_PROTOCOL = "jdbc:derby://";
	
	/** 
	 * The protocol for the IBM Universal JDBC Driver 
	 * 
	 */
	String JCC_PROTOCOL = "jdbc:derby:net:";
	
    /**
     * Attribute name for decrypting an encrypted database.
     */
    String DECRYPT_DATABASE = "decryptDatabase";

	/**
		Attribute name to encrypt the database on disk.
		If set to true, all user data is stored encrypted on disk.
	 */
	String DATA_ENCRYPTION = "dataEncryption";

	/**
		If dataEncryption is true, use this attribute to pass in the 
		secret key.  The secret key must be at least 8 characters long.
		This key must not be stored persistently in cleartext anywhere. 
	 */

	String BOOT_PASSWORD = "bootPassword";

    /**
	    The attribute that is used to chage the secret key of an encrypted
        database. The secret key must be at least 8 characters long.
		This key must not be stored persistently in cleartext anywhere. 
	 */

	String NEW_BOOT_PASSWORD = "newBootPassword";

    /**
     * Attribute name to start replication master mode for a database.
     * If used, REPLICATION_SLAVE_HOST is a required attribute.
     */
    String REPLICATION_START_MASTER = "startMaster";

    /**
     * Attribute name to stop replication master mode for a database.
     */
    String REPLICATION_STOP_MASTER = "stopMaster";

    /**
     * Attribute name to start replication slave mode for a database.
     */
    String REPLICATION_START_SLAVE = "startSlave";

    /**
     * Attribute name to stop replication slave mode for a database.
     */
    String REPLICATION_STOP_SLAVE = "stopSlave";

    /**
     * Attribute name to stop replication slave mode for a database.
     * Internal use only
     */
    String REPLICATION_INTERNAL_SHUTDOWN_SLAVE = "internal_stopslave";

    /**
     * If startMaster is true, this attribute is used to specify the
     * host name the master should connect to. This is a required
     * attribute.
     */
    String REPLICATION_SLAVE_HOST = "slaveHost";
    
    /**
     * Attribute name to start failover for a given database..
     */
    String REPLICATION_FAILOVER = "failover";

    /**
     * If startMaster is true, this attribute is used to specify the
     * port the master should connect to. This is an optional
     * attribute
     */
    String REPLICATION_SLAVE_PORT = "slavePort";

	/**
		The attribute that is used for the database name, from
		the JDBC notion of jdbc:<subprotocol>:<subname>
	*/
	String DBNAME_ATTR = "databaseName";

	/**
		The attribute that is used to request a shutdown.
	*/
	String SHUTDOWN_ATTR = "shutdown";

    /**
     * The attribute that is to keep autoloading idiom for driver
     */
    String DEREGISTER_ATTR = "deregister";

	/**
		The attribute that is used to request a database create.
	*/
	String CREATE_ATTR = "create";

    /**
        The attribute that is used to request a drop database.
    */
    String DROP_ATTR = "drop";

	/**
		The attribute that is used to set the user name.
	*/
	String USERNAME_ATTR = "user";


	/**
		The attribute that is used to set the user password.
	*/
	String PASSWORD_ATTR = "password";


	/**
		The attribute that is used to set the connection's DRDA ID.
	*/
	String DRDAID_ATTR = "drdaID";

	/**
		The attribute that is used to allow upgrade.
	*/
	String UPGRADE_ATTR = "upgrade";

	/**
		Put the log on a different device.
	 */
	String LOG_DEVICE = "logDevice";

	/**
		Set the territory for the database.
	*/
	String TERRITORY = "territory";

    /**
        Attribute for encrypting a database.
        Specifies the cryptographic services provider.
    */
    String CRYPTO_PROVIDER = "encryptionProvider";

    /**
        Attribute for encrypting a database.
        Specifies the cryptographic algorithm.
    */
    String CRYPTO_ALGORITHM = "encryptionAlgorithm";

    /**
        Attribute for encrypting a database.
        Specifies the key length in bytes for the specified cryptographic algorithm.
    */
	String CRYPTO_KEY_LENGTH = "encryptionKeyLength";

	/**
        Attribute for encrypting a database.
        Specifies the actual key. When this is specified
		all the supplied crypto information is stored
		external to the database, ie by the application.
	*/
	String CRYPTO_EXTERNAL_KEY = "encryptionKey";


    /**
	    The attribute that is used to chage the encryption 
        key of an encrypted database. When this is specified
        all the supplied crypto information is stored
        external to the database, ie by the application.
	*/
	String NEW_CRYPTO_EXTERNAL_KEY = "newEncryptionKey";


	/**
	   One can encrypt the database with an encryption key at create time.
	   For security reasons, this key is not made persistent in the database.

	   But it is necessary to verify the encryption key whenever booting the database  
	   before we access the data/logs to avoid the risk of corrupting the database because
	   of a wrong encryption key.

	   This attribute refers to the name of the file where encrypted data is stored for
	   verification of encryption key.
	 */
	String CRYPTO_EXTERNAL_KEY_VERIFY_FILE = "verifyKey.dat";

	
	/**
	 *	This attribute is used to request to  create a database from backup.
	 *  This will throw error if a database with same already exists at the 
	 *  location where we tring to create.
	 */
	String CREATE_FROM = "createFrom";

	/**
	 *	This attribute is used to request a database restore from backup.
	 *  It must be used only when the active database is corrupted,
	 *	because it will cleanup the existing database and replace 
	 *	it from the backup.
	 */
	String RESTORE_FROM = "restoreFrom";

	/**
		The attribute that is used to request a roll-forward recovery of the database.
	*/
	String ROLL_FORWARD_RECOVERY_FROM = "rollForwardRecoveryFrom";

    /**
     * securityMechanism sets the DRDA mechanism in-use for the client.
     * Internal only.
     */
    String CLIENT_SECURITY_MECHANISM = "securityMechanism";

    /**
     * Internal attributes. Mainly used by DRDA and Derby BUILTIN
     * authentication provider in some security mechanism context
     * (SECMEC_USRSSBPWD).
     *
     * DRDA_SECTKN_IN is the random client seed (RDs)
     * DRDA_SECTKN_OUT is the random server seed (RDr)
     */
    String DRDA_SECTKN_IN = "drdaSecTokenIn";
    String DRDA_SECTKN_OUT = "drdaSecTokenOut";
    /**
     * Internal attribute which holds the value of the securityMechanism
     * attribute specified by the client. Used for passing information about
     * which security mechanism to use from the network server to the embedded
     * driver. Use another name than "securityMechanism" in order to prevent
     * confusion if an attempt is made to establish an embedded connection with
     * securityMechanism specified (see DERBY-3025).
     */
    String DRDA_SECMEC = "drdaSecMec";

	/**
	 * Internal attribute. Used to always allow soft upgrade for
	 * authentication purposes in a two phase hard upgrade (to check
	 * database owner power before proceeding.  The purpose is to
	 * avoid failing soft upgrade due to a feature being set but not
	 * supported until after hard upgrade has taken place (e.g. during
	 * hard upgrade from 10.1 -> 10.3 or higher if
	 * derby.database.sqlAuthorization is set,
	 * cf. DD_Version#checkVersion).
	 */
	 String SOFT_UPGRADE_NO_FEATURE_CHECK = "softUpgradeNoFeatureCheck";

	/**
		Optional JDBC url attribute (at the database create time only) It can 
		be set to one of the following 2 values
		1) UCS_BASIC (This means codepoint based collation. This will also be 
		the default collation used by Derby if no collation attribute is 
		specified on the JDBC url at the database create time. This collation 
		is what Derby 10.2 and prior have supported)
		2)TERRITORY_BASED (the collation will be based on language 
       region specified by the existing Derby attribute called territory.
		If the territory attribute is not specified at the database create 
		time, Derby will use java.util.Locale.getDefault to determine the 
		territory for the newly created database. 
	*/
	String COLLATION = "collation";
}
