userInterface.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:13k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /***************************************************************
  14. * I N C L U D E D   F I L E S                                  *
  15. ***************************************************************/
  16. #include <ndb_global.h>
  17. #include "userInterface.h"
  18. #include "userHandle.h"
  19. /***************************************************************
  20. * L O C A L   C O N S T A N T S                                *
  21. ***************************************************************/
  22. /***************************************************************
  23. * L O C A L   D A T A   S T R U C T U R E S                    *
  24. ***************************************************************/
  25. /***************************************************************
  26. * L O C A L   F U N C T I O N S                                *
  27. ***************************************************************/
  28. extern int localDbPrepare(UserHandle *uh);
  29. static int dbCreate(UserHandle *uh);
  30. /***************************************************************
  31. * L O C A L   D A T A                                          *
  32. ***************************************************************/
  33. static char *create_subscriber_table = 
  34. "CREATE TABLE subscriber(
  35. subscriberNumber CHAR(12) NOT NULL primary key,
  36. subscriberName   CHAR(32) NOT NULL,
  37. groupId          INT      NOT NULL,
  38. location         INT      NOT NULL,
  39. activeSessions   INT      NOT NULL,
  40. changedBy        CHAR(32) NOT NULL,
  41. changedTime      CHAR(32) NOT NULL)";
  42. static char *create_group_table = 
  43. "CREATE TABLE userGroup(
  44. groupId          INT      NOT NULL primary key,
  45. groupName        CHAR(32) NOT NULL,
  46. allowRead        INT      NOT NULL,
  47. allowInsert      INT      NOT NULL,
  48. allowDelete      INT      NOT NULL)";
  49. static char *create_server_table = "CREATE TABLE server(
  50. serverId         INT      NOT NULL,
  51. subscriberSuffix CHAR(2)  NOT NULL,
  52. serverName       CHAR(32) NOT NULL,
  53. noOfRead         INT      NOT NULL,
  54. noOfInsert       INT      NOT NULL,
  55. noOfDelete       INT      NOT NULL,
  56. PRIMARY KEY(serverId,subscriberSuffix))";
  57. static char *create_session_table = 
  58. "CREATE TABLE userSession(
  59. subscriberNumber CHAR(12) NOT NULL,
  60. serverId         INT      NOT NULL,
  61. sessionData      CHAR(2000) NOT NULL,
  62. PRIMARY KEY(subscriberNumber,serverId))";
  63. /***************************************************************
  64. * P U B L I C   D A T A                                        *
  65. ***************************************************************/
  66. /***************************************************************
  67. ****************************************************************
  68. * 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      *
  69. ****************************************************************
  70. ***************************************************************/
  71. /***************************************************************
  72. ****************************************************************
  73. * 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    *
  74. ****************************************************************
  75. ***************************************************************/
  76. /*-----------------------------------*/
  77. /* Time related Functions            */
  78. /*                                   */
  79. /* Returns a double value in seconds */
  80. /*-----------------------------------*/
  81. double userGetTime(void)
  82. {
  83.    static int initialized = 0;
  84.    static struct timeval initTime;
  85.    double timeValue;
  86.    if( !initialized ) {
  87.       initialized = 1;
  88.       gettimeofday(&initTime, 0);
  89.       timeValue = 0.0;
  90.    }
  91.    else {
  92.       struct timeval tv;
  93.       double s;
  94.       double us;
  95.       gettimeofday(&tv, 0);
  96.       s  = (double)tv.tv_sec  - (double)initTime.tv_sec;
  97.       us = (double)tv.tv_usec - (double)initTime.tv_usec;
  98.       timeValue = s + (us / 1000000.0);
  99.    }
  100.    return(timeValue);
  101. }
  102. void handle_error(SQLHDBC  hdbc,
  103.                   SQLHENV  henv, 
  104.                   SQLHSTMT hstmt, 
  105.                   SQLRETURN rc,
  106.                   char *filename,
  107.                   int lineno)
  108. {
  109. #define MSG_LNG 512
  110.    int isError = 0; 
  111.    SQLRETURN     ret = SQL_SUCCESS;
  112.    SQLCHAR       szSqlState[MSG_LNG];    /* SQL state string  */
  113.    SQLCHAR       szErrorMsg[MSG_LNG];    /* Error msg text buffer pointer */
  114.    SQLINTEGER    pfNativeError;          /* Native error code */
  115.    SQLSMALLINT   pcbErrorMsg;            /* Error msg text Available bytes */
  116.    if ( rc == SQL_SUCCESS || rc == SQL_NO_DATA_FOUND )
  117.       return;
  118.    else if ( rc == SQL_INVALID_HANDLE ) {
  119.       printf("ERROR in %s, line %d: invalid handlen",
  120.                filename, lineno);
  121.       isError = 1;
  122.    }
  123.    else if ( rc == SQL_SUCCESS_WITH_INFO ) {
  124.       printf("WARNING in %s, line %dn",
  125.                filename, lineno);
  126.       isError = 0;
  127.    }
  128.    else if ( rc == SQL_ERROR ) {
  129.       printf("ERROR in %s, line %dn",
  130.                filename, lineno);
  131.       isError = 1;
  132.    }
  133.    fflush(stdout);
  134.    while ( ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO ) {
  135.       ret = SQLError(henv, hdbc, hstmt, szSqlState, &pfNativeError, szErrorMsg,
  136.                      MSG_LNG, &pcbErrorMsg);
  137.       switch (ret) {
  138.          case SQL_SUCCESS:
  139.          case SQL_SUCCESS_WITH_INFO:
  140.             printf("%sn*** ODBC Error/Warning = %s, "
  141.                     "Additional Error/Warning = %dn",
  142.                     szErrorMsg, szSqlState, pfNativeError);
  143.             if(ret == SQL_SUCCESS_WITH_INFO)
  144.                printf("(Note: error message was truncated.n");
  145.             break;
  146.          case SQL_INVALID_HANDLE:
  147.            printf("Call to SQLError failed with return code of "
  148.                     "SQL_INVALID_HANDLE.n");
  149.            break;
  150.          case SQL_ERROR:
  151.             printf("Call to SQLError failed with return code of SQL_ERROR.n");
  152.             break;
  153.          case SQL_NO_DATA_FOUND:
  154.             break;
  155.          default:
  156.            printf("Call to SQLError failed with return code of %d.n", ret);
  157.       }
  158.    }
  159.    if ( isError )
  160.       exit(1);
  161. }
  162. static int dbCreate(UserHandle *uh)
  163. {
  164.    SQLRETURN rc;
  165.    SQLHSTMT  creatstmt;
  166.    if(!uh) return(-1);
  167.    rc = SQLAllocStmt(uh->hdbc, &creatstmt);
  168.    if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
  169.       printf("Unable to allocate create statementn");
  170.       return(-1);
  171.    }
  172.    rc = SQLExecDirect(creatstmt,(SQLCHAR *)create_subscriber_table, SQL_NTS);
  173.    if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
  174.       printf("Unable to create subscriber tablen");
  175.       return(-1);
  176.    }
  177.    rc = SQLExecDirect(creatstmt,(SQLCHAR *)create_group_table, SQL_NTS);
  178.    if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
  179.       printf("Unable to create group tablen");
  180.       return(-1);
  181.    }
  182.    rc = SQLExecDirect(creatstmt,(SQLCHAR *)create_server_table, SQL_NTS);
  183.    if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
  184.       printf("Unable to create server tablen");
  185.       return(-1);
  186.    }
  187.    rc = SQLExecDirect(creatstmt,(SQLCHAR *)create_session_table, SQL_NTS);
  188.    if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
  189.       printf("Unable to create session tablen");
  190.       return(-1);
  191.    }
  192.    rc = SQLTransact(uh->henv, uh->hdbc, SQL_COMMIT);
  193.    if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
  194.       printf("Unable to commit all create tablen");
  195.       return(-1);
  196.    }
  197.    rc = SQLFreeStmt(creatstmt, SQL_DROP);
  198.    if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
  199.       printf("Unable to free create statementn");
  200.       return(-1);
  201.    }
  202.    return(0);
  203. }
  204. UserHandle *userDbConnect(uint32 createDb, char *dbName)
  205. {
  206.    char      connStrIn[512]; /* ODBC Connection String */
  207.    char      connStrOut[2048];
  208.    SQLRETURN rc;
  209.    UserHandle *uh;
  210.    /*--------------------------*/
  211.    /* Build the Connect string */
  212.    /*--------------------------*/
  213.    sprintf(connStrIn,
  214.            "AutoCreate=%d;OverWrite=%d;DSN=%s",
  215.            createDb ? 1 : 0,
  216.            createDb ? 1 : 0,
  217.            dbName);
  218.    uh = calloc(1, sizeof(UserHandle));
  219.    if( !uh ) {
  220.       printf("Unable to allocate memory for Handlen");
  221.       return(0);
  222.    }
  223.    /*---------------------------------*/
  224.    /* Allocate the Environment Handle */
  225.    /*---------------------------------*/
  226.    rc = SQLAllocEnv(&uh->henv);
  227.    if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
  228.       printf("Unable to allocate Environment Handlen");
  229.       return(0);
  230.    }
  231.    /*--------------------------------*/
  232.    /* Allocate the DB Connect Handle */
  233.    /*--------------------------------*/
  234.    rc = SQLAllocConnect(uh->henv, &uh->hdbc);
  235.    if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
  236.       printf("Unable to allocate a connection handlen");
  237.       return(0);
  238.    }
  239.    /*-------------------------*/
  240.    /* Connect to the Database */
  241.    /*-------------------------*/
  242.    rc = SQLDriverConnect(uh->hdbc, NULL, 
  243.                         (SQLCHAR *)connStrIn, SQL_NTS,
  244.                         (SQLCHAR *)connStrOut, sizeof (connStrOut), 
  245.                          NULL, SQL_DRIVER_NOPROMPT);
  246.    if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
  247. handle_error(uh->hdbc, uh->henv, NULL, rc, __FILE__, __LINE__);
  248.       printf("Unable to connect to database servern");
  249.       return(0);
  250.    }
  251.    rc = SQLSetConnectOption(uh->hdbc, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF);
  252.    if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
  253.       printf("Unable to set connection optionn");
  254.       return(0);
  255.    }
  256.    rc = SQLAllocStmt(uh->hdbc, &uh->stmt);
  257.    if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
  258.       printf("Unable to allocate immediate statementn");
  259.       return(0);
  260.    }
  261.    if( createDb )
  262.       dbCreate(uh);
  263.    if( localDbPrepare(uh) < 0 )
  264.       return(0);
  265.    return(uh);
  266. }
  267. void userDbDisconnect(UserHandle *uh)
  268. {
  269.    SQLRETURN rc;
  270.    if(!uh) return;
  271.    rc = SQLDisconnect(uh->hdbc);
  272.    SQLFreeConnect(uh->hdbc);
  273.    SQLFreeEnv(uh->henv);
  274.    free(uh);
  275. }
  276. int userDbInsertServer(UserHandle        *uh,
  277.                        ServerId         serverId,
  278.                SubscriberSuffix suffix,
  279.                ServerName       name)
  280. {
  281.    SQLRETURN rc;
  282.    char buf[1000];
  283.    if(!uh) return(-1);
  284.    sprintf(buf, "insert into server values (%d,'%.*s','%s',0,0,0)",
  285.            serverId,
  286.            SUBSCRIBER_NUMBER_SUFFIX_LENGTH, suffix,
  287.            name);
  288.    rc = SQLExecDirect(uh->stmt, (unsigned char *)buf, SQL_NTS);
  289.    if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
  290.       printf("Unable to execute insert servern");
  291.       return(-1);
  292.    }
  293.    return( userDbCommit(uh) );
  294. }
  295. int userDbInsertSubscriber(UserHandle        *uh,
  296.                    SubscriberNumber number,
  297.                            uint32           groupId,
  298.                    SubscriberName   name)
  299. {
  300.    SQLRETURN rc;
  301.    char buf[1000];
  302.    if(!uh) return(-1);
  303.    sprintf(buf, "insert into subscriber values ('%s','%s',%d,0,0,'','')",
  304.            number,
  305.            name,
  306.            groupId);
  307.    rc = SQLExecDirect(uh->stmt, (unsigned char*)buf, SQL_NTS);
  308.    if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
  309.       printf("Unable to execute insert subscribern");
  310.       return(-1);
  311.    }
  312.    return( userDbCommit(uh) );
  313. }
  314. int userDbInsertGroup(UserHandle  *uh,
  315.       GroupId    groupId, 
  316.       GroupName  name,
  317.       Permission allowRead,
  318.       Permission allowInsert,
  319.       Permission allowDelete)
  320. {
  321.    SQLRETURN rc;
  322.    char buf[1000];
  323.    if(!uh) return(-1);
  324.    sprintf(buf, "insert into usergroup values (%d,'%s',%d,%d,%d)",
  325.            groupId,
  326.            name,           
  327.            allowRead,
  328.            allowInsert,
  329.            allowDelete);
  330.    rc = SQLExecDirect(uh->stmt, (unsigned char*)buf, SQL_NTS);
  331.    if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
  332.       printf("Unable to execute insert groupn");
  333.       return(-1);
  334.    }
  335.    return( userDbCommit(uh) );
  336. }
  337. int userDbCommit(UserHandle *uh)
  338. {
  339.    SQLRETURN rc;
  340.    if(!uh) return(-1);
  341.    rc = SQLTransact(uh->henv, uh->hdbc, SQL_COMMIT);
  342.    if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
  343. handle_error(uh->hdbc, uh->henv, 0, rc, __FILE__, __LINE__);
  344.       printf("Unable to commit Transactionn");
  345.       return(-1);
  346.    }
  347.    return(0);
  348. }
  349. int userDbRollback(UserHandle *uh)
  350. {
  351.    SQLRETURN rc;
  352.    if(!uh) return(-1);
  353.    rc = SQLTransact(uh->henv, uh->hdbc, SQL_ROLLBACK);
  354.    if( rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
  355.       printf("Unable to rollback Transactionn");
  356.       return(-1);
  357.    }
  358.    return(0);
  359. }
  360. void userCheckpoint(UserHandle *uh)
  361. {
  362.    SQLRETURN rc;
  363.    if(!uh) return;
  364.    rc = SQLExecDirect(uh->stmt, (SQLCHAR *)"call ttCheckpointFuzzy", SQL_NTS);
  365.    userDbCommit(uh);
  366. }