⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sbench.c

📁 SQLite ODBC Driver SQLite3 的ODBC驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
			  "SET Abalance = Abalance + %d WHERE Aid = %d",			  delta, aid);    rc = sqlite3_exec(sqlite, sql, NULL, NULL, NULL);    if (rc != SQLITE_OK) {        stat_counts[1] += 1;        goto transfail;    }    sqlite3_free(sql);    sql = sqlite3_mprintf("SELECT Abalance "			  "FROM accounts WHERE Aid = %d", aid);    rc = sqlite3_get_table(sqlite, sql, &rows, &nrows, &ncols, NULL);    if (rc != SQLITE_OK) {        stat_counts[2] += 1;        goto transfail;    }    sqlite3_free(sql);    if (nrows == 1 && ncols == 1 && rows && rows[1]) {        aBalance = strtol(rows[1], NULL, 0);    }    if (rows) {        sqlite3_free_table(rows);    }    sql = sqlite3_mprintf("UPDATE tellers "			  "SET Tbalance = Tbalance + %d WHERE Tid = %d",			  delta, tid);    rc = sqlite3_exec(sqlite, sql, NULL, NULL, NULL);    if (rc != SQLITE_OK) {        stat_counts[3] += 1;        goto transfail;    }    sqlite3_free(sql);    sql = sqlite3_mprintf("UPDATE branches "			  "SET Bbalance = Bbalance + %d WHERE Bid = %d",			  delta, bid);    rc = sqlite3_exec(sqlite, sql, NULL, NULL, NULL);    if (rc != SQLITE_OK) {        stat_counts[4] += 1;        goto transfail;    }    sqlite3_free(sql);    sql = sqlite3_mprintf("INSERT INTO history"			  "(Tid, Bid, Aid, delta) VALUES"			  "(%d, %d, %d, %d)",			  tid, bid, aid, delta);    rc = sqlite3_exec(sqlite, sql,  NULL, NULL, NULL);    if (rc != SQLITE_OK) {        stat_counts[5] += 1;        goto transfail;    }    sqlite3_free(sql);    sql = 0;    if (transactions) {try_commit:        rc = sqlite3_exec(sqlite, "COMMIT TRANSACTION", NULL, NULL, NULL);	if (rc == SQLITE_BUSY && --retries > 0) {	    stat_counts[9] += 1;#ifdef _WIN32	    Sleep(10);#else	    usleep(10000);#endif	    goto try_commit;	}	if (rc != SQLITE_OK) {	    stat_counts[6] += 1;	    goto transfail;	}    }    return;transfail:    if (sql) {        sqlite3_free(sql);	sql = 0;    }    if (rc == SQLITE_BUSY && --retries > 0) {        if (intrans) {	    sqlite3_exec(sqlite, "ROLLBACK TRANSACTION", NULL, NULL, NULL);	    stat_counts[7] += 1;	}	stat_counts[8] += 1;#ifdef _WIN32	Sleep(10);#else	usleep(10000);#endif        goto again;    }    incrementFailedTransactionCount();    if (intrans) {	stat_counts[10] += 1;	sqlite3_exec(sqlite, "ROLLBACK TRANSACTION", NULL, NULL, NULL);    }}#ifdef _WIN32static unsigned __stdcall runClientThread(void *args)#elsestatic int runClientThread(void *args)#endif{    sqlite3 *sqlite;    int ntrans = n_txn_per_client;    if (sqlite3_open(dbname, &sqlite) != SQLITE_OK) {        return 0;    }    sqlite3_busy_timeout(sqlite, 100000);    while (ntrans-- > 0) {        int account = getRandomID(ACCOUNT);	int branch  = getRandomID(BRANCH);	int teller  = getRandomID(TELLER);	int delta   = getRandomInt(0,1000);	doOne(sqlite, branch, teller, account, delta);	incrementTransactionCount();    }    sqlite3_close(sqlite);    return 0;}int main(int argc, char **argv){    int init_db = 0, i;#ifdef _WIN32    HANDLE *pids;#else    pid_t *pids;#endif    for (i = 1; i < argc; i++) {        if (strcmp(argv[i], "-clients") == 0) {	    if (i + 1 < argc) {	        i++;		n_clients = strtol(argv[i], NULL, 0);	    }        } else if (strcmp(argv[i], "-dbname") == 0) {	    if (i + 1 < argc) {	        i++;		dbname = argv[i];	    }        } else if (strcmp(argv[i], "-tpc") == 0) {	    if (i + 1 < argc) {	        i++;		n_txn_per_client = strtol(argv[i], NULL, 0);	    }        } else if (strcmp(argv[i], "-init") == 0) {            init_db = 1;        } else if (strcmp(argv[i], "-tps") == 0) {	    if (i + 1 < argc) {	        i++;		tps = strtol(argv[i], NULL, 0);	    }        } else if (strcmp(argv[i], "-v") == 0) {	    verbose++;	} else if (strcmp(argv[i], "-excl") == 0) {	    useexcl++;	}    }    if (dbname == NULL) {        fprintf(stderr, "usage: %s -dbame DBFILE [-v] [-init] "		"[-tpc n] [-clients c] [-excl\n\n", argv[0]);        fprintf(stderr, "-v        verbose error messages\n");        fprintf(stderr, "-init     initialize the tables\n");        fprintf(stderr, "-tpc      transactions per client\n");        fprintf(stderr, "-clients  number of simultaneous clients\n");	fprintf(stderr, "-excl     use EXCLUSIVE transactions\n");	exit(1);    }    fprintf(stdout, "Scale factor value: %d\n", tps);    fprintf(stdout, "Number of clients: %d\n", n_clients);    fprintf(stdout, "Number of transactions per client: %d\n\n",	    n_txn_per_client);    fflush(stdout);    if (useexcl) {	combegtrans = "COMMIT TRANSACTION ; BEGIN EXCLUSIVE TRANSACTION";	begtrans = "BEGIN EXCLUSIVE TRANSACTION";    }    if (init_db) {        fprintf(stdout, "Initializing dataset...\n");	createDatabase();        fprintf(stdout, "done.\n\n");	fflush(stdout);    }#ifndef _WIN32    shmid = shmget(IPC_PRIVATE, 200 * sizeof (int), IPC_CREAT | 0666);    shm = shmat(shmid, NULL, 0);#endif    transaction_count = &shm[0];    failed_transactions = &shm[1];    stat_counts = &shm[2];    *transaction_count = 0;    *failed_transactions = 0;    memset(stat_counts, 0, 198 * sizeof (int));#ifdef _WIN32    pids = malloc(n_clients * sizeof (HANDLE));#else    pids = malloc(n_clients * sizeof (pid_t));#endif    if (pids == NULL) {        fprintf(stderr, "malloc failed\n");	exit(2);    }    fprintf(stdout, "Starting Benchmark Run\n");    transactions = 0;#ifdef _WIN32    start_time = GetTickCount();#else    gettimeofday(&start_time, NULL);#endif    if (n_clients < 2) {        runClientThread(NULL);    } else {#ifdef _WIN32        for (i = 0; i < n_clients; i++) {	    unsigned tid;	    pids[i] = (HANDLE) _beginthreadex(NULL, 0, runClientThread,					      NULL, 0, &tid);	}	for (i = 0; i < n_clients; i++) {	    WaitForSingleObject(pids[i], INFINITE);	    CloseHandle(pids[i]);	}#else        for (i = 0; i < n_clients; i++) {	    pid_t child = fork();	    int rc;	    switch (child) {	    case 0:	        rc = runClientThread(NULL);		exit(rc);	    default:	        pids[i] = child;	    }	}	for (i = 0; i < n_clients; i++) {	    int status;	    waitpid(pids[i], &status, 0);	}#endif    }    reportDone();    transactions = 1;#ifdef _WIN32    start_time = GetTickCount();#else    gettimeofday(&start_time, NULL);#endif    if (n_clients < 2) {        runClientThread(NULL);    } else {#ifdef _WIN32        for (i = 0; i < n_clients; i++) {	    unsigned tid;	    pids[i] = (HANDLE) _beginthreadex(NULL, 0,runClientThread,					      NULL, 0, &tid);	}	for (i = 0; i < n_clients; i++) {	    WaitForSingleObject(pids[i], INFINITE);	    CloseHandle(pids[i]);	}#else        for (i = 0; i < n_clients; i++) {	    pid_t child = fork();	    int rc;	    switch (child) {	    case 0:	        rc = runClientThread(NULL);		exit(rc);	    default:	        pids[i] = child;	    }	}	for (i = 0; i < n_clients; i++) {	    int status;	    waitpid(pids[i], &status, 0);	}#endif    }    reportDone();    fprintf(stdout, "--------------------\n");    fprintf(stdout, "Error counters, consult source for stat_counts[].\n");    for (i = 0; i < 16; i++) {	if (i == 0) {	    fprintf(stdout, "stat_counts[0..7]: ");	}        fprintf(stdout, " %d", stat_counts[i]);	if (i == 7) {	    fprintf(stdout, "\nstat_counts[8..15]:");	}    }    fprintf(stdout, "\n\n");    return 0;}

⌨️ 快捷键说明

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