userinterface.c

来自「MySQL数据库开发源码 值得一看哦」· C语言 代码 · 共 454 行

C
454
字号
/* Copyright (C) 2003 MySQL AB   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2 of the License, or   (at your option) any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA *//**************************************************************** I N C L U D E D   F I L E S                                  ****************************************************************/#include <ndb_global.h>#include "userInterface.h"#include "userHandle.h"/**************************************************************** L O C A L   C O N S T A N T S                                ****************************************************************//**************************************************************** L O C A L   D A T A   S T R U C T U R E S                    ****************************************************************//**************************************************************** L O C A L   F U N C T I O N S                                ****************************************************************/extern int localDbPrepare(UserHandle *uh);static int dbCreate(UserHandle *uh);/**************************************************************** L O C A L   D A T A                                          ****************************************************************/static char *create_subscriber_table = "CREATE TABLE subscriber(\subscriberNumber CHAR(12) NOT NULL primary key,\subscriberName   CHAR(32) NOT NULL,\groupId          INT      NOT NULL,\location         INT      NOT NULL,\activeSessions   INT      NOT NULL,\changedBy        CHAR(32) NOT NULL,\changedTime      CHAR(32) NOT NULL)";static char *create_group_table = "CREATE TABLE userGroup(\groupId          INT      NOT NULL primary key,\groupName        CHAR(32) NOT NULL,\allowRead        INT      NOT NULL,\allowInsert      INT      NOT NULL,\allowDelete      INT      NOT NULL)";static char *create_server_table = "CREATE TABLE server(\serverId         INT      NOT NULL,\subscriberSuffix CHAR(2)  NOT NULL,\serverName       CHAR(32) NOT NULL,\noOfRead         INT      NOT NULL,\noOfInsert       INT      NOT NULL,\noOfDelete       INT      NOT NULL,\PRIMARY KEY(serverId,subscriberSuffix))";static char *create_session_table = "CREATE TABLE userSession(\subscriberNumber CHAR(12) NOT NULL,\serverId         INT      NOT NULL,\sessionData      CHAR(2000) NOT NULL,\PRIMARY KEY(subscriberNumber,serverId))";/**************************************************************** P U B L I C   D A T A                                        ****************************************************************//******************************************************************************************************************************** L O C A L   F U N C T I O N S   C O D E   S E C T I O N      ********************************************************************************************************************************//******************************************************************************************************************************** P U B L I C   F U N C T I O N S   C O D E   S E C T I O N    ********************************************************************************************************************************//*-----------------------------------*//* Time related Functions            *//*                                   *//* Returns a double value in seconds *//*-----------------------------------*/double userGetTime(void){   static int initialized = 0;   static struct timeval initTime;   double timeValue;   if( !initialized ) {      initialized = 1;      gettimeofday(&initTime, 0);      timeValue = 0.0;   }   else {      struct timeval tv;      double s;      double us;      gettimeofday(&tv, 0);      s  = (double)tv.tv_sec  - (double)initTime.tv_sec;      us = (double)tv.tv_usec - (double)initTime.tv_usec;      timeValue = s + (us / 1000000.0);   }   return(timeValue);}void handle_error(SQLHDBC  hdbc,                  SQLHENV  henv,                   SQLHSTMT hstmt,                   SQLRETURN rc,                  char *filename,                  int lineno){#define MSG_LNG 512   int isError = 0;    SQLRETURN     ret = SQL_SUCCESS;   SQLCHAR       szSqlState[MSG_LNG];    /* SQL state string  */   SQLCHAR       szErrorMsg[MSG_LNG];    /* Error msg text buffer pointer */   SQLINTEGER    pfNativeError;          /* Native error code */   SQLSMALLINT   pcbErrorMsg;            /* Error msg text Available bytes */   if ( rc == SQL_SUCCESS || rc == SQL_NO_DATA_FOUND )      return;   else if ( rc == SQL_INVALID_HANDLE ) {      printf("ERROR in %s, line %d: invalid handle\n",               filename, lineno);      isError = 1;   }   else if ( rc == SQL_SUCCESS_WITH_INFO ) {      printf("WARNING in %s, line %d\n",               filename, lineno);      isError = 0;   }   else if ( rc == SQL_ERROR ) {      printf("ERROR in %s, line %d\n",               filename, lineno);      isError = 1;   }   fflush(stdout);   while ( ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO ) {      ret = SQLError(henv, hdbc, hstmt, szSqlState, &pfNativeError, szErrorMsg,                     MSG_LNG, &pcbErrorMsg);      switch (ret) {         case SQL_SUCCESS:         case SQL_SUCCESS_WITH_INFO:            printf("%s\n*** ODBC Error/Warning = %s, "                    "Additional Error/Warning = %d\n",                    szErrorMsg, szSqlState, pfNativeError);            if(ret == SQL_SUCCESS_WITH_INFO)               printf("(Note: error message was truncated.\n");            break;         case SQL_INVALID_HANDLE:           printf("Call to SQLError failed with return code of "                    "SQL_INVALID_HANDLE.\n");           break;         case SQL_ERROR:            printf("Call to SQLError failed with return code of SQL_ERROR.\n");            break;         case SQL_NO_DATA_FOUND:            break;         default:           printf("Call to SQLError failed with return code of %d.\n", ret);      }   }   if ( isError )      exit(1);}static int dbCreate(UserHandle *uh){   SQLRETURN rc;   SQLHSTMT  creatstmt;   if(!uh) return(-1);   rc = SQLAllocStmt(uh->hdbc, &creatstmt);   if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {      printf("Unable to allocate create statement\n");      return(-1);   }   rc = SQLExecDirect(creatstmt,(SQLCHAR *)create_subscriber_table, SQL_NTS);   if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {      printf("Unable to create subscriber table\n");      return(-1);   }   rc = SQLExecDirect(creatstmt,(SQLCHAR *)create_group_table, SQL_NTS);   if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {      printf("Unable to create group table\n");      return(-1);   }   rc = SQLExecDirect(creatstmt,(SQLCHAR *)create_server_table, SQL_NTS);   if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {      printf("Unable to create server table\n");      return(-1);   }   rc = SQLExecDirect(creatstmt,(SQLCHAR *)create_session_table, SQL_NTS);   if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {      printf("Unable to create session table\n");      return(-1);   }   rc = SQLTransact(uh->henv, uh->hdbc, SQL_COMMIT);   if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {      printf("Unable to commit all create table\n");      return(-1);   }   rc = SQLFreeStmt(creatstmt, SQL_DROP);   if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {      printf("Unable to free create statement\n");      return(-1);   }   return(0);}UserHandle *userDbConnect(uint32 createDb, char *dbName){   char      connStrIn[512]; /* ODBC Connection String */   char      connStrOut[2048];   SQLRETURN rc;   UserHandle *uh;   /*--------------------------*/   /* Build the Connect string */   /*--------------------------*/   sprintf(connStrIn,           "AutoCreate=%d;OverWrite=%d;DSN=%s",           createDb ? 1 : 0,           createDb ? 1 : 0,           dbName);   uh = calloc(1, sizeof(UserHandle));   if( !uh ) {      printf("Unable to allocate memory for Handle\n");      return(0);   }   /*---------------------------------*/   /* Allocate the Environment Handle */   /*---------------------------------*/   rc = SQLAllocEnv(&uh->henv);   if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {      printf("Unable to allocate Environment Handle\n");      return(0);   }   /*--------------------------------*/   /* Allocate the DB Connect Handle */   /*--------------------------------*/   rc = SQLAllocConnect(uh->henv, &uh->hdbc);   if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {      printf("Unable to allocate a connection handle\n");      return(0);   }   /*-------------------------*/   /* Connect to the Database */   /*-------------------------*/   rc = SQLDriverConnect(uh->hdbc, NULL,                         (SQLCHAR *)connStrIn, SQL_NTS,                        (SQLCHAR *)connStrOut, sizeof (connStrOut),                          NULL, SQL_DRIVER_NOPROMPT);   if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {handle_error(uh->hdbc, uh->henv, NULL, rc, __FILE__, __LINE__);      printf("Unable to connect to database server\n");      return(0);   }   rc = SQLSetConnectOption(uh->hdbc, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF);   if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {      printf("Unable to set connection option\n");      return(0);   }   rc = SQLAllocStmt(uh->hdbc, &uh->stmt);   if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {      printf("Unable to allocate immediate statement\n");      return(0);   }   if( createDb )      dbCreate(uh);   if( localDbPrepare(uh) < 0 )      return(0);   return(uh);}void userDbDisconnect(UserHandle *uh){   SQLRETURN rc;   if(!uh) return;   rc = SQLDisconnect(uh->hdbc);   SQLFreeConnect(uh->hdbc);   SQLFreeEnv(uh->henv);   free(uh);}int userDbInsertServer(UserHandle        *uh,                       ServerId         serverId,	               SubscriberSuffix suffix,	               ServerName       name){   SQLRETURN rc;   char buf[1000];   if(!uh) return(-1);   sprintf(buf, "insert into server values (%d,'%.*s','%s',0,0,0)",           serverId,           SUBSCRIBER_NUMBER_SUFFIX_LENGTH, suffix,           name);   rc = SQLExecDirect(uh->stmt, (unsigned char *)buf, SQL_NTS);   if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {      printf("Unable to execute insert server\n");      return(-1);   }   return( userDbCommit(uh) );}int userDbInsertSubscriber(UserHandle        *uh,	                   SubscriberNumber number,                           uint32           groupId,	                   SubscriberName   name){   SQLRETURN rc;   char buf[1000];   if(!uh) return(-1);   sprintf(buf, "insert into subscriber values ('%s','%s',%d,0,0,'','')",           number,           name,           groupId);   rc = SQLExecDirect(uh->stmt, (unsigned char*)buf, SQL_NTS);   if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {      printf("Unable to execute insert subscriber\n");      return(-1);   }   return( userDbCommit(uh) );}int userDbInsertGroup(UserHandle  *uh,		      GroupId    groupId, 		      GroupName  name,		      Permission allowRead,		      Permission allowInsert,		      Permission allowDelete){   SQLRETURN rc;   char buf[1000];   if(!uh) return(-1);   sprintf(buf, "insert into usergroup values (%d,'%s',%d,%d,%d)",           groupId,           name,                      allowRead,           allowInsert,           allowDelete);   rc = SQLExecDirect(uh->stmt, (unsigned char*)buf, SQL_NTS);   if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {      printf("Unable to execute insert group\n");      return(-1);   }   return( userDbCommit(uh) );}int userDbCommit(UserHandle *uh){   SQLRETURN rc;   if(!uh) return(-1);   rc = SQLTransact(uh->henv, uh->hdbc, SQL_COMMIT);   if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {handle_error(uh->hdbc, uh->henv, 0, rc, __FILE__, __LINE__);      printf("Unable to commit Transaction\n");      return(-1);   }   return(0);}int userDbRollback(UserHandle *uh){   SQLRETURN rc;   if(!uh) return(-1);   rc = SQLTransact(uh->henv, uh->hdbc, SQL_ROLLBACK);   if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {      printf("Unable to rollback Transaction\n");      return(-1);   }   return(0);}void userCheckpoint(UserHandle *uh){   SQLRETURN rc;   if(!uh) return;   rc = SQLExecDirect(uh->stmt, (SQLCHAR *)"call ttCheckpointFuzzy", SQL_NTS);   userDbCommit(uh);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?