📄 table.cpp
字号:
(
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 + -