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

📄 table.cpp

📁 自编的一个SQL服务器,实现服务器的基本功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		(
        if( BPT.search( res, entry ) )
		{
			Message( (CString)"Using index \"" + attr.index_table[i] + ".bpt\"" );
			return;
		}
		)
	Message( "Using sequential search!" );
	CEntryAttr eattr = convert( equ.first );
	for_each_REC(
		if( CEntry( &REC, eattr ) == entry )
			res.AddTail( NO );  )
}

void CTable::search( RESULT& res, const STR_PAIR& bet1, const STR_PAIR& bet2 )
{
	IEtoE( bet1, entry1 );
	IEtoE( bet2, entry2 );
    for_each_BPT
		(
        if( BPT.search( res, entry1, entry2 ) )
		{
			Message( (CString)"Using index \"" + attr.index_table[i] + ".bpt\"" );
            return ;
		}
		)
	Message( "Using sequential search!" );
	CEntryAttr eattr = convert( bet1.first );
    for_each_REC(
        if( ( entry1 < CEntry( &REC, eattr ) || entry1 == CEntry( &REC, eattr ) ) &&
            ( CEntry( &REC, eattr ) < entry2 || CEntry( &REC, eattr ) == entry2 ) )
			res.AddTail( NO );  )
}

void CTable::concatenate( STR_PAIR& ret, const STR_PAIR& src )
{
	POSITION pos = src.first.GetHeadPosition();
	while( pos )
	{
		CString first = src.first.GetNext( pos );
		ret.first.AddTail( first );
	}

	pos = src.second.GetHeadPosition();
	while( pos )
	{
		CString second = src.second.GetNext( pos );
		ret.second.AddTail( second );
	}
}

void CTable::search( RESULT& res, const STR_PAIR& equ,
					 const STR_PAIR& bet1, const STR_PAIR& bet2 )
{
	IEtoE( equ, entry );
	IEtoE( bet1, entry1 );
	IEtoE( bet2, entry2 );

	STR_PAIR IE1, IE2;
	concatenate( IE1, equ );
	concatenate( IE1, bet1 );
	concatenate( IE2, equ );
	concatenate( IE2, bet2 );
	
	IEtoE( IE1, E1 );
	IEtoE( IE2, E2 );
    for_each_BPT
		(
        if( BPT.search( res, E1, E2 ) )
		{
			Message( (CString)"Using index \"" + attr.index_table[i] + ".bpt\"" );
            return ;
		}
		)

	Message( "Using sequential search!" );
	CEntryAttr eattr = convert( equ.first );
	CEntryAttr eattr1 = convert( bet1.first );
	for_each_REC(
		if( ( CEntry( &REC, eattr ) == entry ) &&
			( entry1 < CEntry( &REC, eattr1 ) || entry1 == CEntry( &REC, eattr1 ) ) &&
            ( CEntry( &REC, eattr1 ) < entry2 || CEntry( &REC, eattr1 ) == entry2 ) )
			res.AddTail( NO );  )
}

void CTable::select( const RESULT& RES, const STR_LIST& name_list )
{
    CEntryAttr sattr = convert( name_list );

	CMiniSQLApp* pApp = (CMiniSQLApp* )AfxGetApp();

	CDocTemplate* curTemplate = pApp->OnSelect();
	POSITION pos = curTemplate->GetFirstDocPosition();
	CSelDoc* pDoc;
	while( pos )
		pDoc = (CSelDoc* )curTemplate->GetNextDoc( pos );
	ASSERT( pDoc );

	pos = pDoc->GetFirstViewPosition();
	CSelView* pView = (CSelView* )pDoc->GetNextView( pos );
	ASSERT( pView );
	pView->InsertCol( sattr );

    for_each_RES(
        CEntry   SREC( &REC, sattr );
		pView->InsertItem( SREC );  )
}

void CTable::remove( const RESULT& RES )
{
	for_each_BPT( for_each_RES( BPT.remove( REC, NO ); ) )
	for( int i = RES.GetCount() - 1; i >= 0; i-- )
		tableAPI->RemoveRec( RES.GetAt( RES.FindIndex(i) ) );
}

void CTable::update( const RESULT& RES, const STR_PAIR& set )
{
	for_each_BPT( for_each_RES( BPT.remove( REC, NO ); ) )
	for_each_RES(
		convert( REC, set );
		tableAPI->WriteRec( NO, &REC );
		)
	for_each_BPT( for_each_RES( BPT.insert( REC, NO ); ) )
}

void CTable::create_index( const char* iname, const STR_LIST& kname, bool dup )
{
    insert_index( iname );
    CBPTree new_bpt( iname, convert( kname ), dup );
    for_each_REC( new_bpt.insert( REC, NO ); )
}

void CTable::drop_index( const char* iname )
{
    remove_index( iname );
    CFileAPI( iname, ".bpt" ).Drop();
    CFileAPI( iname, ".bkt" ).Drop();
}

void CTable::insert_index( const char* iname )
{
    if( attr.index_num == INDEX_NUM - 1 )
        throw Error( ERROR_INDEX_LIMIT, INDEX_NUM, _T("") );
    if( find_index( iname ) != -1 )
        throw Error( ERROR_INDEX_EXIST, 0, iname );
    strncpy( attr.index_table[ attr.index_num ], iname, MAIN_NAME_LEN );
    attr.index_table[ attr.index_num++ ][ MAIN_NAME_LEN ] = '\0';
}

void CTable::remove_index( const char* iname )
{
    int i;
    if( ( i = find_index( iname ) ) == -1 )
        throw Error( ERROR_INDEX_NOT_EXIST, 0, iname );
    for( ; i < attr.index_num - 1; ++i )
        strncpy( attr.index_table[i], attr.index_table[i+1], MAIN_NAME_LEN + 1 );
    attr.index_num--;
}

int CTable::find_index( const char* iname )
{
    int i;
    for( i = attr.index_num - 1; i >= 0; i-- )
        if( !strncmp( iname, attr.index_table[i], MAIN_NAME_LEN ) )
            break;
    return i;
}

///////////////////////////////////////////////////////////////
// socket use

void CTable::search( RESULT& res, CClientSocket* pSocket, CServerDoc* pDoc )
{
	CString temp( "<READ " );
	temp += m_tname + "> :\r\n\tUsing sequential search!";
	pDoc->Message( temp );

	CMsg msg( SEL_START );
	msg.m_msgList.AddTail( "Using sequential search!" );
	pDoc->SendMsg( pSocket, msg );

    for( long NO = tableAPI->FirstRec(); NO != -1; NO = tableAPI->NextRec(NO) )
		res.AddTail( NO );
}

void CTable::search( RESULT& res, const STR_PAIR& equ, CClientSocket* pSocket, CServerDoc* pDoc )
{
	CString temp( "<READ " );
	temp += m_tname + "> :\r\n\t";

	IEtoE( equ, entry );
    for_each_BPT
		(
        if( BPT.search( res, entry ) )
		{
			temp += (CString)"Using index \"" + attr.index_table[i] + ".bpt\"";
			pDoc->Message( temp );

			CMsg msg( SEL_START );
			msg.m_msgList.AddTail( (CString)"Using index \"" + attr.index_table[i] + ".bpt\"" );
			pDoc->SendMsg( pSocket, msg );

			return;
		}
		)

	temp += "Using sequential search!";
	pDoc->Message( temp );

	CMsg msg( SEL_START );
	msg.m_msgList.AddTail( "Using sequential search!" );
	pDoc->SendMsg( pSocket, msg );

	CEntryAttr eattr = convert( equ.first );
	for_each_REC(
		if( CEntry( &REC, eattr ) == entry )
			res.AddTail( NO );  )
}

void CTable::search( RESULT& res, const STR_PAIR& bet1, const STR_PAIR& bet2, CClientSocket* pSocket, CServerDoc* pDoc )
{
	CString temp( "<READ " );
	temp += m_tname + "> :\r\n\t";

	IEtoE( bet1, entry1 );
	IEtoE( bet2, entry2 );
    for_each_BPT
		(
        if( BPT.search( res, entry1, entry2 ) )
		{
			temp += (CString)"Using index \"" + attr.index_table[i] + ".bpt\"";
			pDoc->Message( temp );

			CMsg msg( SEL_START );
			msg.m_msgList.AddTail( (CString)"Using index \"" + attr.index_table[i] + ".bpt\"" );
			pDoc->SendMsg( pSocket, msg );

			return;
		}
		)

	temp += "Using sequential search!";
	pDoc->Message( temp );

	CMsg msg( SEL_START );
	msg.m_msgList.AddTail( "Using sequential search!" );
	pDoc->SendMsg( pSocket, msg );

	CEntryAttr eattr = convert( bet1.first );
    for_each_REC(
        if( ( entry1 < CEntry( &REC, eattr ) || entry1 == CEntry( &REC, eattr ) ) &&
            ( CEntry( &REC, eattr ) < entry2 || CEntry( &REC, eattr ) == entry2 ) )
			res.AddTail( NO );  )
}

void CTable::search( RESULT& res, const STR_PAIR& equ,
					 const STR_PAIR& bet1, const STR_PAIR& bet2, CClientSocket* pSocket, CServerDoc* pDoc )
{
	CString temp( "<READ " );
	temp += m_tname + "> :\r\n\t";

	IEtoE( equ, entry );
	IEtoE( bet1, entry1 );
	IEtoE( bet2, entry2 );

	STR_PAIR IE1, IE2;
	concatenate( IE1, equ );
	concatenate( IE1, bet1 );
	concatenate( IE2, equ );
	concatenate( IE2, bet2 );
	
	IEtoE( IE1, E1 );
	IEtoE( IE2, E2 );
    for_each_BPT
		(
        if( BPT.search( res, E1, E2 ) )
		{
			temp += (CString)"Using index \"" + attr.index_table[i] + ".bpt\"";
			pDoc->Message( temp );

			CMsg msg( SEL_START );
			msg.m_msgList.AddTail( (CString)"Using index \"" + attr.index_table[i] + ".bpt\"" );
			pDoc->SendMsg( pSocket, msg );

			return;
		}
		)

	temp += "Using sequential search!";
	pDoc->Message( temp );

	CMsg msg( SEL_START );
	msg.m_msgList.AddTail( "Using sequential search!" );
	pDoc->SendMsg( pSocket, msg );

	CEntryAttr eattr = convert( equ.first );
	CEntryAttr eattr1 = convert( bet1.first );
	for_each_REC(
		if( ( CEntry( &REC, eattr ) == entry ) &&
			( entry1 < CEntry( &REC, eattr1 ) || entry1 == CEntry( &REC, eattr1 ) ) &&
            ( CEntry( &REC, eattr1 ) < entry2 || CEntry( &REC, eattr1 ) == entry2 ) )
			res.AddTail( NO );  )
}

void CTable::select( const RESULT& RES, const STR_LIST& name_list, CClientSocket* pSocket, CServerDoc* pDoc )
{
    CEntryAttr sattr = convert( name_list );

	SendCol( sattr, pSocket, pDoc );

    for_each_RES(
        CEntry   SREC( &REC, sattr );
		SendItem( SREC, pSocket, pDoc );  )
}

void CTable::SendCol( CEntryAttr& attr, CClientSocket* pSocket, CServerDoc* pDoc )
{
	CMsg msg( SEL_COL );
	int count = attr.num;

	for( int i = 0; i < count; i++ )
	{
		msg.m_msgList.AddTail( attr.attr[i].name );
		CString len;
		len.Format( "%d", GetLength( attr.attr[i].type ) );
		msg.m_msgList.AddTail( len );
	}

	pDoc->SendMsg( pSocket, msg );
}

int CTable::GetLength( const CItemType& type )
{
	switch( type.id )
	{
	case _INT:
	case _LONG:
		return 40;
	case _FLOAT:
	case _DATE:
		return 80;
	case _STRING:
		return type.size * 7;
	default:
		throw Error( OUT_TYPE_ERROR, (int)type.id, CString("") );
	}
}

void CTable::SendItem( CEntry& entry, CClientSocket* pSocket, CServerDoc* pDoc )
{
	char	item[ 1024 ];
	int		count = entry.values();
	CMsg	msg( SEL_ITEM );

	for( int i = 0; i < count; i++ )
	{
		entry[i].out( item, 1024 );
		msg.m_msgList.AddTail( item );
	}

	pDoc->SendMsg( pSocket, msg );
}

⌨️ 快捷键说明

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