123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489 |
- #include <iostream>
- #include <mysql.h>
- #include <stdio.h>
- #include <mysql.h>
- #include <string>
- #include <time.h>
- #include <random>
- #include <thread>
- #include <chrono>
- #include <string.h>
- #include "CDBConnPool.h"
- #include "CDBHelper.h"
- void mysql_base_test()
- {
- MYSQL conn;
- int res = 0;
- mysql_init(&conn);
- if ( mysql_real_connect( &conn, "localhost", "root", "ok123", "yaxt", 0, NULL, CLIENT_FOUND_ROWS ) )
- {
- printf("connect success!\n");
- res = mysql_query( &conn, "insert into test01(id,name,type,BirthDate) values(3,'user',2,'2018-1-2 12:13:14')" );
- if ( res )
- {
- printf("error\n");
- }
- else
- {
- printf("OK\n");
- }
- mysql_close(&conn);
- }
- }
- void db_test_thread()
- {
- std::cout << "db_test_thread begin:[" << std::this_thread::get_id() << "]" << std::endl;
- //随机等待
- std::default_random_engine e;
- std::uniform_int_distribution<unsigned> u( 1, 9 );
- int r = u( e );
- std::this_thread::sleep_for( std::chrono::milliseconds( r * 100 ) );
- std::string Error;
- //从连接池中获得一个数据库连接
- YADB::CDBConnect *pConn = sDBConnPool.GetDBConnect( Error );
- if ( pConn )
- {
- //------------------------------------------------------
- //操作test01表,基础功能测试
- //------------------------------------------------------
- //插入
- char szInsert[1024] = { 0 };
- //线程ID的hash值实在是没法看,所以用很蠢的办法把线程ID赋给记录ID
- char szID[30] = { 0 };
- sprintf( szID, "%d", std::this_thread::get_id() );
- long long ID = atoll( szID );
- std::string Name = "Tom.J";
- int Type = 1;
- std::string BirthDate = "2017-12-1 09:13:45";
- my_ulonglong ullRes = 0;
- //插入记录
- sprintf( szInsert, "insert into test01(ID,Name,Type,BirthDate) values (%lld, \'%s\', %d,\'%s\')", ID, Name.c_str(), Type, BirthDate.c_str() );
- ullRes = pConn->ExecuteRealSql( szInsert, Error );
- if ( YADB::DB_ERR_EXCUTE_QUERY == ullRes )
- {
- printf( "插入记录失败:%s!\n", Error.c_str() );
- Error = pConn->GetLastError();
- }
- else
- {
- printf( "插入记录成功!\n" );
- }
- //查询
- YADB::CDBResultSet *pRes = pConn->ExecuteQuery( "select * from test01", Error );
- my_ulonglong ResCount = pRes->GetRecordCount( Error );
- printf( "Record count = %lld\n", ResCount );
- while ( pRes->GetNextRecod( Error ) )
- {
- long long ID = 0;
- pRes->GetField( "ID", ID, Error );
- std::string strName;
- pRes->GetField( "Name", strName, Error );
- char szName[100] = { 0 };
- pRes->GetField( "Name", szName, sizeof( szName ), Error );
- int Type = 0;
- pRes->GetField( "Type", Type, Error );
- std::string Birth;
- pRes->GetField( "BirthDate", Birth, Error );
- MYSQL_TIME dtBirth;
- pRes->GetField( "BirthDate", dtBirth, Error );
- printf( "ID=%lld Name=%s Type=%d BirthDate=%s\n", ID, strName.c_str(), Type, Birth.c_str() );
- }
- //修改
- memset( szInsert , 0, sizeof( szInsert ) );
- Name = "李明";
- BirthDate = "2018-1-1 01:01:01";
- sprintf( szInsert, "update test01 set Name='%s\',BirthDate ='%s\' where ID=%lld", Name.c_str(), BirthDate.c_str(), ID );
- ullRes = pConn->ExecuteRealSql( szInsert, Error );
- if ( YADB::DB_ERR_EXCUTE_QUERY == ullRes )
- {
- printf( "更新记录失败:%s!\n", Error.c_str() );
- }
- else
- {
- printf( "更新记录成功!\n" );
- }
- //删除
- memset( szInsert, 0, sizeof( szInsert ) );
- sprintf( szInsert, "delete from test01 where ID=%lld", ID );
- ullRes = pConn->ExecuteSql( szInsert, Error );
- if ( YADB::DB_ERR_EXCUTE_QUERY == ullRes )
- {
- printf( "删除记录失败:%s!\n", Error.c_str() );
- }
- else
- {
- printf( "删除记录成功!\n" );
- }
- //用预处理方式出入记录
- long long LID = 100000000 + ID;
- char name[20] = "Jarry";
- long nameLen = strlen( name );
- int type = 2;
- MYSQL_TIME ts;
- ts.year = 2018;
- ts.month = 1;
- ts.day = 13;
- ts.hour = 13;
- ts.minute = 15;
- ts.second = 16;
- ts.second_part = 0;
- ts.time_type = MYSQL_TIMESTAMP_DATE;
- MYSQL_BIND bindData[4];
- memset( bindData, 0, sizeof( bindData ) );
- bindData[0].buffer_type = MYSQL_TYPE_LONGLONG;
- bindData[0].buffer = ( long long * ) &LID;
- bindData[0].is_null = 0;
- bindData[1].buffer_type = MYSQL_TYPE_STRING;
- bindData[1].buffer = ( char * ) name;
- bindData[1].buffer_length = nameLen;
- bindData[1].is_null = 0;
- bindData[1].length = ( unsigned long* ) &nameLen;
- bindData[2].buffer_type = MYSQL_TYPE_LONG;
- bindData[2].buffer = &type;
- bindData[2].is_null = 0;
- bindData[3].buffer_type = MYSQL_TYPE_DATETIME;
- bindData[3].buffer = ( char * ) &ts;
- bindData[3].is_null = 0;
- bindData[3].length = 0;
- if ( !pConn->stmtExcute( bindData, 0, Error ) )
- {
- printf( "执行预处理失败:%s!\n", Error.c_str() );
- }
- else
- {
- printf( "执行预处理成功!\n" );
- //删除
- memset( szInsert, 0, sizeof( szInsert ) );
- sprintf( szInsert, "delete from test01 where ID=%lld", LID );
- ullRes = pConn->ExecuteSql( szInsert, Error );
- if ( YADB::DB_ERR_EXCUTE_QUERY == ullRes )
- {
- printf( "删除记录失败:%s!\n", Error.c_str() );
- }
- else
- {
- printf( "删除记录成功!\n" );
- }
- }
- //------------------------------------------------------
- //操作test02表,test02表的ID字段是自增的
- //------------------------------------------------------
- //插入记录
- sprintf( szInsert, "insert into test02(Name,Type,BirthDate) values (\'%s\', %d,\'%s\')", Name.c_str(), Type, BirthDate.c_str() );
- ullRes = pConn->ExecuteRealSql( szInsert, Error );
- if ( YADB::DB_ERR_EXCUTE_QUERY == ullRes )
- {
- printf( "插入记录失败:%s!\n", Error.c_str() );
- Error = pConn->GetLastError();
- }
- else
- {
- printf( "插入记录成功!\n" );
- }
- my_ulonglong InsertedID = pConn->GetLastInsertID( Error );
- printf( "新插入ID:%lld!\n", InsertedID );
- //删除
- memset( szInsert, 0, sizeof( szInsert ) );
- sprintf( szInsert, "delete from test02 where ID=%lld", InsertedID );
- ullRes = pConn->ExecuteSql( szInsert, Error );
- if ( YADB::DB_ERR_EXCUTE_QUERY == ullRes )
- {
- printf( "删除记录失败:%s!\n", Error.c_str() );
- }
- else
- {
- printf( "删除记录成功!\n" );
- }
- //------------------------------------------------------
- //操作test01表,事务测试
- //------------------------------------------------------
- pConn->AutoCommit( false, Error );//把自动提交设置成false
- Name = "GuaGua";
- LID = 900000000 + ID;
- sprintf( szInsert, "insert into test01(ID,Name,Type,BirthDate) values (%lld, \'%s\', %d,\'%s\')", LID, Name.c_str(), Type, BirthDate.c_str() );
- ullRes = pConn->ExecuteRealSql( szInsert, Error );
- if ( YADB::DB_ERR_EXCUTE_QUERY == ullRes )
- {
- printf( "插入记录失败:%s!\n", Error.c_str() );
- Error = pConn->GetLastError();
- }
- else
- {
- printf( "插入记录成功!\n" );
- }
- //pConn->Commit( Error );//提交
- pConn->RollBack( Error );//回滚
- pConn->AutoCommit( true, Error );//把自动提交设置成true
- //归还数据库连接
- sDBConnPool.GiveBack( pConn );
- //异步执行测试
- printf( "异步执行测试开始!\n" );
- char szSQL[1024] = { 0 };
- //memset( szSQL, 0, sizeof( szSQL ) );
- sprintf( szSQL, "insert into test01(ID,Name,Type,BirthDate) values (%lld, \'%s\', %d,\'%s\')", LID, "Mike", 3, "2000-1-1 12:13:14" );
- sDBConnPool.PushAsync( szSQL );
- memset( szSQL, 0, sizeof( szSQL ) );
- sprintf( szSQL, "delete from test01 where ID=%lld", LID );
- sDBConnPool.PushAsync( szSQL );
- printf( "异步执行测试结束!\n" );
- }
- //显示线程信息
- std::cout << "[" << std::this_thread::get_id() << "]" << " db_test_thread end!\n" ;
- }
- //在多线程环境下测试
- void thread_db_class_test()
- {
- printf( "----------------------------------------------------------------\n" );
- printf( " 多线程测试 \n" );
- printf( "----------------------------------------------------------------\n" );
- YADB::_DB_POOL_SETTING_ DBSetting;
- DBSetting.Host = "localhost";
- DBSetting.User = "root";
- DBSetting.PWD = "ok123";
- DBSetting.DBName = "yaxt";
- //DBSetting.CharSet = "GB2312";
- DBSetting.CharSet = "utf8";
- DBSetting.TimeOut = 5;
- DBSetting.PoolSize = 10;
- DBSetting.stmtSQL = "insert into test01(ID,Name,Type,BirthDate) values (?,?,?,?)";
- std::string Error;
- //创建连接池
- if ( !sDBConnPool.Create( DBSetting, Error ) )
- {
- printf( "线程池创建失败,Err=%s\n", Error.c_str() );
- return;
- }
- //多线程测试
- int ThreadCount = 1;//线程数
- for ( int i = 0; i < ThreadCount; i++ )
- {
- std::thread t( db_test_thread );
- t.detach();
- }
- sDBConnPool.Close();
- }
- void simple_db_class_test()
- {
- printf("----------------------------------------------------------------\n");
- printf(" 简单测试 \n");
- printf("----------------------------------------------------------------\n");
- YADB::_DB_POOL_SETTING_ DBSetting;
- DBSetting.Host = "localhost";
- DBSetting.User = "root";
- DBSetting.PWD = "ok123";
- DBSetting.DBName = "yaxt";
- DBSetting.CharSet = "utf8";
- DBSetting.TimeOut = 5;
- DBSetting.PoolSize = 10;
- DBSetting.stmtSQL = "insert into test01(ID,Name,Type,BirthDate) values (?,?,?,?)";
- std::string Error;
- //创建连接池
- if ( !sDBConnPool.Create( DBSetting, Error ) )
- {
- printf("线程池创建失败,Err=%s\n", Error.c_str());
- return;
- }
- YADB::CDBHelper DBHelper;
- YADB::CDBResultSet DBRes;
- sDBConnPool.Query( "select * from test01", DBRes, Error );
- int nCount = DBRes.GetRecordCount( Error );
- if (nCount > 0)
- {
- printf( "The record count=%d\n", nCount );
- while ( DBRes.GetNextRecod(Error) )
- {
- long long ID = 0;
- DBRes.GetField( "ID", ID, Error );
- char szName[100] = { 0 };
- DBRes.GetField( "Name", szName, sizeof( szName ), Error );
- std::string strName;
- DBRes.GetField( "Name", strName, Error );
- int Type = 0;
- DBRes.GetField( "Type", Type, Error );
- unsigned int uType = 0;
- DBRes.GetField( "Type", uType, Error );
- std::string Birth;
- DBRes.GetField( "BirthDate", Birth, Error );
- float fValue = 0.0;
- DBRes.GetField( "FloatField", fValue, Error );
- double dValue = 0.0;
- DBRes.GetField( "DoubleField", dValue, Error );
- bool bValue = false;
- DBRes.GetField( "BoolField", bValue, Error );
- MYSQL_TIME dtBirth;
- DBRes.GetField( "DateTimeField", dtBirth, Error );
- char szBirth[40] = { 0 };
- DBHelper.DateTime2String( dtBirth, szBirth, sizeof( szBirth ) );
- std::cout << "ID=" << ID << " ";
- std::cout << "Name=" << szName << " ";
- std::cout << "Name=" << strName.c_str() << " ";
- std::cout << "Type=" << Type << " ";
- std::cout << "Type=" << uType << " ";
- std::cout << "BirthDate=" << Birth << " ";
- std::cout << "FloatField=" << fValue << " ";
- std::cout << "DoubleField=" << dValue << " ";
- std::cout << "BoolField=" << bValue << " ";
- std::cout << "DateTimeField=" << szBirth << " ";
- std::cout << std::endl;
- }
- }
- std::string strUptSQL;
- strUptSQL = "update test01 set DoubleField=1.888888 where ID=1";
- if ( sDBConnPool.ExecuteSql( strUptSQL.c_str(), Error ) < 0 )
- {
- printf( "Err,Failed to ExecuteSql:%s,Err=%s\n", strUptSQL.c_str(), Error.c_str() );
- }
- }
- void stmt_test()
- {
- printf("----------------------------------------------------------------\n");
- printf(" 预处理测试 \n");
- printf("----------------------------------------------------------------\n");
- YADB::_DB_POOL_SETTING_ DBSetting;
- DBSetting.Host = "localhost";
- DBSetting.User = "root";
- DBSetting.PWD = "ok123";
- DBSetting.DBName = "yaxt";
- DBSetting.CharSet = "utf8";
- DBSetting.TimeOut = 5;
- DBSetting.PoolSize = 10;
- std::string Error;
- //创建连接池
- if ( !sDBConnPool.Create( DBSetting, Error ) )
- {
- printf( "线程池创建失败,Err=%s\n", Error.c_str() );
- return;
- }
- YADB::CDBConnect *pConn = sDBConnPool.GetDBConnect( Error );
- //delete old record
- pConn->ExecuteSql( "delete from test01 where ID >=10000", Error );
- //insert new record bystmt
- if ( !pConn->Preparestmt( "insert into test01(ID,Name,Type,BirthDate) values (?,?,?,?)", Error ) )
- {
- printf("Invoke Preparestmt失败,Err=%s\n", Error.c_str());
- return;
- }
- for ( int i = 10000; i <= 10010000; i++ )
- {
- long long LID = i;
- char name[20] = "Jarry";
- long nameLen = strlen(name);
- int type = 2;
- MYSQL_TIME ts;
- ts.year = 2018;
- ts.month = 1;
- ts.day = 13;
- ts.hour = 13;
- ts.minute = 15;
- ts.second = 16;
- ts.second_part = 0;
- ts.time_type = MYSQL_TIMESTAMP_DATE;
- MYSQL_BIND bindData[4];
- memset(bindData, 0, sizeof(bindData));
- bindData[0].buffer_type = MYSQL_TYPE_LONGLONG;
- bindData[0].buffer = (long long *) &LID;
- bindData[0].is_null = 0;
- bindData[1].buffer_type = MYSQL_TYPE_STRING;
- bindData[1].buffer = (char *) name;
- bindData[1].buffer_length = nameLen;
- bindData[1].is_null = 0;
- bindData[1].length = (unsigned long*) &nameLen;
- bindData[2].buffer_type = MYSQL_TYPE_LONG;
- bindData[2].buffer = &type;
- bindData[2].is_null = 0;
- bindData[3].buffer_type = MYSQL_TYPE_DATETIME;
- bindData[3].buffer = (char *) &ts;
- bindData[3].is_null = 0;
- bindData[3].length = 0;
- if ( !pConn->stmtExcute( bindData, 0, Error ) )
- {
- printf("执行预处理失败:%s!\n", Error.c_str());
- }
- }
- printf("预处理完成!\n");
- }
- int main()
- {
- //mysql_base_test();
- simple_db_class_test();
- //thread_db_class_test();
- //stmt_test();
- printf( "Press Enter key to continue...\n" );
- fgetc( stdin );
- printf( "All Done!\n" );
- return 0;
- }
|