diff options
Diffstat (limited to 'src/sql/xbdrpix.cpp')
-rwxr-xr-x | src/sql/xbdrpix.cpp | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/src/sql/xbdrpix.cpp b/src/sql/xbdrpix.cpp new file mode 100755 index 0000000..9e3bc3b --- /dev/null +++ b/src/sql/xbdrpix.cpp @@ -0,0 +1,143 @@ +/* xbdrpix.cpp + +XBase64 Software Library + +Copyright (c) 1997,2003,2014,2022 Gary A Kunkel + +The xb64 software library is covered under the terms of the GPL Version 3, 2007 license. + +Email Contact: + + XDB-devel@lists.sourceforge.net + XDB-users@lists.sourceforge.net + +*/ + +#include "xbase.h" + +#ifdef XB_SQL_SUPPORT + +namespace xb{ + + +/***********************************************************************/ +xbInt16 xbSql::SqlDropIndex( const xbString &sCmdLine ){ + + // std::cout << "DROP INDEX [" << sCmdLine << "]\n"; + + // expected format: + // DROP INDEX [IF EXISTS] ixname.ndx ON tablename.dbf + + + xbInt16 iRc = 0; + xbInt16 iErrorStop = 0; + xbString sTableName; + xbString sIxName; + xbUInt32 ulPos; + xbString sCmd = sCmdLine; + xbString sNode; + xbBool bIfExists = xbFalse; + xbDbf * dbf = NULL; + + try{ + + // drop off the first node "DROP" + ulPos = sCmd.Pos( ' ' ); + sCmd.Ltrunc( ulPos ); + sCmd.Ltrim(); + + // drop off the second node "INDEX" + ulPos = sCmd.Pos( ' ' ); + sCmd.Ltrunc( ulPos ); + sCmd.Ltrim(); + + sNode.ExtractElement( sCmd, ' ', 1, 0 ); + sNode.Trim(); + sNode.ToUpperCase(); + + if( sNode == "IF" ){ + ulPos = sCmd.Pos( ' ' ); + sCmd.Ltrunc( ulPos ); + sCmd.Ltrim(); + sNode.ExtractElement( sCmd, ' ', 1, 0 ); + sNode.Trim(); + sNode.ToUpperCase(); + if( sNode != "EXISTS" ){ + iErrorStop = 10; + iRc = XB_SYNTAX_ERROR; + throw iRc; + } else { + ulPos = sCmd.Pos( ' ' ); + sCmd.Ltrunc( ulPos ); + sCmd.Ltrim(); + bIfExists = xbTrue; + } + } + + // get the index name + sIxName.ExtractElement( sCmd, ' ', 1, 0 ); + sIxName.Trim(); + + ulPos = sCmd.Pos( ' ' ); + sCmd.Ltrunc( ulPos ); + sCmd.Ltrim(); + + // go past "ON" + ulPos = sCmd.Pos( ' ' ); + sCmd.Ltrunc( ulPos ); + sCmd.Ltrim(); + + sTableName = sCmd; + sTableName.Trim(); + + xbFile fDbf( xbase ); + fDbf.SetFileName( sTableName ); + + // if not open, attempt to open it + dbf = xbase->GetDbfPtr( fDbf.GetFqFileName()); + if( !dbf ){ + if(( iRc = xbase->OpenHighestVersion( sTableName, "", &dbf )) != XB_NO_ERROR ){ + iErrorStop = 20; + throw iRc; + } + } + if( dbf == NULL ){ + iErrorStop = 40; + iRc = XB_FILE_NOT_FOUND; + throw iRc; + } + + #ifdef XB_LOCKING_SUPPORT + if(( iRc = dbf->LockTable( XB_LOCK )) != XB_NO_ERROR ){ + iErrorStop = 50; + throw iRc; + } + #endif // XB_LOCKING_SUPPORT + + iRc = dbf->DeleteTag( "NDX", sIxName ); + if( iRc == XB_FILE_NOT_FOUND && !bIfExists ){ + iErrorStop = 60; + throw( iRc ); + } else if( iRc != XB_NO_ERROR ){ + iErrorStop = 70; + throw iRc; + } + } + catch (xbInt16 iRc ){ + xbString sMsg; + sMsg.Sprintf( "xbSql::SqlDropIndex() Exception Caught. Error Stop = [%d] rc = [%d] table = [%s]", iErrorStop, iRc, sTableName.Str() ); + xbase->WriteLogMessage( sMsg.Str() ); + xbase->WriteLogMessage( GetErrorMessage( iRc )); + } + + #ifdef XB_LOCKING_SUPPORT + dbf->LockTable( XB_UNLOCK ); + #endif // XB_LOCKING_SUPPORT + + return iRc; +} + +/***********************************************************************/ +} /* namespace */ +#endif /* XB_SQL_SUPPORT */ + |