#ifndef _ISQLQUERYAS_H_
#define _ISQLQUERYAS_H_
// {C350F251-9EEB-494f-8045-8AEFD7F0EF05}
static const GUID IID_ISQLiteServer =
{ 0xc350f251, 0x9eeb, 0x494f, { 0x80, 0x45, 0x8a, 0xef, 0xd7, 0xf0, 0xef, 0x5 } };
// {9ADD3BC1-403A-4914-B892-A1C2B2D7DEE6}
static const GUID IID_ISQLiteClient =
{ 0x9add3bc1, 0x403a, 0x4914, { 0xb8, 0x92, 0xa1, 0xc2, 0xb2, 0xd7, 0xde, 0xe6 } };
// {9CB47E38-B7B2-498a-838B-1F83FA35E048}
static const GUID IID_ISQLiteSecurityDB =
{ 0x9cb47e38, 0xb7b2, 0x498a, { 0x83, 0x8b, 0x1f, 0x83, 0xfa, 0x35, 0xe0, 0x48 } };
typedef struct _sql_return
{
static const int SQL_OK = 0; /* Successful result */
/* beginning-of-error-codes */
static const int SQL_ERROR = 1; /* SQL error or missing database */
static const int SQL_INTERNAL = 2; /* Internal logic error in SQLite */
static const int SQL_PERM = 3; /* Access permission denied */
static const int SQL_ABORT = 4; /* Callback routine requested an abort */
static const int SQL_BUSY = 5; /* The database file is locked */
static const int SQL_LOCKED = 6; /* A table in the database is locked */
static const int SQL_NOMEM = 7; /* A malloc() failed */
static const int SQL_READONLY = 8; /* Attempt to write a readonly database */
static const int SQL_INTERRUPT = 9; /* Operation terminated by sqlite3_interrupt()*/
static const int SQL_IOERR = 10; /* Some kind of disk I/O error occurred */
static const int SQL_CORRUPT = 11; /* The database disk image is malformed */
static const int SQL_NOTFOUND = 12; /* NOT USED. Table or record not found */
static const int SQL_FULL = 13; /* Insertion failed because database is full */
static const int SQL_CANTOPEN = 14; /* Unable to open the database file */
static const int SQL_PROTOCOL = 15; /* NOT USED. Database lock protocol error */
static const int SQL_EMPTY = 16; /* Database is empty */
static const int SQL_SCHEMA = 17; /* The database schema changed */
static const int SQL_TOOBIG = 18; /* String or BLOB exceeds size limit */
static const int SQL_CONSTRAINT = 19; /* Abort due to constraint violation */
static const int SQL_MISMATCH = 20; /* Data type mismatch */
static const int SQL_MISUSE = 21; /* Library used incorrectly */
static const int SQL_NOLFS = 22; /* Uses OS features not supported on host */
static const int SQL_AUTH = 23; /* Authorization denied */
static const int SQL_FORMAT = 24; /* Auxiliary database format error */
static const int SQL_RANGE = 25; /* 2nd parameter to sqlite3_bind out of range */
static const int SQL_NOTADB = 26; /* File opened that is not a database file */
static const int SQL_ERR_CONNECT = 210; /* File opened that is not a database file */
static const int SQL_ERR_NOT_CONNECTED = 211;
static const int SQL_ERR_PARAM_ERROR = 212;
static const int SQL_ERR_LOW_MEM = 213;
static const int SQL_ERR_CONNECTION = 214;
static const int SQL_ROW = 100; /* sqlite3_step() has another row ready */
static const int SQL_DONE = 101; /* sqlite3_step() has finished executing */
}_sql_errors;
typedef struct _sql_db_open_typest
{
static const int SQL_OPEN_READONLY = 0x00000001; /* Ok for sqlite3_open_v2() */
static const int SQL_OPEN_READWRITE = 0x00000002; /* Ok for sqlite3_open_v2() */
static const int SQL_OPEN_CREATE = 0x00000004; /* Ok for sqlite3_open_v2() */
static const int SQL_OPEN_NOMUTEX = 0x00008000; /* Ok for sqlite3_open_v2() */
static const int SQL_OPEN_FULLMUTEX = 0x00010000; /* Ok for sqlite3_open_v2() */
static const int SQL_OPEN_SHAREDCACHE = 0x00020000; /* Ok for sqlite3_open_v2() */
static const int SQL_OPEN_PRIVATECACHE = 0x00040000; /* Ok for sqlite3_open_v2() */
}_sql_db_open_mode;
typedef int sql_stmt_handle;
class ISQLiteClient :public IUnknown
{
public:
virtual bool sql_ping( DWORD& dwMiliSecDuration, int* p_out_AmountOfDataSent = NULL ) = 0;
virtual int sql_connect( const char* server,
int port ,
const char* username,
const char* password,
const char* database,
int db_open_mode ) = 0;
virtual int sql_prepair_v2( const char *zSql, sql_stmt_handle& iStmt ) = 0;
virtual int sql_step( sql_stmt_handle& iStmt , int iBufferRows = 1 ) = 0;
virtual int sql_finalize( sql_stmt_handle &iStmt ) = 0;
virtual int sql_reset( sql_stmt_handle &iStmt ) = 0;
virtual int sql_clear_bindings( sql_stmt_handle &iStmt ) = 0;
virtual int sql_column_int( sql_stmt_handle& iStmt , int iCol ) = 0;
virtual const char* sql_column_text( sql_stmt_handle &iStmt, int iCol) = 0;
virtual double sql_column_double( sql_stmt_handle &iStmt, int iCol ) = 0;
virtual __int64 sql_column_int64( sql_stmt_handle& iStmt , int iCol ) = 0;
virtual const void *sql_column_blob( sql_stmt_handle& iStmt , int iCol ) = 0;
virtual int sql_column_bytes( sql_stmt_handle& iStmt , int iCol) = 0;
virtual int sql_column_count( sql_stmt_handle &iStmt ) = 0;
virtual int sql_column_type( sql_stmt_handle &iStmt , int N ) = 0;
virtual const char* sql_column_name( sql_stmt_handle &iStmt , int N ) = 0;
//bind_xxxx()
virtual int sql_bind_int( sql_stmt_handle &iStmt , int N , int iValue ) = 0;
virtual int sql_bind_int64( sql_stmt_handle &iStmt , int N , __int64 iValue ) = 0;
virtual int sql_bind_double( sql_stmt_handle &iStmt , int N , double iValue ) = 0;
virtual int sql_bind_text( sql_stmt_handle &iStmt , int N , char* sValue , int iValLenght ) = 0;
virtual int sql_bind_text16( sql_stmt_handle &iStmt , int N , void* sValue , int iValLenght ) = 0;
virtual int sql_bind_blob( sql_stmt_handle &iStmt , int N , void* sValue , int iValLenght ) = 0;
virtual int sql_bind_zeroblob( sql_stmt_handle &iStmt , int N , int iValLenght ) = 0;
virtual int sql_bind_null( sql_stmt_handle &iStmt , int N ) = 0;
virtual int sql_close()=0;
//error report
virtual const char* sql_errormsg( )=0;
virtual int sql_errno( ) = 0;
};
class IConnectionObserver
{
public:
virtual BOOL ClientConnected( DWORD dwUniqueID , const char* szIP , int iPort )=0;
virtual void ClientDisconnected( DWORD dwUniqueID , const char* szIP , int iPort )=0;
};
class IProtocolErrorObserver
{
public:
virtual void ProtocolError( DWORD dwUniqueID , const char* szIP , int iPort )=0;
};
class ISQLiteServer :public IUnknown
{
public:
virtual bool SetSecurityDatabase( const char* szFullPath )=0;
virtual bool StartServer( int iPort = 6603 , bool bCreateThread = true )=0;
virtual bool StopServer()=0;
virtual void observer_add( IConnectionObserver* p )=0;
virtual void observer_add( IProtocolErrorObserver* p )=0;
};
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//user row representations
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
typedef struct _tagUsersData
{
_tagUsersData()
{id = 0;username = "";password = "";iPermissions = 0;}
_tagUsersData(int idx , const char* usernamex, const char* passwordx, int iPermissionx )
{id = idx;username = usernamex;password = passwordx;iPermissions = iPermissionx;}
_tagUsersData( const _tagUsersData& cpy )
{id = cpy.id;username = cpy.username;password = cpy.password;iPermissions = cpy.iPermissions;}
int id;
string username;
string password;
int iPermissions;
}UsersData,*PUsersData;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//db_list row represetation
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
typedef struct _tagDBData
{
_tagDBData()
{id = 0;db_name=""; db_path=""; db_users_table="";}
_tagDBData( int idx , const char* db_namex, const char* db_pathx, const char* db_users_tablex )
{id = idx;db_name=db_namex; db_path=db_pathx; db_users_table=db_users_tablex;}
_tagDBData( const _tagDBData& cpy )
{id = cpy.id;db_name = cpy.db_name;db_path = cpy.db_path;db_users_table = cpy.db_users_table;}
int id;
string db_name;
string db_path;
string db_users_table;
}DBData,*PDBData;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//avoid passing STL containers
//Deal with heap differences
//allocations/dealocations and
//SLT implementations differences
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
class IDBList
{
public:
virtual void add( int,const char*,const char*,const char*)=0;
};
class cdb_list :public IDBList
{
public:
void add( int id ,
const char* db_name,
const char* db_path,
const char* db_users_table )
{
data.push_back( DBData(id,db_name,db_path,db_users_table ) );
}
vector<DBData> data;
};
class IURSERList
{
public:
virtual void add( int,const char*,const char*,int )=0;
};
class cuser_list :public IURSERList
{
public:
void add( int id ,
const char* username,
const char* password,
int iPermission )
{
data.push_back( UsersData(id,username,password,iPermission ) );
}
vector<UsersData> data;
};
//ISQLiteSecurityDB helper interface to deal with the security db
class ISQLiteSecurityDB :public IUnknown
{
public:
//open a security databse
virtual bool OpenDB( const char* szFullPath , //path to the security database
BOOL bCreateIfNoneExist = TRUE //should the DB be created if it does not exist
) = 0;
//add an entry in the db_list and create the table if needed
//creates all tables if they do not exit
virtual bool addDatabaseToList(
const char* szBdName,
const char* szDBPath,
const char* szUsersTable = NULL,
const char* szUserName = NULL,
const char* szPassword = NULL,
int iPermissions = 16383
) = 0;
//add username,password,permission given 1. table_name
//creates table if it does not exit
virtual bool addUserToTable( const char* szTable,
const char* szUserName,
const char* szPassword,
int iPermission = 16383 ) = 0;
//add username,password,permission given 1. db_name
//creates table if it does not exit
virtual bool addUserToDB( const char* db_name,
const char* szUserName,
const char* szPassword,
int iPermission = 16383 ) = 0;
//remove entry for database and optionally drop the users table that is linked with db_name
virtual bool remDBandUserList( const char* db_name , BOOL bRemoveUsers = FALSE ) = 0;
//remove user information table
virtual bool remTable( const char* szTableName ) = 0;
//remove user from table
virtual bool remUser(const char* szTableName, const char* szUserName ) = 0;
//remove user from database
virtual bool remDBUser(const char* db_name, const char* szUserName ) = 0;
//get a user record given 1.table_name 2.username
virtual bool getUserRecord( const char* szTableName , const char* szUserName , IURSERList* data ) = 0;
//get the specific DB record given 1. db_name
virtual bool getDBRecord( const char* szDBName , IDBList* p ) = 0;
//get the entrie list of the databases in the db_list
virtual bool getDBList( IDBList* p ) = 0;
//get all entries from the User_list table given 1. tbale_Name
virtual bool getUserList( const char* szTableName , IURSERList* data ) = 0;
//update username given 1.table_name and 2. Old_username
virtual bool updateUsernameInTable( const char* szTableName, const char* szOLDUserName , const char* szNewUserName ) = 0;
//update username given 1.db_name and 2. Old_username
virtual bool updateUsernameInDB( const char* szBDName, const char* szOLDUserName , const char* szNewUserName ) = 0;
//update password given 1.table_name and 2. szUserName
virtual bool updatePasswordInTable( const char* szTableName, const char* szUserName , const char* szNewPassword ) = 0;
//update password given 1.db_name and 2. szUserName
virtual bool updatePasswordInDB( const char* db_name, const char* szUserName , const char* szNewPassword ) = 0;
//update permission given 1.table_name and 2. szUserName
virtual bool updatePermissionInTable( const char* table_name, const char* szUserName , int iNewPermission ) = 0;
//update permission given 1.db_name and 2. szUserName
virtual bool updatePermissionInDB( const char* db_name, const char* szUserName , int iNewPermission ) = 0;
//update db_path given 1.db_name
virtual bool updateDBpath( const char* db_name, const char* new_path ) = 0;
//update db_name given 1.db_name
virtual bool updateDBname( const char* db_name, const char* new_name ) = 0;
//update db_user_table given 1.db_name
virtual bool updateDBuser_table( const char* db_name, const char* new_usertable ) = 0;
};
#endif //_ISQLQUERYAS_H_