/* Copyright (C) 2014 InfiniDB, Inc. Copyright (C) 2016 MariaDB Corporation 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; version 2 of the License. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include <stdio.h> #include <string> #include <stdexcept> #include <sys/timeb.h> using namespace std; #include <boost/scoped_ptr.hpp> using namespace boost; #include <cppunit/extensions/HelperMacros.h> #include "writeengine.h" #include "we_colop.h" using namespace WriteEngine; extern WriteEngine::BRMWrapper* brmWrapperPtr; class WriteEngineTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE( WriteEngineTest ); // Column related operation testing /* CPPUNIT_TEST( testCreateColumnFiles ); CPPUNIT_TEST( testWriteColumnFiles ); CPPUNIT_TEST( testReadColumnFiles ); CPPUNIT_TEST( testInsertRowInt ); CPPUNIT_TEST( testInsertRowLonglong ); CPPUNIT_TEST( testInsertRowDouble ); CPPUNIT_TEST( testInsertRowChar ); CPPUNIT_TEST( testInsertBulk ); // Table related operation testing CPPUNIT_TEST( testTableAllocateRowId ); // Wrapper interface testing CPPUNIT_TEST( testInterfaceCreateColumnFile ); CPPUNIT_TEST( testInterfaceInsertUpdateDeleteRow ); CPPUNIT_TEST( testInterfaceInsertRowMedIntDouble ); CPPUNIT_TEST( testInterfaceInsertRowChar ); CPPUNIT_TEST( testInterfaceInsertRowCharQAWidth4 ); CPPUNIT_TEST( testInterfaceInsertRowCharQAWidth3 ); CPPUNIT_TEST( testInterfaceInsertRowCharQAWidth8 ); CPPUNIT_TEST( testInterfaceInsertRowCharQAWidth1 ); CPPUNIT_TEST( testInterfaceInsertRowLongLong ); CPPUNIT_TEST( testInterfaceInsertRowByte ); CPPUNIT_TEST( testInterfaceInsertRowToken ); CPPUNIT_TEST( testInterfaceInsertRowSingleChar ); CPPUNIT_TEST( testInterfaceInsertRowDoubleChar ); CPPUNIT_TEST( testInterfaceCreateIndex ); CPPUNIT_TEST( testInterfaceDropIndex ); CPPUNIT_TEST( testInterfaceUpdateIndexChar ); CPPUNIT_TEST( testInterfaceUpdateMultiColIndex); CPPUNIT_TEST( testInterfaceDctnryToken ); CPPUNIT_TEST( testInterfaceDctnryTokenRollBack ); CPPUNIT_TEST( testInsertCommitRollback ); CPPUNIT_TEST( testInterfaceInsertRowHwm ); CPPUNIT_TEST( testInterfaceCombineIndexLoad ); // note: this test case must be the last one //CPPUNIT_TEST( testTmpBulkPerformance ); // note: this test case must be the last one */ //CPPUNIT_TEST(testBoostFloat); /* CPPUNIT_TEST(testCreateColumnFiles1); CPPUNIT_TEST(testCreateColumnFiles2); CPPUNIT_TEST(testCreateColumnFiles3); CPPUNIT_TEST(testCreateColumnFiles4); */ //CPPUNIT_TEST(testCreateFileMultipleIONBF); //CPPUNIT_TEST(testCreateFile64MBIONBF); //CPPUNIT_TEST(testCreateFileMultipleBF); //CPPUNIT_TEST(testCreateFilelargerBF); CPPUNIT_TEST(testSoloman); /* CPPUNIT_TEST(testCreateFileNoBRM); CPPUNIT_TEST(testCreateFileBRM); */ CPPUNIT_TEST_SUITE_END(); private: WriteEngineWrapper m_wrapper; Session m_session; public: void setUp() { m_wrapper.setDebugLevel( DEBUG_3 ); m_session.txnid = 10; BRMWrapper::setUseBrm( true ); } void tearDown() { } void SetColumnStruct( ColStruct& column, OID dataOid, int colWidth, CalpontSystemCatalog::ColDataType colDataType ) { column.dataOid = dataOid; column.colWidth = colWidth; column.colDataType = colDataType; column.tokenFlag = false; } void CreateColumnFile( FID fid, int width, CalpontSystemCatalog::ColDataType colDataType, ColType colType ) { int rc; ColumnOp colOp; Column curCol; colOp.deleteFile( fid ); CPPUNIT_ASSERT( colOp.exists( fid ) == false ); // create column files rc = colOp.createColumn( curCol, 2, width, colDataType, colType, fid ); CPPUNIT_ASSERT( rc == NO_ERROR ); } void testCreateColumnFiles() { ColumnOp colOp; Column curCol; int rc; colOp.initColumn( curCol ); // file opertaions colOp.deleteFile( 100 ); CPPUNIT_ASSERT( colOp.exists( 100 ) == false ); colOp.deleteFile( 101 ); CPPUNIT_ASSERT( colOp.exists( 101 ) == false ); colOp.deleteFile( 103 ); CPPUNIT_ASSERT( colOp.exists( 103 ) == false ); rc = colOp.createColumn( curCol, 2, 50, WriteEngine::CHAR, WriteEngine::WR_CHAR, 101 ); CPPUNIT_ASSERT( rc == NO_ERROR ); colOp.deleteFile( 101 ); rc = colOp.createColumn( curCol, 2, 3, WriteEngine::CHAR, WriteEngine::WR_CHAR, 101 ); CPPUNIT_ASSERT( rc == NO_ERROR ); colOp.deleteFile( 101 ); rc = colOp.createColumn( curCol, 2, 5, WriteEngine::CHAR, WriteEngine::WR_CHAR, 101 ); CPPUNIT_ASSERT( rc == NO_ERROR ); // create column files rc = colOp.createColumn( curCol, 2, 8, WriteEngine::CHAR, WriteEngine::WR_CHAR, 100 ); CPPUNIT_ASSERT( rc == NO_ERROR ); rc = colOp.createColumn( curCol, 2, 8, WriteEngine::CHAR, WriteEngine::WR_CHAR, 100 ); CPPUNIT_ASSERT( rc == ERR_FILE_EXIST ); rc = colOp.openColumnFile( curCol ); CPPUNIT_ASSERT( rc == NO_ERROR ); colOp.clearColumn( curCol ); rc = colOp.openColumnFile( curCol ); CPPUNIT_ASSERT( rc == ERR_INVALID_PARAM ); rc = colOp.createTable(); CPPUNIT_ASSERT( rc == NO_ERROR ); } void testWriteColumnFiles() { ColumnOp colOp; Column curCol; int rc; unsigned char buf[BYTE_PER_BLOCK]; colOp.initColumn( curCol ); CPPUNIT_ASSERT( curCol.colNo == 0 ); CPPUNIT_ASSERT( curCol.colWidth == 0 ); CPPUNIT_ASSERT( curCol.dataFile.pFile == NULL ); // CPPUNIT_ASSERT( curCol.bitmapFile.pFile == NULL ); CPPUNIT_ASSERT( curCol.dataFile.fid == 0 ); // CPPUNIT_ASSERT( curCol.bitmapFile.fid == 0 ); colOp.setColParam( curCol, 2, 4, INT, WriteEngine::WR_INT, 100 ); rc = colOp.openColumnFile( curCol ); CPPUNIT_ASSERT( rc == NO_ERROR ); int testVal = 60; memset( buf, 0, BYTE_PER_BLOCK ); memcpy( buf + 8, &testVal, 4 ); rc = colOp.writeDBFileFbo( curCol.dataFile.pFile, buf, 1, 1 ); // block 2 CPPUNIT_ASSERT( rc == NO_ERROR ); colOp.clearColumn( curCol ); CPPUNIT_ASSERT( curCol.colNo == 0 ); CPPUNIT_ASSERT( curCol.colWidth == 0 ); CPPUNIT_ASSERT( curCol.dataFile.pFile == NULL ); // CPPUNIT_ASSERT( curCol.bitmapFile.pFile == NULL ); CPPUNIT_ASSERT( curCol.dataFile.fid == 0 ); // CPPUNIT_ASSERT( curCol.bitmapFile.fid == 0 ); CPPUNIT_ASSERT( colOp.isValid( curCol ) == false ); } void testReadColumnFiles() { ColumnOp colOp; Column curCol, errCol; int rc; unsigned char buf[BYTE_PER_BLOCK]; CalpontSystemCatalog::ColDataType colDataType; // colOp.setUseBrm(false); CPPUNIT_ASSERT( colOp.getColDataType( "integer", colDataType ) == true ); CPPUNIT_ASSERT( colDataType == INT ); CPPUNIT_ASSERT( colOp.getColDataType( "Int1", colDataType ) == false ); // check error situation colOp.initColumn( errCol ); colOp.setColParam( errCol, 2, 8, CHAR, WriteEngine::WR_CHAR, 103 ); rc = colOp.openColumnFile( errCol ); CPPUNIT_ASSERT( rc == ERR_FILE_READ ); colOp.clearColumn( errCol ); colOp.initColumn( errCol ); colOp.setColParam( errCol, 2, 8, CHAR, WriteEngine::WR_CHAR, 103 ); rc = colOp.openColumnFile( errCol ); CPPUNIT_ASSERT( rc == ERR_FILE_READ ); colOp.clearColumn( errCol ); // check normal situation colOp.initColumn( curCol ); colOp.setColParam( curCol, 2, 8, CHAR, WriteEngine::WR_CHAR, 100 ); rc = colOp.openColumnFile( curCol ); CPPUNIT_ASSERT( rc == NO_ERROR ); memset( buf, 0, BYTE_PER_BLOCK ); rc = colOp.readDBFile( curCol.dataFile.pFile, buf, 1, true ); // block 2 CPPUNIT_ASSERT( rc == NO_ERROR ); int testVal = 0; memcpy( &testVal, buf + 8, 8 ); printf( "\nread the test value : %d", testVal ); CPPUNIT_ASSERT( testVal == 60 ); colOp.clearColumn( curCol ); } void testInsertRowInt() { ColumnOp colOp; Column curCol; int rc, valArray[5], oldValArray[5]; RID rowIdArray[5]; rowIdArray[0] = 1; rowIdArray[1] = 3; rowIdArray[2] = 4; rowIdArray[3] = 7; rowIdArray[4] = 8; valArray[0] = 8; valArray[1] = 5; valArray[2] = 3; valArray[3] = 0; valArray[4] = 16; CreateColumnFile( 100, 4, WriteEngine::INT, WriteEngine::WR_INT ); colOp.initColumn( curCol ); colOp.setColParam( curCol, 2, 4, INT, WriteEngine::WR_INT, 100 ); rc = colOp.openColumnFile( curCol ); CPPUNIT_ASSERT( rc == NO_ERROR ); rc = colOp.writeRow( curCol, 5, (RID*) rowIdArray, valArray, oldValArray ); CPPUNIT_ASSERT( rc == NO_ERROR ); for ( int i = 0; i < 5; i++ ) CPPUNIT_ASSERT( oldValArray[i] == (int)0x80000001 ); colOp.clearColumn( curCol ); } void testInsertRowLonglong() { ColumnOp colOp; Column curCol; int rc; RID rowIdArray[3]; int width = 8, totalRow = 3; FID fid = 100; long long valArray[3]; uint64_t oldValArray[3], verifyArray[3]; CalpontSystemCatalog::ColDataType colDataType = CalpontSystemCatalog::BIGINT; ColType colType = WriteEngine::WR_LONGLONG; uint64_t emptyVal = 0x8000000000000001LL; rowIdArray[0] = 1; rowIdArray[1] = 3; rowIdArray[2] = 4; verifyArray[0] = valArray[0] = 32111238; verifyArray[1] = valArray[1] = 1231235; verifyArray[2] = valArray[2] = 67731233; CreateColumnFile( fid, width, colDataType, colType ); colOp.initColumn( curCol ); colOp.setColParam( curCol, 2, width, colDataType, colType, fid ); rc = colOp.openColumnFile( curCol ); CPPUNIT_ASSERT( rc == NO_ERROR ); rc = colOp.writeRow( curCol, totalRow, (RID*) rowIdArray, valArray, oldValArray ); CPPUNIT_ASSERT( rc == NO_ERROR ); for ( int i = 0; i < totalRow; i++ ) CPPUNIT_ASSERT( oldValArray[i] == emptyVal ); valArray[0] = 1900003; valArray[1] = 2349000; valArray[2] = 78900123; rc = colOp.writeRow( curCol, totalRow, (RID*) rowIdArray, valArray, oldValArray ); CPPUNIT_ASSERT( rc == NO_ERROR ); for ( int i = 0; i < totalRow; i++ ) CPPUNIT_ASSERT( oldValArray[i] == verifyArray[i] ); colOp.clearColumn( curCol ); } void testInsertRowDouble() { ColumnOp colOp; Column curCol; int rc; RID rowIdArray[3]; int width = 8, totalRow = 3; FID fid = 100; double valArray[3]; int64_t oldValArray[3]; CalpontSystemCatalog::ColDataType colDataType = CalpontSystemCatalog::DOUBLE; ColType colType = WriteEngine::WR_DOUBLE; int64_t emptyVal = 0xFFFAAAAAAAAAAAABLL; rowIdArray[0] = 1; rowIdArray[1] = 3; rowIdArray[2] = 4; valArray[0] = 8; valArray[1] = 5; valArray[2] = 3; CreateColumnFile( fid, width, colDataType, colType ); colOp.initColumn( curCol ); colOp.setColParam( curCol, 2, width, colDataType, colType, fid ); rc = colOp.openColumnFile( curCol ); CPPUNIT_ASSERT( rc == NO_ERROR ); rc = colOp.writeRow( curCol, totalRow, (RID*) rowIdArray, valArray, oldValArray ); CPPUNIT_ASSERT( rc == NO_ERROR ); for ( int i = 0; i < totalRow; i++ ) CPPUNIT_ASSERT( oldValArray[i] == emptyVal ); colOp.clearColumn( curCol ); } void testInsertRowChar() { ColumnOp colOp; Column curCol; int rc; RID rowIdArray[3]; int width = 8, totalRow = 3; FID fid = 100; char valArray[24], buf[8]; char testValue[3][8] = { "abc", "eDFFF", "GHK" }; uint64_t oldValArray[3]; CalpontSystemCatalog::ColDataType colDataType = CalpontSystemCatalog::CHAR; ColType colType = WriteEngine::WR_CHAR; uint64_t emptyVal = 0xFFFFFFFFFFFFFFFFLL; rowIdArray[0] = 1; rowIdArray[1] = 3; rowIdArray[2] = 4; memset( valArray, 0, 24 ); colOp.writeBufValue( (unsigned char*)buf, testValue[0], 8, true ); memcpy( valArray, buf, 8 ); colOp.writeBufValue( (unsigned char*)buf, testValue[1], 8, true ); memcpy( valArray + 8, buf, 8 ); colOp.writeBufValue( (unsigned char*)buf, testValue[2], 8, true ); memcpy( valArray + 16, buf, 8 ); CreateColumnFile( fid, width, colDataType, colType ); colOp.initColumn( curCol ); colOp.setColParam( curCol, 2, width, colDataType, colType, fid ); rc = colOp.openColumnFile( curCol ); CPPUNIT_ASSERT( rc == NO_ERROR ); rc = colOp.writeRow( curCol, totalRow, (RID*) rowIdArray, valArray, oldValArray ); CPPUNIT_ASSERT( rc == NO_ERROR ); for ( int i = 0; i < totalRow; i++ ) CPPUNIT_ASSERT( oldValArray[i] == emptyVal ); colOp.clearColumn( curCol ); } void testInsertBulk() { FILE* pSourceFile = NULL; ColumnOp colOp; Column curCol; int rc, width = 8; int hwm; FID fid = 999; CalpontSystemCatalog::ColDataType colDataType = CalpontSystemCatalog::CHAR; ColType colType = WriteEngine::WR_CHAR; colOp.deleteFile( 999 ); colOp.deleteFile( 998 ); CPPUNIT_ASSERT( colOp.exists( 999 ) == false ); CPPUNIT_ASSERT( colOp.exists( 998 ) == false ); int allocSize = 0; CPPUNIT_ASSERT( colOp.createFile( 998, 20, allocSize, 0xEEEE, 2 ) == NO_ERROR ); CreateColumnFile( fid, width, colDataType, colType ); colOp.initColumn( curCol ); colOp.setColParam( curCol, 2, width, colDataType, colType, fid ); rc = colOp.openColumnFile( curCol ); CPPUNIT_ASSERT( rc == NO_ERROR ); pSourceFile = colOp.openFile( 998 ); CPPUNIT_ASSERT( pSourceFile != NULL ); hwm = colOp.getFileSize( curCol.dataFile.pFile ) / BYTE_PER_BLOCK - 5 ; rc = colOp.insertBulk( curCol, pSourceFile, hwm, 20 ); CPPUNIT_ASSERT( rc == NO_ERROR ); colOp.clearColumn( curCol ); colOp.closeFile( pSourceFile ); } void testTableAllocateRowId() { ColumnOp colOp; Column curCol; RID rowIdArray[3]; int rc; int width = 4, hwm = 0; FID fid = 100; CalpontSystemCatalog::ColDataType colDataType = CalpontSystemCatalog::INT; ColType colType = WriteEngine::WR_INT; CreateColumnFile( fid, width, colDataType, colType ); colOp.initColumn( curCol ); colOp.setColParam( curCol, 2, width, colDataType, colType, fid ); rc = colOp.openColumnFile( curCol ); CPPUNIT_ASSERT( rc == NO_ERROR ); colOp.allocRowId( curCol, 3, rowIdArray, hwm ); CPPUNIT_ASSERT( rowIdArray[0] == 0 ); CPPUNIT_ASSERT( rowIdArray[1] == 1 ); CPPUNIT_ASSERT( rowIdArray[2] == 2 ); } void testInterfaceCreateColumnFile() { ColumnOp colOp; FID fid = 100; if ( colOp.exists( fid ) ) { CPPUNIT_ASSERT( m_wrapper.dropColumn( m_session.txnid, fid ) == NO_ERROR ); CPPUNIT_ASSERT( m_wrapper.dropColumn( m_session.txnid, fid ) == ERR_FILE_NOT_EXIST ); } CPPUNIT_ASSERT( m_wrapper.createColumn( m_session.txnid, fid, WriteEngine::DOUBLE, 8 ) == NO_ERROR ); CPPUNIT_ASSERT( colOp.exists( 100 ) == true ); } void testInterfaceInsertUpdateDeleteRow() { ColStruct curColStruct, testColStruct; ColTuple curTuple, testTuple; ColTupleList curTupleList, testTupleList; ColStructList colStructList; ColValueList colValueList, colOldValList; RIDList ridList; int rc, total, valArray[3]; float dVal; // ColumnOp colOp; // colOp = m_wrapper.getColumnOp(); CreateColumnFile( 100, 4, WriteEngine::INT, WriteEngine::WR_INT ); CreateColumnFile( 200, 4, WriteEngine::FLOAT, WriteEngine::WR_FLOAT ); // test column struct list SetColumnStruct( curColStruct, 100, 4, WriteEngine::INT ); colStructList.push_back( curColStruct ); SetColumnStruct( curColStruct, 200, 4, WriteEngine::FLOAT ); colStructList.push_back( curColStruct ); testColStruct = colStructList[0]; CPPUNIT_ASSERT( testColStruct.dataOid == 100 ); CPPUNIT_ASSERT( testColStruct.colWidth == 4 ); CPPUNIT_ASSERT( testColStruct.colDataType == WriteEngine::INT ); testColStruct = colStructList[1]; CPPUNIT_ASSERT( testColStruct.dataOid == 200 ); CPPUNIT_ASSERT( testColStruct.colWidth == 4 ); CPPUNIT_ASSERT( testColStruct.colDataType == WriteEngine::FLOAT ); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == ERR_STRUCT_VALUE_NOT_MATCH ); // test column values // add values for the first column curTuple.data = 3; curTupleList.push_back( curTuple ); curTuple.data = 0; curTupleList.push_back( curTuple ); curTuple.data = 100; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); m_wrapper.convertValArray( 3, WriteEngine::WR_INT, curTupleList, valArray ); CPPUNIT_ASSERT( valArray[0] == 3 ); CPPUNIT_ASSERT( valArray[1] == 0 ); CPPUNIT_ASSERT( valArray[2] == 100 ); curTupleList.clear(); // add values for the second column curTuple.data = 0.0f; curTupleList.push_back( curTuple ); curTuple.data = 1234.78f; curTupleList.push_back( curTuple ); curTuple.data = 999.98f; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); float valArray1[3]; m_wrapper.convertValArray( 3, WriteEngine::WR_FLOAT, curTupleList, valArray1 ); CPPUNIT_ASSERT( valArray1[0] == 0.0f ); CPPUNIT_ASSERT( valArray1[1] == 1234.78f); CPPUNIT_ASSERT( valArray1[2] == 999.98f ); // retrieve the values back // first column testTupleList = static_cast<ColTupleList>(colValueList[0]); total = testTupleList.size(); testTuple = testTupleList[0]; CPPUNIT_ASSERT( boost::any_cast<int>( testTuple.data ) == 3 ); testTuple = testTupleList[1]; CPPUNIT_ASSERT( boost::any_cast<int>( testTuple.data ) == 0 ); testTuple = testTupleList[2]; CPPUNIT_ASSERT( boost::any_cast<int>( testTuple.data ) == 100 ); // second column testTupleList = static_cast<ColTupleList>(colValueList[1]); total = testTupleList.size(); testTuple = testTupleList[0]; dVal = boost::any_cast<float>( testTuple.data ); CPPUNIT_ASSERT( dVal == 0.0f ); testTuple = testTupleList[1]; CPPUNIT_ASSERT( boost::any_cast<float>( testTuple.data ) == 1234.78f ); testTuple = testTupleList[2]; CPPUNIT_ASSERT( boost::any_cast<float>( testTuple.data ) == 999.98f ); // m_wrapper.printInputValue( colStructList, colValueList, ridList ); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 0 ); CPPUNIT_ASSERT( ridList[1] == 1 ); CPPUNIT_ASSERT( ridList[2] == 2 ); // try to insert more rows and row id should increase rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 3 ); CPPUNIT_ASSERT( ridList[1] == 4 ); CPPUNIT_ASSERT( ridList[2] == 5 ); // try to update rows colValueList.clear(); curTupleList.clear(); curTuple.data = 9; curTupleList.push_back( curTuple ); curTuple.data = 15; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); // add values for the second column curTupleList.clear(); curTuple.data = 1.99f; curTupleList.push_back( curTuple ); curTuple.data = 3000.15f; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); ridList.clear(); ridList.push_back( (RID) 2 ); ridList.push_back( (RID) 3 ); rc = m_wrapper.updateColumnRec( m_session.txnid, colStructList, colValueList, colOldValList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( colOldValList.size() == 2 ); m_wrapper.printInputValue( colStructList, colOldValList, ridList ); curTupleList = colOldValList[0]; curTuple = curTupleList[0]; CPPUNIT_ASSERT( boost::any_cast<int>( curTuple.data ) == 100 ); curTuple = curTupleList[1]; CPPUNIT_ASSERT( boost::any_cast<int>( curTuple.data ) == 3 ); curTupleList = colOldValList[1]; curTuple = curTupleList[0]; CPPUNIT_ASSERT( boost::any_cast<float>( curTuple.data ) == 999.98f ); curTuple = curTupleList[1]; CPPUNIT_ASSERT( boost::any_cast<float>( curTuple.data ) == 0.0f ); ridList[0] = 1; ridList[1] = 2; rc = m_wrapper.deleteRow( m_session.txnid, colStructList, colOldValList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( colOldValList.size() == 2 ); m_wrapper.printInputValue( colStructList, colOldValList, ridList ); curTupleList = colOldValList[0]; curTuple = curTupleList[0]; CPPUNIT_ASSERT( boost::any_cast<int>( curTuple.data ) == 0 ); curTuple = curTupleList[1]; CPPUNIT_ASSERT( boost::any_cast<int>( curTuple.data ) == 9 ); curTupleList = colOldValList[1]; curTuple = curTupleList[0]; CPPUNIT_ASSERT( boost::any_cast<float>( curTuple.data ) == 1234.78f ); curTuple = curTupleList[1]; CPPUNIT_ASSERT( boost::any_cast<float>( curTuple.data ) == 1.99f ); } void testInterfaceInsertRowMedIntDouble() { ColStruct curColStruct, testColStruct; ColTuple curTuple, testTuple; ColTupleList curTupleList, testTupleList; ColStructList colStructList; ColValueList colValueList, colOldValList; RIDList ridList; int total, rc; double dVal; CreateColumnFile( 100, 4, WriteEngine::MEDINT, WriteEngine::WR_INT ); CreateColumnFile( 200, 8, WriteEngine::DOUBLE, WriteEngine::WR_DOUBLE ); // test column struct list SetColumnStruct( curColStruct, 100, 4, WriteEngine::MEDINT ); colStructList.push_back( curColStruct ); SetColumnStruct( curColStruct, 200, 8, WriteEngine::DOUBLE ); colStructList.push_back( curColStruct ); testColStruct = colStructList[0]; CPPUNIT_ASSERT( testColStruct.dataOid == 100 ); CPPUNIT_ASSERT( testColStruct.colWidth == 4 ); CPPUNIT_ASSERT( testColStruct.colDataType == WriteEngine::MEDINT ); testColStruct = colStructList[1]; CPPUNIT_ASSERT( testColStruct.dataOid == 200 ); CPPUNIT_ASSERT( testColStruct.colWidth == 8 ); CPPUNIT_ASSERT( testColStruct.colDataType == WriteEngine::DOUBLE ); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == ERR_STRUCT_VALUE_NOT_MATCH ); // test column values // add values for the first column curTuple.data = 102; curTupleList.push_back( curTuple ); curTuple.data = 0; curTupleList.push_back( curTuple ); curTuple.data = 200; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); // add values for the second column curTuple.data = 0.0; curTupleList.push_back( curTuple ); curTuple.data = 1234.78; curTupleList.push_back( curTuple ); curTuple.data = 999.98; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); // add one rowId ridList.push_back( (RID) 5 ); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == ERR_ROWID_VALUE_NOT_MATCH ); ridList.push_back( (RID) 9 ); ridList.push_back( (RID) 10 ); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); // retrieve the values back // first column testTupleList = static_cast<ColTupleList>(colValueList[0]); total = testTupleList.size(); testTuple = testTupleList[0]; CPPUNIT_ASSERT( boost::any_cast<int>( testTuple.data ) == 102 ); testTuple = testTupleList[1]; CPPUNIT_ASSERT( boost::any_cast<int>( testTuple.data ) == 0 ); testTuple = testTupleList[2]; CPPUNIT_ASSERT( boost::any_cast<int>( testTuple.data ) == 200 ); // second column testTupleList = static_cast<ColTupleList>(colValueList[1]); total = testTupleList.size(); testTuple = testTupleList[0]; dVal = boost::any_cast<double>( testTuple.data ); CPPUNIT_ASSERT( dVal == 0.0 ); testTuple = testTupleList[1]; CPPUNIT_ASSERT( boost::any_cast<double>( testTuple.data ) == 1234.78 ); testTuple = testTupleList[2]; CPPUNIT_ASSERT( boost::any_cast<double>( testTuple.data ) == 999.98 ); // m_wrapper.printInputValue( (OID)103, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 0 ); CPPUNIT_ASSERT( ridList[1] == 1 ); CPPUNIT_ASSERT( ridList[2] == 2 ); // try to insert more rows and row id should increase rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 3 ); CPPUNIT_ASSERT( ridList[1] == 4 ); CPPUNIT_ASSERT( ridList[2] == 5 ); } void testInterfaceInsertRowChar() { ColStruct curColStruct, testColStruct; ColTuple curTuple, testTuple; ColTupleList curTupleList, testTupleList; ColStructList colStructList; ColValueList colValueList, colOldValList; RIDList ridList; std::string curStr, testStr; int total, rc, width = 5; rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc != NO_ERROR ); rc = m_wrapper.updateColumnRec( m_session.txnid, colStructList, colValueList, colOldValList, ridList ); CPPUNIT_ASSERT( rc != NO_ERROR ); // test column struct list CreateColumnFile( 100, width, WriteEngine::CHAR, WriteEngine::WR_CHAR ); SetColumnStruct( curColStruct, 100, width, WriteEngine::CHAR ); colStructList.push_back( curColStruct ); testColStruct = colStructList[0]; CPPUNIT_ASSERT( testColStruct.dataOid == 100 ); CPPUNIT_ASSERT( testColStruct.colWidth == width ); CPPUNIT_ASSERT( testColStruct.colDataType == WriteEngine::CHAR ); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == ERR_STRUCT_VALUE_NOT_MATCH ); // test column values // add values for the first column curStr = "aaaaa"; curTuple.data = curStr; curTupleList.push_back( curTuple ); curStr = "bbbbb"; curTuple.data = curStr; curTupleList.push_back( curTuple ); curStr = "ccccc"; curTuple.data = curStr; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); // add one rowId ridList.push_back( (RID) 5 ); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == ERR_ROWID_VALUE_NOT_MATCH ); ridList.push_back( (RID) 9 ); ridList.push_back( (RID) 10 ); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); // retrieve the values back // first column testTupleList = static_cast<ColTupleList>(colValueList[0]); total = testTupleList.size(); testTuple = testTupleList[0]; CPPUNIT_ASSERT( boost::any_cast<std::string>( testTuple.data ) == "aaaaa" ); testTuple = testTupleList[1]; CPPUNIT_ASSERT( boost::any_cast<std::string>( testTuple.data ) == "bbbbb" ); testTuple = testTupleList[2]; CPPUNIT_ASSERT( boost::any_cast<std::string>( testTuple.data ) == "ccccc" ); // m_wrapper.printInputValue( (OID)103, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 0 ); CPPUNIT_ASSERT( ridList[1] == 1 ); CPPUNIT_ASSERT( ridList[2] == 2 ); // try to insert more rows and row id should increase rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 3 ); CPPUNIT_ASSERT( ridList[1] == 4 ); CPPUNIT_ASSERT( ridList[2] == 5 ); } void testInterfaceInsertRowCharQAWidth4() { ColStruct curColStruct, testColStruct; ColTuple curTuple, testTuple; ColTupleList curTupleList, testTupleList; ColStructList colStructList; ColValueList colValueList, colOldValList; RIDList ridList; std::string curStr, testStr; int rc, width = 4; // test column struct list CreateColumnFile( 100, width, WriteEngine::CHAR, WriteEngine::WR_CHAR ); SetColumnStruct( curColStruct, 100, width, WriteEngine::CHAR ); colStructList.push_back( curColStruct ); testColStruct = colStructList[0]; CPPUNIT_ASSERT( testColStruct.dataOid == 100 ); CPPUNIT_ASSERT( testColStruct.colWidth == width ); CPPUNIT_ASSERT( testColStruct.colDataType == WriteEngine::CHAR ); // test column values // add values for the first column curStr = "aaaa"; curTuple.data = curStr; curTupleList.push_back( curTuple ); curStr = "aaa"; curTuple.data = curStr; curTupleList.push_back( curTuple ); curStr = "aa"; curTuple.data = curStr; curTupleList.push_back( curTuple ); curStr = "a"; curTuple.data = curStr; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); // retrieve the values back // first column // m_wrapper.printInputValue( (OID)103, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 0 ); CPPUNIT_ASSERT( ridList[1] == 1 ); CPPUNIT_ASSERT( ridList[2] == 2 ); CPPUNIT_ASSERT( ridList[3] == 3 ); // separate inserts colValueList.clear(); curStr = "bbbb"; curTuple.data = curStr; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 4 ); colValueList.clear(); curStr = "bbb"; curTuple.data = curStr; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 5 ); colValueList.clear(); curStr = "bb"; curTuple.data = curStr; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 6 ); colValueList.clear(); curStr = "b"; curTuple.data = curStr; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 7 ); } void testInterfaceInsertRowCharQAWidth3() { ColStruct curColStruct, testColStruct; ColTuple curTuple, testTuple; ColTupleList curTupleList, testTupleList; ColStructList colStructList; ColValueList colValueList, colOldValList; RIDList ridList; std::string curStr, testStr; int rc, width = 3; // test column struct list CreateColumnFile( 100, width, WriteEngine::CHAR, WriteEngine::WR_CHAR ); SetColumnStruct( curColStruct, 100, width, WriteEngine::CHAR ); colStructList.push_back( curColStruct ); testColStruct = colStructList[0]; CPPUNIT_ASSERT( testColStruct.dataOid == 100 ); CPPUNIT_ASSERT( testColStruct.colWidth == width ); CPPUNIT_ASSERT( testColStruct.colDataType == WriteEngine::CHAR ); // test column values // add values for the first column curStr = "aaa"; curTuple.data = curStr; curTupleList.push_back( curTuple ); curStr = "aa"; curTuple.data = curStr; curTupleList.push_back( curTuple ); curStr = "a"; curTuple.data = curStr; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); // retrieve the values back // first column // m_wrapper.printInputValue( (OID)103, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 0 ); CPPUNIT_ASSERT( ridList[1] == 1 ); CPPUNIT_ASSERT( ridList[2] == 2 ); // separate inserts colValueList.clear(); curStr = "bbb"; curTuple.data = curStr; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 3 ); colValueList.clear(); curStr = "bb"; curTuple.data = curStr; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 4 ); colValueList.clear(); curStr = "b"; curTuple.data = curStr; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 5 ); } void testInterfaceInsertRowCharQAWidth8() { ColStruct curColStruct, testColStruct; ColTuple curTuple, testTuple; ColTupleList curTupleList, testTupleList; ColStructList colStructList; ColValueList colValueList, colOldValList; RIDList ridList; std::string curStr, testStr; int rc, width = 8; // test column struct list CreateColumnFile( 100, width, WriteEngine::CHAR, WriteEngine::WR_CHAR ); SetColumnStruct( curColStruct, 100, width, WriteEngine::CHAR ); colStructList.push_back( curColStruct ); testColStruct = colStructList[0]; CPPUNIT_ASSERT( testColStruct.dataOid == 100 ); CPPUNIT_ASSERT( testColStruct.colWidth == width ); CPPUNIT_ASSERT( testColStruct.colDataType == WriteEngine::CHAR ); // test column values // add values for the first column curStr = "12345678"; curTuple.data = curStr; curTupleList.push_back( curTuple ); curStr = "123456"; curTuple.data = curStr; curTupleList.push_back( curTuple ); curStr = "1234"; curTuple.data = curStr; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); // retrieve the values back // first column // m_wrapper.printInputValue( (OID)103, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 0 ); CPPUNIT_ASSERT( ridList[1] == 1 ); CPPUNIT_ASSERT( ridList[2] == 2 ); // separate inserts colValueList.clear(); curStr = "bbbb1234"; curTuple.data = curStr; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 3 ); colValueList.clear(); curStr = "bb"; curTuple.data = curStr; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 4 ); colValueList.clear(); curStr = "b"; curTuple.data = curStr; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 5 ); } void testInterfaceInsertRowCharQAWidth1() { ColStruct curColStruct, testColStruct; ColTuple curTuple, testTuple; ColTupleList curTupleList, testTupleList; ColStructList colStructList; ColValueList colValueList, colOldValList; RIDList ridList; std::string curStr, testStr; int rc, width = 1; // test column struct list CreateColumnFile( 100, width, WriteEngine::CHAR, WriteEngine::WR_CHAR ); SetColumnStruct( curColStruct, 100, width, WriteEngine::CHAR ); colStructList.push_back( curColStruct ); testColStruct = colStructList[0]; CPPUNIT_ASSERT( testColStruct.dataOid == 100 ); CPPUNIT_ASSERT( testColStruct.colWidth == width ); CPPUNIT_ASSERT( testColStruct.colDataType == WriteEngine::CHAR ); // test column values // add values for the first column curStr = "a"; curTuple.data = curStr; curTupleList.push_back( curTuple ); curStr = "b"; curTuple.data = curStr; curTupleList.push_back( curTuple ); curStr = "c"; curTuple.data = curStr; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); // retrieve the values back // first column // m_wrapper.printInputValue( (OID)103, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 0 ); CPPUNIT_ASSERT( ridList[1] == 1 ); CPPUNIT_ASSERT( ridList[2] == 2 ); // separate inserts colValueList.clear(); curStr = "1"; curTuple.data = curStr; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 3 ); colValueList.clear(); curStr = "2"; curTuple.data = curStr; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 4 ); colValueList.clear(); curStr = "3"; curTuple.data = curStr; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 5 ); } void testInterfaceInsertRowSingleChar() { ColStruct curColStruct, testColStruct; ColTuple curTuple, testTuple; ColTupleList curTupleList, testTupleList; ColStructList colStructList; ColValueList colValueList, colOldValList; RIDList ridList; string curString; int total, rc; ColumnOp colOp; // colOp = m_wrapper.getColumnOp(); colOp.deleteFile( 100 ); // test column struct list CreateColumnFile( 100, 1, WriteEngine::CHAR, WriteEngine::WR_CHAR ); SetColumnStruct( curColStruct, 100, 1, WriteEngine::CHAR ); colStructList.push_back( curColStruct ); testColStruct = colStructList[0]; CPPUNIT_ASSERT( testColStruct.dataOid == 100 ); CPPUNIT_ASSERT( testColStruct.colWidth == 1 ); CPPUNIT_ASSERT( testColStruct.colDataType == WriteEngine::CHAR ); // test column values // add values for the first column curString = "\376"; curTuple.data = curString; curTupleList.push_back( curTuple ); curString = "a"; curTuple.data = curString; curTupleList.push_back( curTuple ); curString = "c"; curTuple.data = curString; curTupleList.push_back( curTuple ); curString = "G"; curTuple.data = curString; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); // retrieve the values back // first column testTupleList = static_cast<ColTupleList>(colValueList[0]); total = testTupleList.size(); testTuple = testTupleList[1]; CPPUNIT_ASSERT( boost::any_cast<std::string>( testTuple.data ) == "a" ); testTuple = testTupleList[2]; CPPUNIT_ASSERT( boost::any_cast<std::string>( testTuple.data ) == "c" ); testTuple = testTupleList[3]; CPPUNIT_ASSERT( boost::any_cast<std::string>( testTuple.data ) == "G" ); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); printf( "\nrc=%d", rc ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 0 ); CPPUNIT_ASSERT( ridList[1] == 1 ); CPPUNIT_ASSERT( ridList[2] == 2 ); CPPUNIT_ASSERT( ridList[3] == 3 ); // try to insert more rows and row id should increase rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 4 ); CPPUNIT_ASSERT( ridList[1] == 5 ); CPPUNIT_ASSERT( ridList[2] == 6 ); CPPUNIT_ASSERT( ridList[3] == 7 ); } void testInterfaceInsertRowDoubleChar() { ColStruct curColStruct, testColStruct; ColTuple curTuple, testTuple; ColTupleList curTupleList, testTupleList; ColStructList colStructList; ColValueList colValueList, colOldValList; RIDList ridList; string curString; int total, rc; ColumnOp colOp; // colOp = m_wrapper.getColumnOp(); colOp.deleteFile( 100 ); // test column struct list CreateColumnFile( 100, 2, WriteEngine::CHAR, WriteEngine::WR_CHAR ); SetColumnStruct( curColStruct, 100, 2, WriteEngine::CHAR ); colStructList.push_back( curColStruct ); testColStruct = colStructList[0]; CPPUNIT_ASSERT( testColStruct.dataOid == 100 ); CPPUNIT_ASSERT( testColStruct.colWidth == 2 ); CPPUNIT_ASSERT( testColStruct.colDataType == WriteEngine::CHAR ); // test column values // add values for the first column curString = "\377\376"; curTuple.data = curString; curTupleList.push_back( curTuple ); curString = "ab"; curTuple.data = curString; curTupleList.push_back( curTuple ); curString = "c"; curTuple.data = curString; curTupleList.push_back( curTuple ); curString = "Ge"; curTuple.data = curString; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); // retrieve the values back // first column testTupleList = static_cast<ColTupleList>(colValueList[0]); total = testTupleList.size(); testTuple = testTupleList[1]; CPPUNIT_ASSERT( boost::any_cast<std::string>( testTuple.data ) == "ab" ); testTuple = testTupleList[2]; CPPUNIT_ASSERT( boost::any_cast<std::string>( testTuple.data ) == "c" ); testTuple = testTupleList[3]; CPPUNIT_ASSERT( boost::any_cast<std::string>( testTuple.data ) == "Ge" ); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); printf( "\nrc=%d", rc ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 0 ); CPPUNIT_ASSERT( ridList[1] == 1 ); CPPUNIT_ASSERT( ridList[2] == 2 ); CPPUNIT_ASSERT( ridList[3] == 3 ); // try to insert more rows and row id should increase rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 4 ); CPPUNIT_ASSERT( ridList[1] == 5 ); CPPUNIT_ASSERT( ridList[2] == 6 ); CPPUNIT_ASSERT( ridList[3] == 7 ); } void testInterfaceInsertRowLongLong() { ColStruct curColStruct, testColStruct; ColTuple curTuple, testTuple; ColTupleList curTupleList, testTupleList; ColStructList colStructList; ColValueList colValueList, colOldValList; RIDList ridList; int total, rc; CreateColumnFile( 100, 8, WriteEngine::BIGINT, WriteEngine::WR_LONGLONG ); CreateColumnFile( 200, 2, WriteEngine::SMALLINT, WriteEngine::WR_SHORT ); // test column struct list SetColumnStruct( curColStruct, 100, 8, WriteEngine::BIGINT ); colStructList.push_back( curColStruct ); SetColumnStruct( curColStruct, 200, 2, WriteEngine::SMALLINT ); colStructList.push_back( curColStruct ); testColStruct = colStructList[0]; CPPUNIT_ASSERT( testColStruct.dataOid == 100 ); CPPUNIT_ASSERT( testColStruct.colWidth == 8 ); CPPUNIT_ASSERT( testColStruct.colDataType == WriteEngine::BIGINT ); testColStruct = colStructList[1]; CPPUNIT_ASSERT( testColStruct.dataOid == 200 ); CPPUNIT_ASSERT( testColStruct.colWidth == 2 ); CPPUNIT_ASSERT( testColStruct.colDataType == WriteEngine::SMALLINT ); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == ERR_STRUCT_VALUE_NOT_MATCH ); // test column values // add values for the first column curTuple.data = (long long)1021231; curTupleList.push_back( curTuple ); curTuple.data = (long long)0; curTupleList.push_back( curTuple ); curTuple.data = (long long)93232200; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); // add values for the second column curTuple.data = (short)1000; curTupleList.push_back( curTuple ); curTuple.data = (short)5678; curTupleList.push_back( curTuple ); curTuple.data = (short)9; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); // add one rowId ridList.push_back( (RID) 5 ); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == ERR_ROWID_VALUE_NOT_MATCH ); ridList.push_back( (RID) 9 ); ridList.push_back( (RID) 10 ); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); // retrieve the values back // first column testTupleList = static_cast<ColTupleList>(colValueList[0]); total = testTupleList.size(); testTuple = testTupleList[0]; CPPUNIT_ASSERT( boost::any_cast<long long>( testTuple.data ) == 1021231 ); testTuple = testTupleList[1]; CPPUNIT_ASSERT( boost::any_cast<long long>( testTuple.data ) == 0 ); testTuple = testTupleList[2]; CPPUNIT_ASSERT( boost::any_cast<long long>( testTuple.data ) == 93232200 ); // second column testTupleList = static_cast<ColTupleList>(colValueList[1]); total = testTupleList.size(); testTuple = testTupleList[0]; CPPUNIT_ASSERT( boost::any_cast<short>( testTuple.data ) == 1000 ); testTuple = testTupleList[1]; CPPUNIT_ASSERT( boost::any_cast<short>( testTuple.data ) == 5678 ); testTuple = testTupleList[2]; CPPUNIT_ASSERT( boost::any_cast<short>( testTuple.data ) == 9 ); // m_wrapper.printInputValue( (OID)103, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 0 ); CPPUNIT_ASSERT( ridList[1] == 1 ); CPPUNIT_ASSERT( ridList[2] == 2 ); // try to insert more rows and row id should increase rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 3 ); CPPUNIT_ASSERT( ridList[1] == 4 ); CPPUNIT_ASSERT( ridList[2] == 5 ); } void testInterfaceInsertRowByte() { ColStruct curColStruct, testColStruct; ColTuple curTuple, testTuple; ColTupleList curTupleList, testTupleList; ColStructList colStructList; ColValueList colValueList, colOldValList; RIDList ridList; int total, rc; ColumnOp colOp; CreateColumnFile( 100, 1, WriteEngine::TINYINT, WriteEngine::WR_BYTE ); CreateColumnFile( 200, 4, WriteEngine::INT, WriteEngine::WR_INT ); // test column struct list SetColumnStruct( curColStruct, 100, 1, WriteEngine::TINYINT ); colStructList.push_back( curColStruct ); SetColumnStruct( curColStruct, 200, 4, WriteEngine::INT ); colStructList.push_back( curColStruct ); testColStruct = colStructList[0]; CPPUNIT_ASSERT( testColStruct.dataOid == 100 ); CPPUNIT_ASSERT( testColStruct.colWidth == 1 ); CPPUNIT_ASSERT( testColStruct.colDataType == WriteEngine::TINYINT ); testColStruct = colStructList[1]; CPPUNIT_ASSERT( testColStruct.dataOid == 200 ); CPPUNIT_ASSERT( testColStruct.colWidth == 4 ); CPPUNIT_ASSERT( testColStruct.colDataType == WriteEngine::INT ); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == ERR_STRUCT_VALUE_NOT_MATCH ); // test column values // add values for the first column curTuple.data = (char)21; curTupleList.push_back( curTuple ); curTuple.data = (char) - 30; curTupleList.push_back( curTuple ); curTuple.data = (char)127; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); // add values for the second column curTuple.data = 1000; curTupleList.push_back( curTuple ); curTuple.data = 5678; curTupleList.push_back( curTuple ); curTuple.data = 9; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); // add one rowId ridList.push_back( (RID) 5 ); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == ERR_ROWID_VALUE_NOT_MATCH ); ridList.push_back( (RID) 9 ); ridList.push_back( (RID) 10 ); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); // retrieve the values back // first column testTupleList = static_cast<ColTupleList>(colValueList[0]); total = testTupleList.size(); testTuple = testTupleList[0]; CPPUNIT_ASSERT( boost::any_cast<char>( testTuple.data ) == 21 ); testTuple = testTupleList[1]; CPPUNIT_ASSERT( boost::any_cast<char>( testTuple.data ) == -30 ); testTuple = testTupleList[2]; CPPUNIT_ASSERT( boost::any_cast<char>( testTuple.data ) == 127 ); // second column testTupleList = static_cast<ColTupleList>(colValueList[1]); total = testTupleList.size(); testTuple = testTupleList[0]; CPPUNIT_ASSERT( boost::any_cast<int>( testTuple.data ) == 1000 ); testTuple = testTupleList[1]; CPPUNIT_ASSERT( boost::any_cast<int>( testTuple.data ) == 5678 ); testTuple = testTupleList[2]; CPPUNIT_ASSERT( boost::any_cast<int>( testTuple.data ) == 9 ); // m_wrapper.printInputValue( (OID)103, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 0 ); CPPUNIT_ASSERT( ridList[1] == 1 ); CPPUNIT_ASSERT( ridList[2] == 2 ); // try to insert more rows and row id should increase rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 3 ); CPPUNIT_ASSERT( ridList[1] == 4 ); CPPUNIT_ASSERT( ridList[2] == 5 ); } void testInterfaceInsertRowToken() { ColStruct curColStruct, testColStruct; ColTuple curTuple, testTuple; ColTupleList curTupleList, testTupleList; ColStructList colStructList; ColValueList colValueList, colOldValList; RIDList ridList; std::string curStr, testStr; int rc; ColumnOp colOp; OID dctnryOID = 800, treeOID = 801, listOID = 802; DctnryTuple dctnryTuple; // no matter what happened, drop stores // BRMWrapper::setUseBrm(false); m_wrapper.dropStore( m_session.txnid, dctnryOID, treeOID, listOID); rc = m_wrapper.createStore( m_session.txnid, dctnryOID, treeOID, listOID); CPPUNIT_ASSERT( rc == NO_ERROR ); rc = m_wrapper.openStore( m_session.txnid, dctnryOID, treeOID, listOID); CPPUNIT_ASSERT( rc == NO_ERROR ); //colOp = m_wrapper.getColumnOp(); // test column struct list CreateColumnFile( 100, 8, WriteEngine::CHAR, WriteEngine::WR_CHAR ); SetColumnStruct( curColStruct, 100, 8, WriteEngine::CHAR ); curColStruct.tokenFlag = true; colStructList.push_back( curColStruct ); testColStruct = colStructList[0]; CPPUNIT_ASSERT( testColStruct.dataOid == 100 ); CPPUNIT_ASSERT( testColStruct.colWidth == 8 ); CPPUNIT_ASSERT( testColStruct.colDataType == WriteEngine::CHAR ); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == ERR_STRUCT_VALUE_NOT_MATCH ); // test column values // add values for the first column strcpy( (char*)dctnryTuple.sigValue, "ABCD 12345" ); dctnryTuple.sigSize = 10; rc = m_wrapper.tokenize( m_session.txnid, dctnryTuple ); if (rc != NO_ERROR) printf("1197 Tokenize failed, rc %i\n", rc); CPPUNIT_ASSERT( rc == NO_ERROR ); curTuple.data = dctnryTuple.token; curTupleList.push_back( curTuple ); Token test1; test1 = boost::any_cast<Token>( curTuple.data ); // printf( "\ncurTuple.datatype = %d\n", curTuple.data.type() ); strcpy( (char*)dctnryTuple.sigValue, "CBED 1334678" ); dctnryTuple.sigSize = 12; rc = m_wrapper.tokenize( m_session.txnid, dctnryTuple ); if (rc != NO_ERROR) printf("1208 Tokenize failed, rc %i\n", rc); CPPUNIT_ASSERT( rc == NO_ERROR ); curTuple.data = dctnryTuple.token; curTupleList.push_back( curTuple ); strcpy( (char*)dctnryTuple.sigValue, "GHED 2334" ); dctnryTuple.sigSize = 9; rc = m_wrapper.tokenize( m_session.txnid, dctnryTuple ); CPPUNIT_ASSERT( rc == NO_ERROR ); curTuple.data = dctnryTuple.token; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); // add one rowId ridList.push_back( (RID) 5 ); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == ERR_ROWID_VALUE_NOT_MATCH ); ridList.push_back( (RID) 9 ); ridList.push_back( (RID) 10 ); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); // m_wrapper.printInputValue( (OID)103, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 0 ); CPPUNIT_ASSERT( ridList[1] == 1 ); CPPUNIT_ASSERT( ridList[2] == 2 ); // try to insert more rows and row id should increase rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList[0] == 3 ); CPPUNIT_ASSERT( ridList[1] == 4 ); CPPUNIT_ASSERT( ridList[2] == 5 ); m_wrapper.dropStore( m_session.txnid, dctnryOID, treeOID, listOID); } void testInterfaceCreateIndex() { int rc; ColumnOp colOp; if ( colOp.exists( 900 ) ) { rc = m_wrapper.dropIndex( m_session.txnid, 900, 901 ); CPPUNIT_ASSERT( rc == NO_ERROR ); } rc = m_wrapper.createIndex( m_session.txnid, 900, 901 ); CPPUNIT_ASSERT( rc == NO_ERROR ); } void testInterfaceDropIndex() { int rc; rc = m_wrapper.dropIndex( m_session.txnid, 900, 901 ); CPPUNIT_ASSERT( rc == NO_ERROR ); } void SetIndexStruct( IdxStruct& curStruct, OID treeOid, OID listOid, int width, CalpontSystemCatalog::ColDataType dataType ) { curStruct.treeOid = treeOid; curStruct.listOid = listOid; curStruct.idxWidth = width; curStruct.idxDataType = dataType; curStruct.tokenFlag = false; } void testInterfaceUpdateIndexChar() { IdxStruct curStruct, testStruct; IdxTuple curTuple, testTuple; IdxTupleList curTupleList, testTupleList; IdxStructList idxStructList; IdxValueList idxValueList; RIDList ridList; std::string curStr, testStr; int total, rc; testInterfaceCreateIndex(); CPPUNIT_ASSERT( m_wrapper.updateIndexRec( m_session.txnid, idxStructList, idxValueList, ridList ) != NO_ERROR ); // test column struct list SetIndexStruct( curStruct, 900, 901, 4, WriteEngine::MEDINT ); idxStructList.push_back( curStruct ); testStruct = idxStructList[0]; CPPUNIT_ASSERT( testStruct.treeOid == 900 ); CPPUNIT_ASSERT( testStruct.listOid == 901 ); CPPUNIT_ASSERT( testStruct.idxWidth == 4 ); CPPUNIT_ASSERT( testStruct.idxDataType == WriteEngine::MEDINT ); CPPUNIT_ASSERT( m_wrapper.checkIndexValid( m_session.txnid, idxStructList, idxValueList, ridList ) == ERR_STRUCT_VALUE_NOT_MATCH ); // add values for the first index curTuple.data = 102; curTupleList.push_back( curTuple ); curTuple.data = 102; curTupleList.push_back( curTuple ); curTuple.data = 102; curTupleList.push_back( curTuple ); curTuple.data = 0; curTupleList.push_back( curTuple ); curTuple.data = 200; curTupleList.push_back( curTuple ); idxValueList.push_back( curTupleList ); curTupleList.clear(); // add one rowId ridList.push_back( (RID) 5 ); CPPUNIT_ASSERT( m_wrapper.checkIndexValid( m_session.txnid, idxStructList, idxValueList, ridList ) == ERR_ROWID_VALUE_NOT_MATCH ); ridList.push_back( (RID) 15 ); ridList.push_back( (RID) 16 ); ridList.push_back( (RID) 17 ); ridList.push_back( (RID) 10 ); CPPUNIT_ASSERT( m_wrapper.checkIndexValid( m_session.txnid, idxStructList, idxValueList, ridList ) == NO_ERROR ); // retrieve the values back // first column testTupleList = static_cast<IdxTupleList>(idxValueList[0]); total = testTupleList.size(); testTuple = testTupleList[0]; CPPUNIT_ASSERT( boost::any_cast<int>( testTuple.data ) == 102 ); testTuple = testTupleList[3]; CPPUNIT_ASSERT( boost::any_cast<int>( testTuple.data ) == 0 ); testTuple = testTupleList[4]; CPPUNIT_ASSERT( boost::any_cast<int>( testTuple.data ) == 200 ); rc = m_wrapper.updateIndexRec( m_session.txnid, idxStructList, idxValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); // CPPUNIT_ASSERT( m_wrapper.deleteIndexRec( idxStructList, idxValueList, ridList ) == NO_ERROR ); } void testInterfaceUpdateMultiColIndex() { IdxStruct curStruct, testStruct; IdxTuple curTuple, testTuple; IdxTupleList curTupleList, testTupleList; IdxStructList idxStructList; IdxValueList idxValueList; RIDList ridList; std::string curStr, testStr; int total, rc; testInterfaceCreateIndex(); CPPUNIT_ASSERT( m_wrapper.updateIndexRec( m_session.txnid, idxStructList, idxValueList, ridList ) != NO_ERROR ); // test column struct list SetIndexStruct( curStruct, 900, 901, 4, WriteEngine::MEDINT ); idxStructList.push_back( curStruct ); SetIndexStruct( curStruct, 900, 901, 2, WriteEngine::SMALLINT ); idxStructList.push_back( curStruct ); testStruct = idxStructList[0]; CPPUNIT_ASSERT( testStruct.treeOid == 900 ); CPPUNIT_ASSERT( testStruct.listOid == 901 ); CPPUNIT_ASSERT( testStruct.idxWidth == 4 ); CPPUNIT_ASSERT( testStruct.idxDataType == WriteEngine::MEDINT ); testStruct = idxStructList[1]; CPPUNIT_ASSERT( testStruct.treeOid == 900 ); CPPUNIT_ASSERT( testStruct.listOid == 901 ); CPPUNIT_ASSERT( testStruct.idxWidth == 2 ); CPPUNIT_ASSERT( testStruct.idxDataType == WriteEngine::SMALLINT ); CPPUNIT_ASSERT( m_wrapper.checkIndexValid( m_session.txnid, idxStructList, idxValueList, ridList ) == ERR_STRUCT_VALUE_NOT_MATCH ); // add values for the first index curTuple.data = 102; curTupleList.push_back( curTuple ); curTuple.data = 0; curTupleList.push_back( curTuple ); curTuple.data = 200; curTupleList.push_back( curTuple ); idxValueList.push_back( curTupleList ); curTupleList.clear(); // add values for the second index curTuple.data = (short)1; curTupleList.push_back( curTuple ); curTuple.data = (short)2; curTupleList.push_back( curTuple ); curTuple.data = (short)3; curTupleList.push_back( curTuple ); idxValueList.push_back( curTupleList ); curTupleList.clear(); // add one rowId ridList.push_back( (RID) 5 ); CPPUNIT_ASSERT( m_wrapper.checkIndexValid( m_session.txnid, idxStructList, idxValueList, ridList ) == ERR_ROWID_VALUE_NOT_MATCH ); ridList.push_back( (RID) 9 ); ridList.push_back( (RID) 10 ); CPPUNIT_ASSERT( m_wrapper.checkIndexValid( m_session.txnid, idxStructList, idxValueList, ridList ) == NO_ERROR ); // retrieve the values back // first column testTupleList = static_cast<IdxTupleList>(idxValueList[0]); total = testTupleList.size(); testTuple = testTupleList[0]; CPPUNIT_ASSERT( boost::any_cast<int>( testTuple.data ) == 102 ); testTuple = testTupleList[1]; CPPUNIT_ASSERT( boost::any_cast<int>( testTuple.data ) == 0 ); testTuple = testTupleList[2]; CPPUNIT_ASSERT( boost::any_cast<int>( testTuple.data ) == 200 ); // second column testTupleList = static_cast<IdxTupleList>(idxValueList[1]); total = testTupleList.size(); testTuple = testTupleList[0]; CPPUNIT_ASSERT( boost::any_cast<short>( testTuple.data ) == 1 ); testTuple = testTupleList[1]; CPPUNIT_ASSERT( boost::any_cast<short>( testTuple.data ) == 2 ); testTuple = testTupleList[2]; CPPUNIT_ASSERT( boost::any_cast<short>( testTuple.data ) == 3 ); rc = m_wrapper.processMultiColIndexRec( m_session.txnid, idxStructList, idxValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); } void testInterfaceDeleteIndexChar() { IdxStruct curStruct, testStruct; IdxTuple curTuple, testTuple; IdxTupleList curTupleList, testTupleList; std::vector<IdxStruct> idxStructList; std::vector<IdxTupleList> idxValueList; std::vector<RID> ridList; std::string curStr, testStr; int total; // test column struct list SetIndexStruct( curStruct, 900, 901, 4, WriteEngine::MEDINT ); idxStructList.push_back( curStruct ); testStruct = idxStructList[0]; CPPUNIT_ASSERT( testStruct.treeOid == 900 ); CPPUNIT_ASSERT( testStruct.listOid == 901 ); CPPUNIT_ASSERT( testStruct.idxWidth == 4 ); CPPUNIT_ASSERT( testStruct.idxDataType == WriteEngine::MEDINT ); CPPUNIT_ASSERT( m_wrapper.checkIndexValid( m_session.txnid, idxStructList, idxValueList, ridList ) == ERR_STRUCT_VALUE_NOT_MATCH ); // add values for the first index curTuple.data = 102; curTupleList.push_back( curTuple ); idxValueList.push_back( curTupleList ); curTupleList.clear(); // add one rowId ridList.push_back( (RID) 5 ); CPPUNIT_ASSERT( m_wrapper.checkIndexValid( m_session.txnid, idxStructList, idxValueList, ridList ) == NO_ERROR ); // retrieve the values back // first column testTupleList = static_cast<IdxTupleList>(idxValueList[0]); total = testTupleList.size(); testTuple = testTupleList[0]; CPPUNIT_ASSERT( boost::any_cast<int>( testTuple.data ) == 102 ); CPPUNIT_ASSERT( m_wrapper.deleteIndexRec( m_session.txnid, idxStructList, idxValueList, ridList ) == NO_ERROR ); } void testInterfaceDctnryToken() { /* int rc; OID dctnryOID=880, treeOID=881, listOID=882; DctnryTuple dctnryTuple; DctnryStruct dctnryStruct; printf("Running testInterfaceDctnryToken\n"); memset(&dctnryTuple, 0, sizeof(dctnryTuple)); memset(&dctnryStruct,0, sizeof(dctnryStruct)); dctnryStruct.dctnryOid = dctnryOID; dctnryStruct.treeOid = treeOID; dctnryStruct.listOid = listOID; BRMWrapper::setUseBrm(true); m_wrapper.dropStore( m_session.txnid, dctnryOID, treeOID, listOID); rc = m_wrapper.createStore( m_session.txnid, dctnryOID, treeOID, listOID); CPPUNIT_ASSERT( rc == NO_ERROR ); rc = m_wrapper.openStore( m_session.txnid, dctnryOID, treeOID, listOID); CPPUNIT_ASSERT( rc == NO_ERROR ); Token token[17], token2[17]; memset(token, 0, 17*sizeof(Token)); memset(token2, 0, 17*sizeof(Token)); int i,j,k,smallSize=1000; j=255; for (k=1; k<17; k++) { for (i=0; i<smallSize; i++) { if (j==0) j=255; dctnryTuple.sigValue[i]=k; j--; } dctnryTuple.token.fbo=(uint64_t)-1; dctnryTuple.token.op =(int)-1; dctnryTuple.sigSize = smallSize; rc = m_wrapper.tokenize( m_session.txnid, dctnryTuple); if (rc!= NO_ERROR) { printf("1219.Tokenize failed ERROR CODE : %i k %i\n", rc , k); return; } else { printf("fbo %llu op %i\n",dctnryTuple.token.fbo,dctnryTuple.token.op); } CPPUNIT_ASSERT( rc == NO_ERROR ); if ((dctnryTuple.token.fbo ==(uint64_t)-1) ||(dctnryTuple.token.op==(int)-1)) { printf("1440.Tokenize failed ERROR CODE : %i k %i\n", rc , k); return; } token[k].fbo = dctnryTuple.token.fbo; token[k].op = dctnryTuple.token.op; rc = m_wrapper.tokenize( m_session.txnid, dctnryTuple); if (rc!= NO_ERROR) { printf("k %i \n", k); printf("1227.Second time tokenize failed ERROR CODE : %i \n", rc); return; } else { printf("Second tiem fbo %llu op %i\n",dctnryTuple.token.fbo,dctnryTuple.token.op); } CPPUNIT_ASSERT( rc == NO_ERROR ); token2[k].fbo = dctnryTuple.token.fbo; token2[k].op = dctnryTuple.token.op; } m_wrapper.closeStore( m_session.txnid ); for (int i=0; i< 17; i++) { //CPPUNIT_ASSERT(token[i].fbo == token2[i].fbo); CPPUNIT_ASSERT(token[i].op == token2[i].op); rc = m_wrapper.deleteToken( m_session.txnid, dctnryStruct, token[i]); if (i==0) CPPUNIT_ASSERT( rc != NO_ERROR ); else CPPUNIT_ASSERT( rc == NO_ERROR ); } BRMWrapper::setUseBrm( true ); m_wrapper.openStore( m_session.txnid, dctnryOID, treeOID, listOID); rc = m_wrapper.tokenize( m_session.txnid, dctnryStruct,dctnryTuple); printf("rc %i \n", rc); rc = m_wrapper.rollbackTran(m_session.txnid); printf("This is rollback rc %i \n", rc); rc = m_wrapper.tokenize( m_session.txnid, dctnryStruct,dctnryTuple); printf("This is after rollback tokenize rc %i \n", rc); cout << "fbo " << dctnryTuple.token.fbo << " op " << dctnryTuple.token.op << endl; m_wrapper.closeStore( m_session.txnid ); // rc = m_wrapper.dropStore( m_session.txnid, dctnryOID, treeOID, listOID); // CPPUNIT_ASSERT( rc == NO_ERROR ); */ } void testInterfaceDctnryTokenRollBack() { /* int rc; OID dctnryOID=850, treeOID=851, listOID=852; DctnryTuple dctnryTuple; DctnryStruct dctnryStruct; m_session.txnid =100; BRMWrapper::setUseBrm(true); printf("Running testInterfaceDctnryTokenRollBack\n"); memset(&dctnryTuple, 0, sizeof(dctnryTuple)); memset(&dctnryStruct,0, sizeof(dctnryStruct)); dctnryStruct.dctnryOid = dctnryOID; dctnryStruct.treeOid = treeOID; dctnryStruct.listOid = listOID; // BRMWrapper::setUseBrm(true); m_wrapper.dropStore( m_session.txnid, dctnryOID, treeOID, listOID ); rc = m_wrapper.createStore( m_session.txnid, dctnryOID, treeOID, listOID); CPPUNIT_ASSERT( rc == NO_ERROR ); rc = m_wrapper.openStore( m_session.txnid, dctnryOID, treeOID, listOID); CPPUNIT_ASSERT( rc == NO_ERROR ); Token token[17], token2[17]; memset(token, 0, 17*sizeof(Token)); memset(token2, 0, 17*sizeof(Token)); int i,j,k,smallSize=10; j=255; for (k=1; k<2; k++) { for (i=0; i<smallSize; i++) { if (j==0) j=255; dctnryTuple.sigValue[i]=k; j--; } dctnryTuple.token.fbo=(uint64_t)-1; dctnryTuple.token.op =(int)-1; dctnryTuple.sigSize = smallSize; rc = m_wrapper.tokenize( m_session.txnid, dctnryTuple); if (rc!= NO_ERROR) { printf("1529.Tokenize failed ERROR CODE : %i k %i\n", rc , k); return; } else { printf("fbo %llu op %i\n",dctnryTuple.token.fbo,dctnryTuple.token.op); } CPPUNIT_ASSERT( rc == NO_ERROR ); if ((dctnryTuple.token.fbo ==(uint64_t)-1) ||(dctnryTuple.token.op==(int)-1)) { printf("1440.Tokenize failed ERROR CODE : %i k %i\n", rc , k); return; } } rc = m_wrapper.rollbackTran(m_session.txnid ); m_wrapper.closeStore( m_session.txnid ); */ } void testInsertCommitRollback() { ColStruct curColStruct, testColStruct; ColTuple curTuple, testTuple; ColTupleList curTupleList, testTupleList; ColStructList colStructList; ColValueList colValueList, colOldValList; RIDList ridList; string curString; int rc; ColumnOp colOp; BRMWrapper::setUseBrm( true ); // test column struct list CreateColumnFile( 150, 4, WriteEngine::CHAR, WriteEngine::WR_CHAR ); SetColumnStruct( curColStruct, 150, 4, WriteEngine::CHAR ); colStructList.push_back( curColStruct ); testColStruct = colStructList[0]; CPPUNIT_ASSERT( testColStruct.dataOid == 150 ); CPPUNIT_ASSERT( testColStruct.colWidth == 4 ); CPPUNIT_ASSERT( testColStruct.colDataType == WriteEngine::CHAR ); // test column values // add values for the first column curString = "ab1"; curTuple.data = curString; curTupleList.push_back( curTuple ); curString = "ab2"; curTuple.data = curString; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); curTupleList.clear(); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); // try to insert more rows and row id should increase rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); rc = m_wrapper.commit( m_session.txnid ); CPPUNIT_ASSERT( rc == NO_ERROR ); // txnid increase by one m_session.txnid++; colValueList.clear(); curString = "bb1"; curTuple.data = curString; curTupleList.push_back( curTuple ); curString = "bb2"; curTuple.data = curString; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); rc = m_wrapper.commit( m_session.txnid ); CPPUNIT_ASSERT( rc == NO_ERROR ); // txnid increase by one m_session.txnid++; colValueList.clear(); curString = "cb1"; curTuple.data = curString; curTupleList.push_back( curTuple ); curString = "cb2"; curTuple.data = curString; curTupleList.push_back( curTuple ); colValueList.push_back( curTupleList ); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); rc = m_wrapper.rollbackTran( m_session.txnid ); CPPUNIT_ASSERT( rc == NO_ERROR ); } void testInterfaceInsertRowHwm() { ColStruct curColStruct, testColStruct; ColTuple curTuple, testTuple; ColTupleList curTupleList, testTupleList; ColStructList colStructList; ColValueList colValueList, colOldValList; RIDList ridList; int rc; ColumnOp colOp; CreateColumnFile( 300, 1, WriteEngine::TINYINT, WriteEngine::WR_BYTE ); CreateColumnFile( 400, 4, WriteEngine::INT, WriteEngine::WR_INT ); // test column struct list SetColumnStruct( curColStruct, 300, 1, WriteEngine::TINYINT ); colStructList.push_back( curColStruct ); SetColumnStruct( curColStruct, 400, 4, WriteEngine::INT ); colStructList.push_back( curColStruct ); testColStruct = colStructList[0]; CPPUNIT_ASSERT( testColStruct.dataOid == 300 ); CPPUNIT_ASSERT( testColStruct.colWidth == 1 ); CPPUNIT_ASSERT( testColStruct.colDataType == WriteEngine::TINYINT ); testColStruct = colStructList[1]; CPPUNIT_ASSERT( testColStruct.dataOid == 400 ); CPPUNIT_ASSERT( testColStruct.colWidth == 4 ); CPPUNIT_ASSERT( testColStruct.colDataType == WriteEngine::INT ); m_session.txnid++; CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == ERR_STRUCT_VALUE_NOT_MATCH ); // test column values // add values for the first column for ( int i = 0; i < 9000; i++ ) { curTuple.data = (char)(i % 20); curTupleList.push_back( curTuple ); } colValueList.push_back( curTupleList ); curTupleList.clear(); // add values for the second column for ( int i = 0; i < 9000; i++ ) { curTuple.data = i; curTupleList.push_back( curTuple ); } colValueList.push_back( curTupleList ); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); // m_wrapper.printInputValue( (OID)103, colStructList, colValueList, ridList ); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( ridList.size() == 9000 ); } void testInterfaceCombineIndexLoad() { int rc; ColumnOp colOp; ColStruct curColStruct; ColTuple curTuple, testTuple; ColTupleList curTupleList, testTupleList; ColStructList colStructList; ColValueList colValueList, colOldValList; RIDList ridList; Cache::init(); Cache::setUseCache( true ); m_wrapper.setDebugLevel( DEBUG_0 ); colOp.dropColumn( 400 ); CreateColumnFile( 400, 4, WriteEngine::INT, WriteEngine::WR_INT ); // test column struct list SetColumnStruct( curColStruct, 400, 4, WriteEngine::INT ); colStructList.push_back( curColStruct ); m_session.txnid++; CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == ERR_STRUCT_VALUE_NOT_MATCH ); curTupleList.clear(); int totalValue = 2000000; // add values for the first column for ( int i = 0; i < totalValue; i++ ) { curTuple.data = rand() % 100; curTupleList.push_back( curTuple ); } colValueList.push_back( curTupleList ); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); // m_wrapper.printInputValue( (OID)103, colStructList, colValueList, ridList ); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( (int)ridList.size() == totalValue ); if ( colOp.exists( 900 ) ) { rc = m_wrapper.dropIndex( m_session.txnid, 900, 901 ); CPPUNIT_ASSERT( rc == NO_ERROR ); } rc = m_wrapper.createIndex( m_session.txnid, 900, 901 ); CPPUNIT_ASSERT( rc == NO_ERROR ); uint64_t totalRows; rc = m_wrapper.buildIndex( 400, 900, 901, INT, 4, 0, true, totalRows ); printf( "\nrc=%d", rc ); printf( "\ntotalRows=%llu", totalRows ); CPPUNIT_ASSERT( rc == NO_ERROR ); Cache::freeMemory(); } void testTmpBulkPerformance() { int rc; ColumnOp colOp; ColStruct curColStruct; ColTuple curTuple, testTuple; ColTupleList curTupleList, testTupleList; ColStructList colStructList; ColValueList colValueList, colOldValList; RIDList ridList; Cache::init(); Cache::setUseCache( true ); m_wrapper.setDebugLevel( DEBUG_0 ); /* colOp.dropColumn( 400 ); CreateColumnFile( 400, 4, WriteEngine::INT, WriteEngine::WR_INT ); // test column struct list SetColumnStruct( curColStruct, 400, 4, WriteEngine::INT ); colStructList.push_back( curColStruct ); m_session.txnid++; CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == ERR_STRUCT_VALUE_NOT_MATCH ); curTupleList.clear(); int totalValue = 2000000; // add values for the first column for( int i = 0; i < totalValue; i++ ) { curTuple.data = rand() % 100; curTupleList.push_back( curTuple ); } colValueList.push_back( curTupleList ); CPPUNIT_ASSERT( m_wrapper.checkValid( m_session.txnid, colStructList, colValueList, ridList ) == NO_ERROR ); // m_wrapper.printInputValue( (OID)103, colStructList, colValueList, ridList ); rc = m_wrapper.insertColumnRec( m_session.txnid, colStructList, colValueList, ridList ); CPPUNIT_ASSERT( rc == NO_ERROR ); CPPUNIT_ASSERT( (int)ridList.size() == totalValue ); */ if ( colOp.exists( 900 ) ) { rc = m_wrapper.dropIndex( m_session.txnid, 900, 901 ); CPPUNIT_ASSERT( rc == NO_ERROR ); } rc = m_wrapper.createIndex( m_session.txnid, 900, 901 ); CPPUNIT_ASSERT( rc == NO_ERROR ); uint64_t totalRows; std::string indexName; rc = m_wrapper.buildIndex( "CPL_299_23839.dat", 900, 901, INT, 4, 0, false, totalRows, indexName, 0, 2000000 ); printf( "\nrc=%d", rc ); printf( "\ntotalRows=%llu", totalRows ); CPPUNIT_ASSERT( rc == NO_ERROR ); Cache::freeMemory(); } void testBoostFloat() { boost::any anyVal; unsigned int fValue = 0xffaaaaaa; unsigned int testfValue; unsigned int testfValue2; float fValue1 = 0xffaaaaaa; float testfValue11 = 0 ; float testfValue12 = 0; int iSize = 0; char charBuf[100]; FILE* pFile; ColumnOp colOp; Column curCol; int rc; RID rowIdArray[3]; int width = 4, totalRow = 3; FID fid = 800; float valArray[3]; uint64_t oldValArray[3]; CalpontSystemCatalog::ColDataType colDataType = CalpontSystemCatalog::FLOAT; ColType colType = WriteEngine::WR_FLOAT; //uint64_t emptyVal = 0xFFAAAAAB; rowIdArray[0] = 0; rowIdArray[1] = 1; rowIdArray[2] = 2; valArray[0] = 8.123; valArray[1] = 5.345; valArray[2] = 3.789; CreateColumnFile( fid, width, colDataType, colType ); colOp.initColumn( curCol ); colOp.setColParam( curCol, 2, width, colDataType, colType, fid ); rc = colOp.openColumnFile( curCol ); CPPUNIT_ASSERT( rc == NO_ERROR ); rc = colOp.writeRow( curCol, totalRow, (RID*) rowIdArray, valArray, oldValArray ); CPPUNIT_ASSERT( rc == NO_ERROR ); for ( int i = 0; i < totalRow; i++ ) cout << "emptyVal=" << oldValArray[i] << endl; colOp.closeFile(curCol.dataFile.pFile); pFile = fopen( "/home/jhuang/tmp/000.dir/000.dir/003.dir/FILE032.cdf", "r" ); iSize = fread( charBuf, 1, 4, pFile ); memcpy(&testfValue12, charBuf, 4); cout << "Value1=" << testfValue12 << endl; iSize = fread( charBuf, 1, 4, pFile ); memcpy(&testfValue12, charBuf, 4); cout << "Value2=" << testfValue12 << endl; iSize = fread( charBuf, 1, 4, pFile ); memcpy(&testfValue12, charBuf, 4); cout << "Value3=" << testfValue12 << endl; fclose(pFile); anyVal = fValue1; testfValue11 = boost::any_cast<float>( anyVal ); memcpy(charBuf, &testfValue11, 4); pFile = fopen( "test", "w+b" ); if ( pFile != NULL ) { iSize = fwrite((char*) charBuf, 4, 1, pFile ); printf( "\niSize=%d \n", iSize ); fclose( pFile ); } unsigned char charBuf2[100]; memset(charBuf2, '\0', 100); pFile = fopen("test", "r"); iSize = fread( charBuf2, 4, 1, pFile ); memcpy(&testfValue12, charBuf2, 4); cout << " Using Float, NULL value=" << testfValue12 << endl; anyVal = fValue; testfValue = boost::any_cast<unsigned int>( anyVal ); memcpy(charBuf, &testfValue, 4); pFile = fopen( "test", "w+b" ); if ( pFile != NULL ) { iSize = fwrite((char*) charBuf, 4, 1, pFile ); printf( "\niSize=%d \n", iSize ); fclose( pFile ); } memset(charBuf2, '\0', 100); pFile = fopen("test", "r"); iSize = fread( charBuf2, 4, 1, pFile ); memcpy(&testfValue2, charBuf2, 4); cout << " Using unsinged int, NULL value=" << testfValue2 << endl; // Other method anyVal = fValue; testfValue = boost::any_cast<unsigned int>( anyVal ); ofstream fout("file.dat", ios::binary); fout.write((char*)(&testfValue), sizeof(testfValue)); fout.close(); ifstream fin("file.dat", ios::binary); fin.read((char*)(&testfValue2), sizeof(testfValue2)); cout << "Using unsigned int NULL value=" << testfValue2 << endl; } void testCreateColumnFiles1() { ColumnOp colOp; Column curCol; int rc; OID fid = 10; m_session.txnid++; // file opertaions //colOp.startfTimer(); colOp.initColumn( curCol ); rc = colOp.createColumn( curCol, 0, 8, WriteEngine::CHAR, WriteEngine::WR_CHAR, (FID)fid ); //colOp.stopfTimer(); colOp.clearColumn( curCol ); //rc = m_wrapper.createColumn( m_session.txnid, fid, WriteEngine::CHAR, 8); //cout<< "total run time for 1th column we_char size=8 -> " << colOp.getTotalfRunTime() << " msec"<< endl; colOp.deleteFile( fid); sleep(3); } void testCreateColumnFiles2() { ColumnOp colOp; Column curCol; int rc; OID fid = 20; m_session.txnid++; // file opertaions //colOp.startfTimer(); colOp.initColumn( curCol ); rc = colOp.createColumn( curCol, 0, 4, WriteEngine::INT, WriteEngine::WR_CHAR, (FID)fid ); //colOp.stopfTimer(); colOp.clearColumn( curCol ); //rc = m_wrapper.createColumn( m_session.txnid, fid, WriteEngine::INT, 4); //colOp.stopfTimer(); //cout<< "total run time for 2th column we_int size=4 -> " << colOp.getTotalfRunTime() << " msec"<< endl; CPPUNIT_ASSERT( rc == NO_ERROR ); colOp.deleteFile( fid); sleep(5); } void testCreateColumnFiles3() { ColumnOp colOp; Column curCol; int rc; OID fid = 30; m_session.txnid++; // file opertaions //colOp.startfTimer(); colOp.initColumn( curCol ); rc = colOp.createColumn( curCol, 0, 4, WriteEngine::CHAR, WriteEngine::WR_CHAR, (FID)fid ); colOp.clearColumn( curCol ); //colOp.stopfTimer(); //rc = m_wrapper.createColumn( m_session.txnid, fid, WriteEngine::CHAR, 4); //colOp.stopfTimer(); //cout<< "total run time for 3th column we_char size=4 -> " << colOp.getTotalfRunTime() << " msec"<< endl; CPPUNIT_ASSERT( rc == NO_ERROR ); colOp.deleteFile( fid); sleep(3); } void testCreateColumnFiles4() { ColumnOp colOp; Column curCol; int rc; OID fid = 40; m_session.txnid++; // file opertaions //colOp.startfTimer(); colOp.initColumn( curCol ); rc = colOp.createColumn( curCol, 0, 2, WriteEngine::SMALLINT, WriteEngine::WR_CHAR, (FID)fid ); colOp.clearColumn( curCol ); //rc = m_wrapper.createColumn( m_session.txnid, fid, WriteEngine::SMALLINT, 2 ); //colOp.stopfTimer(); //cout<< "total run time for 4th column we_smallint size=2 -> " << colOp.getTotalfRunTime() << " msec"<< endl; CPPUNIT_ASSERT( rc == NO_ERROR ); colOp.deleteFile( fid); } void testCreateFileMultipleBF() { FileOp fileop; ColumnOp colOp; char fileName[FILE_NAME_SIZE]; int rc, numOfBlock = 8192, allocSize = 8192; FILE* pFile; int t_diff; struct timeb t_start, t_current; OID fid = 600; uint64_t emptyVal = 0; int width = 4; rc = fileop.oid2FileName( fid, fileName, true ) ; emptyVal = colOp.getEmptyRowValue( WriteEngine::INT, width); int multiple = 1; int writeSize = multiple * BYTE_PER_BLOCK; unsigned char writeBuf[writeSize]; BRMWrapper::getInstance()->allocateExtent( (const OID)fid, numOfBlock, allocSize ); pFile = fopen( fileName, "w+b" ); if ( pFile != NULL ) { fileop.setEmptyBuf( writeBuf, writeSize, emptyVal, width ); //setvbuf(pFile , NULL, _IONBF, 0 ); int loopSize = numOfBlock / multiple; ftime(&t_start); for ( int i = 0; i < loopSize; i++ ) { fwrite( writeBuf, writeSize, 1, pFile ); } ftime(&t_current); t_diff = (int) (1000.0 * (t_current.time - t_start.time) + (t_current.millitm - t_start.millitm)); cout << "total run time for create file 64MB with writesize= " << writeSize << " byte" << "loop size=" << loopSize << " times" << " Time for Multiple Write 64MB with Buffer->we_int size=4 -> " << t_diff << " msec" << endl; fileop.closeFile( pFile ); } colOp.deleteFile( fid); } void testCreateFilelargerBF() { FileOp fileop; ColumnOp colOp; char fileName[FILE_NAME_SIZE]; int rc, numOfBlock = 8192, allocSize = 8192; FILE* pFile; int t_diff; struct timeb t_start, t_current; OID fid = 1600; uint64_t emptyVal = 0; int width = 4; rc = fileop.oid2FileName( fid, fileName, true ) ; emptyVal = colOp.getEmptyRowValue( WriteEngine::INT, width); int multiple = 1; int writeSize = multiple * BYTE_PER_BLOCK; unsigned char writeBuf[writeSize]; BRMWrapper::getInstance()->allocateExtent( (const OID)fid, numOfBlock, allocSize ); pFile = fopen( fileName, "w+b" ); if ( pFile != NULL ) { fileop.setEmptyBuf( writeBuf, writeSize, emptyVal, width ); setvbuf(pFile, NULL, _IOFBF, DEFAULT_BUFSIZ); //setvbuf(pFile , (char*)writeBuf, _IOFBF, writeSize/*DEFAULT_WRITE_BUFSIZE*/); int loopSize = allocSize / multiple; ftime(&t_start); for ( int i = 0; i < loopSize; i++ ) { fwrite( writeBuf, writeSize, 1, pFile ); } ftime(&t_current); t_diff = (int) (1000.0 * (t_current.time - t_start.time) + (t_current.millitm - t_start.millitm)); cout << "Buffer size =" << DEFAULT_BUFSIZ << endl; cout << "total run time for create file 64MB with writesize= " << writeSize << " byte" << "loop size=" << loopSize << " times" << " Time for Multiple Write 64MB with Buffer->we_int size=4 -> " << t_diff << " msec" << endl; fileop.closeFile( pFile ); } colOp.deleteFile( fid); } void testCreateFileMultipleIONBF() { FileOp fileop; ColumnOp colOp; char fileName[FILE_NAME_SIZE]; int rc, numOfBlock = 8192, allocSize = 8192; FILE* pFile; int t_diff; struct timeb t_start, t_current; OID fid = 400; uint64_t emptyVal = 0; int width = 4; rc = fileop.oid2FileName( fid, fileName, true ) ; emptyVal = colOp.getEmptyRowValue( WriteEngine::INT, width); int multiple = 128; int writeSize = multiple * BYTE_PER_BLOCK; unsigned char writeBuf[writeSize]; BRMWrapper::getInstance()->allocateExtent( (const OID)fid, numOfBlock, allocSize ); pFile = fopen( fileName, "w+b" ); if ( pFile != NULL ) { fileop.setEmptyBuf( writeBuf, writeSize, emptyVal, width ); setvbuf(pFile, NULL, _IONBF, 0 ); int loopSize = numOfBlock / multiple; ftime(&t_start); for ( int i = 0; i < loopSize; i++ ) { fwrite( writeBuf, writeSize, 1, pFile ); } ftime(&t_current); t_diff = (int) (1000.0 * (t_current.time - t_start.time) + (t_current.millitm - t_start.millitm)); cout << "total run time for create file 64MB with writesize= " << writeSize << " byte" << "loop size=" << loopSize << " times" << " Time for Multiple Write 64MB NO Buffer->we_int size=4 -> " << t_diff << " msec" << endl; fileop.closeFile( pFile ); } colOp.deleteFile( fid); } void testCreateFile64MBIONBF() { FileOp fileop; ColumnOp colOp; char fileName[FILE_NAME_SIZE]; int rc, numOfBlock = 8192, allocSize = 8192; FILE* pFile; int t_diff; struct timeb t_start, t_current; OID fid = 500; uint64_t emptyVal = 0; int width = 4; rc = fileop.oid2FileName( fid, fileName, true ) ; emptyVal = colOp.getEmptyRowValue( WriteEngine::INT, width); int multiple = 8192; int writeSize = multiple * BYTE_PER_BLOCK; unsigned char* writeBuf; BRMWrapper::getInstance()->allocateExtent( (const OID)fid, numOfBlock, allocSize ); pFile = fopen( fileName, "w+b" ); if ( pFile != NULL ) { writeBuf = new unsigned char[writeSize]; fileop.setEmptyBuf( writeBuf, writeSize, emptyVal, width ); setvbuf(pFile, NULL, _IONBF, 0 ); ftime(&t_start); fwrite( writeBuf, writeSize, 1, pFile ); ftime(&t_current); t_diff = (int) (1000.0 * (t_current.time - t_start.time) + (t_current.millitm - t_start.millitm)); cout << "total run time for create file Single Write 64MB NO Buffer->we_int size=4 -> " << t_diff << " msec" << endl; fileop.closeFile( pFile ); } colOp.deleteFile( fid); } void testCreateFileNoBRM() { FileOp fileop; ColumnOp colOp; char fileName[FILE_NAME_SIZE]; int rc, allocSize = 8192; OID fid = 401; uint64_t emptyVal = 0; //colOp.deleteFile( fid); //cout << "start time=" << colOp.t_start << " msec" << endl; rc = fileop.oid2FileName( fid, fileName, true ) ; emptyVal = colOp.getEmptyRowValue( WriteEngine::INT, 4); //colOp.startfTimer(); fileop.createFile( fileName, allocSize, emptyVal, 4 ); //colOp.stopfTimer(); //cout<<"stop time=" << colOp.t_current << " msec"<< endl; //cout<< "total run time for column NO BRM we_int size=4 -> " << colOp.getTotalfRunTime() << " msec"<< endl; colOp.deleteFile( fid); } void testSoloman() { char fileName[80] = "/usr/local/mariadb/columnstore/data1/test.dat"; char outfile[80] = "/usr/local/mariadb/columnstore/data1/out.dat"; int numOfBlock = 8192, blockSize = 8192; FILE* testFile; FILE* outFile; int t_diff; struct timeb t_start, t_current; int multiple = numOfBlock; int writeSize = multiple * blockSize; unsigned char* writeBuf; writeBuf = new unsigned char[writeSize]; memset(writeBuf, 0, writeSize); testFile = fopen( fileName, "w+b" ); outFile = fopen(outfile, "w"); if ( testFile != NULL ) { setvbuf(testFile, (char*)writeBuf, _IOFBF, writeSize); int loopSize = numOfBlock / multiple; ftime(&t_start); for ( int i = 0; i < loopSize; i++ ) { fwrite( writeBuf, writeSize, 1, testFile ); } ftime(&t_current); t_diff = (int) (1000.0 * (t_current.time - t_start.time) + (t_current.millitm - t_start.millitm)); char buff[256]; sprintf(buff, " create a 64MB file with writesize= %d byte", writeSize); fwrite(buff, strlen(buff), 1, outFile); sprintf(buff, " loop size = %d", loopSize); fwrite(buff, strlen(buff), 1, outFile); sprintf(buff, " Time for writing %d = %d msec", writeSize, t_diff); fwrite(buff, strlen(buff), 1, outFile); fclose( testFile ); fclose( outFile); } else fprintf(outFile, "FILE DOES NOT EXIST: %s", fileName); delete [] writeBuf; } }; CPPUNIT_TEST_SUITE_REGISTRATION( WriteEngineTest ); #include <cppunit/extensions/TestFactoryRegistry.h> #include <cppunit/ui/text/TestRunner.h> int main( int argc, char** argv) { CppUnit::TextUi::TestRunner runner; CppUnit::TestFactoryRegistry& registry = CppUnit::TestFactoryRegistry::getRegistry(); runner.addTest( registry.makeTest() ); bool wasSuccessful = runner.run( "", false ); return (wasSuccessful ? 0 : 1); }