www.pudn.com > saac.rar > sasql.c


#define _SASQL_C_

#include "version.h"

#ifdef _SASQL//新添加

#include "main.h"

#include 
#include 
#include 

HENV henv = SQL_NULL_HENV;
HDBC hdbc = SQL_NULL_HDBC;
HSTMT hstmt = SQL_NULL_HSTMT;
RETCODE rc;

	SQLCHAR sid[16]; 
	SQLCHAR sps[16]; 
	SQLINTEGER err;

typedef struct tagConfig
{
    char    SQL_DSN[16]; 

    char    SQL_USER[16];

    char    SQL_INFOTABLE[16];    

		char    SQL_LOCK[16];   
		
		char    SQL_RegTime[16]; 
		
		char    SQL_LoginTime[16]; 
		
		char    SQL_OnlineName[16]; 
		
}Config;

Config config;

int AUTOREG;
int USEMSSQL;
void check_return (RETCODE rc,HENV henv,HDBC hdbc,HSTMT hstmt );

static int readConfig( char *path )
{
    char buf[255];
    FILE *fp;

    fp = fopen( path , "r" );
    if( fp == NULL ){ return -2; }

    while( fgets( buf , sizeof( buf ) , fp )){
        char command[255];
        char param[255];
        chop(buf);
        
        easyGetTokenFromString( buf , 1 , command , sizeof( command ));
        easyGetTokenFromString( buf , 2 , param , sizeof( param ));

				if( strcmp( command , "USEMSSQL" ) == 0 ){
        		USEMSSQL = atoi( param );
        		if(USEMSSQL==0)break;
      	}
        if( strcmp( command , "SQL_DSN" ) == 0 ){
            snprintf( config.SQL_DSN , sizeof( config.SQL_DSN) , param) ;
            log("数据库 DSN:%s\n",config.SQL_DSN);
        } else if( strcmp( command , "SQL_INFOTABLE" ) == 0 ){
            snprintf( config.SQL_INFOTABLE , sizeof( config.SQL_INFOTABLE) , param) ;
				  	log("人物信息表:%s\n",config.SQL_INFOTABLE);
        } else if( strcmp( command , "SQL_LOCK" ) == 0 ){
            snprintf( config.SQL_LOCK , sizeof( config.SQL_LOCK) , param) ;
						log("锁定账号表:%s\n",config.SQL_LOCK);
        } else if( strcmp( command , "SQL_REGTIME" ) == 0 ){
            snprintf( config.SQL_RegTime , sizeof( config.SQL_RegTime) , param) ;
						log("注册时间:%s\n",config.SQL_RegTime);
				} else if( strcmp( command , "AUTOREG" ) == 0 ){
        		AUTOREG = atoi( param );
        		if(AUTOREG){
        			log("开放自动注册:YES\n");
        		}else{
        			log("开放自动注册:NO\n");
        		}
      	}
    }
   	fclose(fp);
    return 0;
}

BOOL sasql_init( void )
{

  readConfig("acserv.cf");
  if(USEMSSQL==0)return TRUE;
	char buf[257];
	char ODBC[257];
	short buflen;
//	printf ("Initialize the environment structure.\n");
	SQLAllocEnv (&henv);
	
//	printf ("Initialize the connection structure.\n");
	SQLAllocConnect (henv,&hdbc);
	
	printf("连接ODBC驱动器...");
	sprintf(ODBC,"DSN=%s",config.SQL_DSN);

	rc = SQLDriverConnect(hdbc,0,ODBC,SQL_NTS,(UCHAR*) buf,sizeof (buf),&buflen,SQL_DRIVER_COMPLETE);
	check_return (rc,henv,hdbc,hstmt);
	printf ("成功\n");
	SQLAllocStmt (hdbc,&hstmt);
	SQLBindCol(hstmt, 1, SQL_C_CHAR,&sid,16, &err);
	SQLBindCol(hstmt, 2, SQL_C_CHAR,&sps,16, &err);
}

void sasql_close( void )
{
	if(USEMSSQL==0)return;
//	printf ("Free the statement handle.\n");
	SQLFreeStmt (hstmt,SQL_DROP);
	
//	printf ("Disconnect from the data source.\n");
	SQLDisconnect (hdbc);
	
//	printf ("Free the connection structure.\n");
	SQLFreeConnect (hdbc);
	
//	printf ("Free the environment structure.\n");
	SQLFreeEnv (henv);
}

int sasql_query(char *id, char *ps)
{
	if(USEMSSQL==0)return TRUE;
	SQLCHAR sqlstr[128];
	SQLCHAR szPass[64]={0};
	SQLINTEGER cbPass;
	SQLCancel(hstmt);
	sprintf(sqlstr,"select * from %s where ID='%s'",config.SQL_INFOTABLE,id);
	rc = SQLExecDirect( hstmt, sqlstr, SQL_NTS);
	check_return (rc,henv,hdbc,hstmt);
	if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) 
	{
  	while( SQL_SUCCESS == SQLFetch(hstmt) ){
  		if(SQLGetData(hstmt, 2, SQL_C_CHAR, szPass, 50, &cbPass) == SQL_SUCCESS)
  			if(strcmp(szPass,ps)==0){
					return 1;
				}else{
					printf("账号%s密码错误!\n",id);
					return 2;
				}
		}
		printf("账号%s未注册!\n",id);
		return 3;
	}
	return 0;
}

BOOL sasql_register(char *id, char *ps)
{
	if(AUTOREG){
		SQLCHAR sqlstr[128];
		SQLCancel(hstmt);
		sprintf(sqlstr,"select * from %s where ID='%s'",config.SQL_INFOTABLE,id);
		rc = SQLExecDirect( hstmt, sqlstr, SQL_NTS);
		check_return (rc,henv,hdbc,hstmt);
		if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) 
		{
			while( SQL_SUCCESS == SQLFetch(hstmt) )
				return FALSE;
			SQLCancel(hstmt);
			sprintf(sqlstr,"INSERT INTO %s (ID,PassWord,RegTime,Path) VALUES ('%s','%s',NOW(),'char/0x%x')",config.SQL_INFOTABLE, id, ps, getHash(id) & 0xff);
			rc = SQLExecDirect( hstmt, sqlstr, SQL_NTS);
			check_return (rc,henv,hdbc,hstmt);
			if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO){
				printf("新账号%s注册成功!\n",id);
				return TRUE;
			}
		}
	}
	return FALSE;
}


void check_return (RETCODE rc,HENV henv,HDBC hdbc,HSTMT hstmt )
{
	UCHAR state_str [SQL_MAX_MESSAGE_LENGTH];
	SDWORD native_error;
	UCHAR error_msg [SQL_MAX_MESSAGE_LENGTH];
	SWORD error_msg_avail = SQL_MAX_MESSAGE_LENGTH - 1;
	SWORD error_msg_len;
	RETCODE local_rc;
	
	if (rc != SQL_ERROR && rc != SQL_SUCCESS_WITH_INFO )
	{
	return;
	}
	
	local_rc = SQLError(henv,hdbc,hstmt,state_str,&native_error,error_msg,error_msg_avail,&error_msg_len);
	if (local_rc != SQL_SUCCESS && rc !=SQL_SUCCESS_WITH_INFO)
	{
		fprintf(stderr,"Uninterpretable error; exiting \n");
		exit (EXIT_FAILURE);
	}
	
	if (rc == SQL_SUCCESS_WITH_INFO)
	{
		fprintf(stderr,"Fatal Error %s: %s\n", state_str,error_msg);
		return;
	}
	
		fprintf(stderr,"Fatal Error %s: %s\n",state_str,error_msg); 
		exit (EXIT_FAILURE);
}

BOOL sasql_craete_lock( void )
{
	char sqlstr[128];
	SQLCancel(hstmt);
	sprintf(sqlstr,"create table %s (Name varchar(16),PRIMARY KEY (Name));",config.SQL_LOCK);
	rc = SQLExecDirect( hstmt, sqlstr, SQL_NTS);
	check_return (rc,henv,hdbc,hstmt);
	if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) 
	{
		printf("锁定用户表建立成功!\n");
  	return TRUE;
	}
	printf("锁定用户表建立失败!\n");
	return FALSE;
}

BOOL sasql_craete_userinfo( void )
{
	char sqlstr[255];
	SQLCancel(hstmt);
	sprintf(sqlstr,"CREATE TABLE %s ("
									"ID varchar(16) NOT NULL,"
									"PassWord varchar(16) NOT NULL,"
									"IP varchar(16),"
									"RegTime datetime,"
									"LoginTime datetime,"
									"OnlineName varchar(32),"
									"Online int,"
									"Path varchar(10),"
									"PRIMARY KEY (ID));",config.SQL_INFOTABLE);
	rc = SQLExecDirect( hstmt, sqlstr, SQL_NTS);
	check_return (rc,henv,hdbc,hstmt);
	if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) 
	{
		printf("用户信息表建立成功!\n");
  	return TRUE;
	}
	printf("用户信息表建立失败!\n");
	return FALSE;
}

BOOL sasql_chehk_lock( char *idip )
{
	char sqlstr[128];
	SQLCancel(hstmt);
	sprintf(sqlstr,"select * from %s where Name='%s'", config.SQL_LOCK, idip);
	rc = SQLExecDirect( hstmt, sqlstr, SQL_NTS);
	check_return (rc,henv,hdbc,hstmt);
	if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) 
	{
		while( SQL_SUCCESS == SQLFetch(hstmt) )
			return TRUE;
	}
	return FALSE;
}

BOOL sasql_add_lock( char *idip )
{
	char sqlstr[128];
	SQLCancel(hstmt);
	
	sprintf(sqlstr,"INSERT INTO %s (Name) VALUES ('%s')", config.SQL_LOCK, idip);

	rc = SQLExecDirect( hstmt, sqlstr, SQL_NTS);
	check_return (rc,henv,hdbc,hstmt);
	if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) 
	{
		return TRUE;
	}
	return FALSE;
}

BOOL sasql_del_lock( char *idip )
{
	char sqlstr[128];
	SQLCancel(hstmt);

	sprintf(sqlstr,"delete from config.SQL_LOCK where Name='%s'", config.SQL_LOCK, idip);

	rc = SQLExecDirect( hstmt, sqlstr, SQL_NTS);
	check_return (rc,henv,hdbc,hstmt);
	if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) 
	{
		return TRUE;
	}
	return FALSE;
}
#endif