diff --git a/sql/src/createdatabase.cpp b/sql/src/createdatabase.cpp index 5abf88b..f822a97 100644 --- a/sql/src/createdatabase.cpp +++ b/sql/src/createdatabase.cpp @@ -457,7 +457,7 @@ Exit: { F_DbSystem dbSystem; - dbSystem.dbRemove( pszFilePath, pszDataDir, pszRflDir, TRUE); + dbSystem.dropDatabase( pszFilePath, pszDataDir, pszRflDir, TRUE); } } else if( uiRflToken) @@ -485,6 +485,8 @@ RCODE SQLStatement::processCreateDatabase( void) FLMUINT uiLanguageLen; SFLM_CREATE_OPTS createOpts; F_DbSystem dbSystem; + char szToken [MAX_SQL_TOKEN_SIZE + 1]; + FLMUINT uiTokenLineOffset; // SYNTAX: CREATE DATABASE databasename [CREATE_OPTIONS( =value,...)] @@ -533,42 +535,45 @@ RCODE SQLStatement::processCreateDatabase( void) // See if there are "CREATE_OPTIONS" - if (lineHasToken( "create_options")) + if (RC_BAD( rc = haveToken( "create_options", TRUE))) { - if (RC_BAD( rc = skipWhitespace( FALSE))) + if (rc == NE_SFLM_NOT_FOUND) + { + rc = NE_SFLM_OK; + } + else + { + goto Exit; + } + } + else + { + + // Left paren must follow "CREATE_OPTIONS" + + if (RC_BAD( rc = haveToken( "(", FALSE, SQL_ERR_EXPECTING_LPAREN))) { goto Exit; } - // Left paren must follow "CREATE_OPTIONS" - - if (lineHasToken( "(")) + if (RC_BAD( rc = getToken( szToken, sizeof( szToken), FALSE, + &uiTokenLineOffset))) { - setErrInfo( m_uiCurrLineNum, - m_uiCurrLineOffset, - SQL_ERR_EXPECTING_LPAREN, - m_uiCurrLineFilePos, - m_uiCurrLineBytes); - rc = RC_SET( NE_SFLM_INVALID_SQL); goto Exit; } + // See if the list of create options is empty. + + if (f_stricmp( szToken, ")") == 0) + { + goto Create_Database; + } + // Get all of the create options for (;;) { - if (RC_BAD( rc = skipWhitespace( FALSE))) - { - goto Exit; - } - - // See if we are at the end of the list of create options. - - if (lineHasToken( ")")) - { - break; - } - else if (lineHasToken( "data_dir")) + if (f_stricmp( szToken, "data_dir") == 0) { if (RC_BAD( rc = getUTF8String( TRUE, (FLMBYTE *)szDataDirName, sizeof( szDataDirName), @@ -577,7 +582,7 @@ RCODE SQLStatement::processCreateDatabase( void) goto Exit; } } - else if (lineHasToken( "rfl_dir")) + else if (f_stricmp( szToken, "rfl_dir") == 0) { if (RC_BAD( rc = getUTF8String( TRUE, (FLMBYTE *)szRflDirName, sizeof( szRflDirName), @@ -586,7 +591,7 @@ RCODE SQLStatement::processCreateDatabase( void) goto Exit; } } - else if (lineHasToken( "block_size")) + else if (f_stricmp( szToken, "block_size") == 0) { if (RC_BAD( rc = getUINT( TRUE, &createOpts.uiBlockSize))) { @@ -603,35 +608,35 @@ RCODE SQLStatement::processCreateDatabase( void) goto Exit; } } - else if (lineHasToken( "min_rfl_size")) + else if (f_stricmp( szToken, "min_rfl_size") == 0) { if (RC_BAD( rc = getUINT( TRUE, &createOpts.uiMinRflFileSize))) { goto Exit; } } - else if (lineHasToken( "max_rfl_size")) + else if (f_stricmp( szToken, "max_rfl_size") == 0) { if (RC_BAD( rc = getUINT( TRUE, &createOpts.uiMaxRflFileSize))) { goto Exit; } } - else if (lineHasToken( "keep_rfl")) + else if (f_stricmp( szToken, "keep_rfl") == 0) { if (RC_BAD( rc = getBool( TRUE, &createOpts.bKeepRflFiles))) { goto Exit; } } - else if (lineHasToken( "log_aborted_trans")) + else if (f_stricmp( szToken, "log_aborted_trans") == 0) { if (RC_BAD( rc = getBool( TRUE, &createOpts.bLogAbortedTransToRfl))) { goto Exit; } } - else if (lineHasToken( "language")) + else if (f_stricmp( szToken, "language") == 0) { if (RC_BAD( rc = getUTF8String( TRUE, (FLMBYTE *)szLanguage, sizeof( szLanguage), @@ -661,7 +666,7 @@ RCODE SQLStatement::processCreateDatabase( void) else { setErrInfo( m_uiCurrLineNum, - m_uiCurrLineOffset, + uiTokenLineOffset, SQL_ERR_INVALID_DB_CREATE_PARAM, m_uiCurrLineFilePos, m_uiCurrLineBytes); @@ -669,32 +674,41 @@ RCODE SQLStatement::processCreateDatabase( void) goto Exit; } - // Skip any white space + // Option must be followed by a comma or right paren - if (RC_BAD( rc = skipWhitespace( FALSE))) + if (RC_BAD( rc = getToken( szToken, sizeof( szToken), FALSE, + &uiTokenLineOffset))) { goto Exit; } - // See if we are at the end of the list of create options - - if (lineHasToken( ")")) + if (f_stricmp( szToken, ")") == 0) { break; } - else if (!lineHasToken( ",")) + else if (f_stricmp( szToken, ",") != 0) { setErrInfo( m_uiCurrLineNum, - m_uiCurrLineOffset, + uiTokenLineOffset, SQL_ERR_EXPECTING_COMMA, m_uiCurrLineFilePos, m_uiCurrLineBytes); rc = RC_SET( NE_SFLM_INVALID_SQL); goto Exit; } + + // Comma must be followed by the next option + + if (RC_BAD( rc = getToken( szToken, sizeof( szToken), FALSE, + &uiTokenLineOffset))) + { + goto Exit; + } } } +Create_Database: + if (m_pDb) { m_pDb->Release(); diff --git a/sql/src/createindex.cpp b/sql/src/createindex.cpp index 66fdf2e..2308030 100644 --- a/sql/src/createindex.cpp +++ b/sql/src/createindex.cpp @@ -51,6 +51,14 @@ RCODE F_Db::createIndex( const char * pszIndexOn; FLMUINT uiIndexOnLen; F_INDEX * pIndex; + FLMBOOL bStartedTrans = FALSE; + + // Make sure we are in an update transaction. + + if (RC_BAD( rc = checkTransaction( SFLM_UPDATE_TRANS, &bStartedTrans))) + { + goto Exit; + } // Create a new dictionary, if we don't already have one. @@ -421,8 +429,24 @@ RCODE F_Db::createIndex( } } + // Commit the transaction if we started it + + if (bStartedTrans) + { + bStartedTrans = FALSE; + if (RC_BAD( rc = transCommit())) + { + goto Exit; + } + } + Exit: + if (bStartedTrans) + { + transAbort(); + } + if (pRow) { pRow->ReleaseRow(); @@ -446,15 +470,21 @@ RCODE SQLStatement::processCreateIndex( FLMUINT uiTableNameLen; char szColumnName [MAX_SQL_NAME_LEN + 1]; FLMUINT uiColumnNameLen; + char szEncDefName [MAX_SQL_NAME_LEN + 1]; + FLMUINT uiEncDefNameLen; F_INDEX_COL_DEF * pIxColDef; F_INDEX_COL_DEF * pFirstIxColDef; F_INDEX_COL_DEF * pLastIxColDef; FLMUINT uiNumIxColumns; F_TABLE * pTable; F_INDEX * pIndex; + F_ENCDEF * pEncDef; + FLMUINT uiEncDefNum; F_COLUMN * pColumn; FLMBOOL bDone; FLMUINT uiFlags; + char szToken [MAX_SQL_TOKEN_SIZE + 1]; + FLMUINT uiTokenLineOffset; // If we are in a read transaction, we cannot do this operation @@ -465,6 +495,7 @@ RCODE SQLStatement::processCreateIndex( // SYNTAX: CREATE [UNIQUE] INDEX ON // ( [DESC], ...) + // [ABSPOS] [OFFLINE] [SUSPENDED] [ENCRYPT_WITH ] if (bUnique) { @@ -499,24 +530,11 @@ RCODE SQLStatement::processCreateIndex( // The keyword "ON" must follow - if (!lineHasToken( "on")) + if (RC_BAD( rc = haveToken( "on", FALSE, SQL_ERR_EXPECTING_ON))) { - setErrInfo( m_uiCurrLineNum, - m_uiCurrLineOffset, - SQL_ERR_EXPECTING_ON, - m_uiCurrLineFilePos, - m_uiCurrLineBytes); - rc = RC_SET( NE_SFLM_INVALID_SQL); goto Exit; } - // Whitespace must follow "ON" - - if (RC_BAD( rc = skipWhitespace( TRUE))) - { - goto Exit; - } - // Get the table name - must exist. if (RC_BAD( rc = getTableName( TRUE, szTableName, sizeof( szTableName), @@ -525,23 +543,10 @@ RCODE SQLStatement::processCreateIndex( goto Exit; } - // Skip any whitespace after the table name. - - if (RC_BAD( rc = skipWhitespace( FALSE))) - { - goto Exit; - } - // Left paren must follow table name - if (!lineHasToken( "(")) + if (RC_BAD( rc = haveToken( "(", FALSE, SQL_ERR_EXPECTING_LPAREN))) { - setErrInfo( m_uiCurrLineNum, - m_uiCurrLineOffset, - SQL_ERR_EXPECTING_LPAREN, - m_uiCurrLineFilePos, - m_uiCurrLineBytes); - rc = RC_SET( NE_SFLM_INVALID_SQL); goto Exit; } @@ -553,11 +558,6 @@ RCODE SQLStatement::processCreateIndex( for (;;) { - if (RC_BAD( rc = skipWhitespace( FALSE))) - { - goto Exit; - } - // Get the column name if (RC_BAD( rc = getName( szColumnName, sizeof( szColumnName), @@ -609,34 +609,21 @@ RCODE SQLStatement::processCreateIndex( bDone = FALSE; for (;;) { - if (lineHasToken( ",")) - { - break; - } - if (lineHasToken( ")")) - { - bDone = TRUE; - break; - } - - // Better be whitespace, followed by a valid keyword or a comma - // or a right paren. - - if (RC_BAD( rc = skipWhitespace( TRUE))) + if (RC_BAD( rc = getToken( szToken, sizeof( szToken), FALSE, + &uiTokenLineOffset))) { goto Exit; } - - if (lineHasToken( ",")) + if (f_stricmp( szToken, ",") == 0) { break; } - if (lineHasToken( ")")) + else if (f_stricmp( szToken, ")") == 0) { bDone = TRUE; break; } - if (lineHasToken( SFLM_VALUE_OPTION_STR)) + else if (f_stricmp( szToken, SFLM_VALUE_OPTION_STR) == 0) { if ((pIxColDef->uiFlags & (ICD_VALUE | ICD_EACHWORD | ICD_PRESENCE | ICD_METAPHONE | ICD_SUBSTRING))) @@ -652,7 +639,7 @@ Multiple_Ix_Options: } pIxColDef->uiFlags |= ICD_VALUE; } - else if (lineHasToken( SFLM_EACHWORD_OPTION_STR)) + else if (f_stricmp( szToken, SFLM_EACHWORD_OPTION_STR) == 0) { if ((pIxColDef->uiFlags & (ICD_VALUE | ICD_EACHWORD | ICD_PRESENCE | ICD_METAPHONE | ICD_SUBSTRING))) @@ -672,7 +659,7 @@ Invalid_Ix_Option: } pIxColDef->uiFlags |= ICD_EACHWORD; } - else if (lineHasToken( SFLM_PRESENCE_OPTION_STR)) + else if (f_stricmp( szToken, SFLM_PRESENCE_OPTION_STR) == 0) { if ((pIxColDef->uiFlags & (ICD_VALUE | ICD_EACHWORD | ICD_PRESENCE | ICD_METAPHONE | ICD_SUBSTRING))) @@ -681,7 +668,7 @@ Invalid_Ix_Option: } pIxColDef->uiFlags |= ICD_PRESENCE; } - else if (lineHasToken( SFLM_METAPHONE_OPTION_STR)) + else if (f_stricmp( szToken, SFLM_METAPHONE_OPTION_STR) == 0) { if ((pIxColDef->uiFlags & (ICD_VALUE | ICD_EACHWORD | ICD_PRESENCE | ICD_METAPHONE | ICD_SUBSTRING))) @@ -694,7 +681,7 @@ Invalid_Ix_Option: } pIxColDef->uiFlags |= ICD_METAPHONE; } - else if (lineHasToken( SFLM_SUBSTRING_OPTION_STR)) + else if (f_stricmp( szToken, SFLM_SUBSTRING_OPTION_STR) == 0) { if ((pIxColDef->uiFlags & (ICD_VALUE | ICD_EACHWORD | ICD_PRESENCE | ICD_METAPHONE | ICD_SUBSTRING))) @@ -707,25 +694,25 @@ Invalid_Ix_Option: } pIxColDef->uiFlags |= ICD_SUBSTRING; } - else if (lineHasToken( SFLM_DESCENDING_OPTION_STR) || - lineHasToken( "desc")) + else if (f_stricmp( szToken, SFLM_DESCENDING_OPTION_STR) == 0 || + f_stricmp( szToken, "desc") == 0) { pIxColDef->uiFlags |= ICD_DESCENDING; } - else if (lineHasToken( SFLM_ASCENDING_OPTION_STR) || - lineHasToken( "asc")) + else if (f_stricmp( szToken, SFLM_ASCENDING_OPTION_STR) == 0 || + f_stricmp( szToken, "asc") == 0) { pIxColDef->uiFlags &= (~(ICD_DESCENDING)); } - else if (lineHasToken( SFLM_SORT_MISSING_HIGH_OPTION_STR)) + else if (f_stricmp( szToken, SFLM_SORT_MISSING_HIGH_OPTION_STR) == 0) { pIxColDef->uiFlags |= ICD_MISSING_HIGH; } - else if (lineHasToken( SFLM_SORT_MISSING_LOW_OPTION_STR)) + else if (f_stricmp( szToken, SFLM_SORT_MISSING_LOW_OPTION_STR) == 0) { pIxColDef->uiFlags &= (~(ICD_MISSING_HIGH)); } - else if (lineHasToken( SFLM_CASE_INSENSITIVE_OPTION_STR)) + else if (f_stricmp( szToken, SFLM_CASE_INSENSITIVE_OPTION_STR) == 0) { if (pColumn->eDataTyp != SFLM_STRING_TYPE) { @@ -733,7 +720,7 @@ Invalid_Ix_Option: } pIxColDef->uiCompareRules |= FLM_COMP_CASE_INSENSITIVE; } - else if (lineHasToken( SFLM_COMPRESS_WHITESPACE_OPTION_STR)) + else if (f_stricmp( szToken, SFLM_COMPRESS_WHITESPACE_OPTION_STR) == 0) { if (pColumn->eDataTyp != SFLM_STRING_TYPE) { @@ -741,7 +728,7 @@ Invalid_Ix_Option: } pIxColDef->uiCompareRules |= FLM_COMP_COMPRESS_WHITESPACE; } - else if (lineHasToken( SFLM_NO_WHITESPACE_OPTION_STR)) + else if (f_stricmp( szToken, SFLM_NO_WHITESPACE_OPTION_STR) == 0) { if (pColumn->eDataTyp != SFLM_STRING_TYPE) { @@ -749,7 +736,7 @@ Invalid_Ix_Option: } pIxColDef->uiCompareRules |= FLM_COMP_NO_WHITESPACE; } - else if (lineHasToken( SFLM_NOUNDERSCORE_OPTION_STR)) + else if (f_stricmp( szToken, SFLM_NOUNDERSCORE_OPTION_STR) == 0) { if (pColumn->eDataTyp != SFLM_STRING_TYPE) { @@ -757,7 +744,7 @@ Invalid_Ix_Option: } pIxColDef->uiCompareRules |= FLM_COMP_NO_UNDERSCORES; } - else if (lineHasToken( SFLM_NODASH_OPTION_STR)) + else if (f_stricmp( szToken, SFLM_NODASH_OPTION_STR) == 0) { if (pColumn->eDataTyp != SFLM_STRING_TYPE) { @@ -765,7 +752,7 @@ Invalid_Ix_Option: } pIxColDef->uiCompareRules |= FLM_COMP_NO_DASHES; } - else if (lineHasToken( SFLM_WHITESPACE_AS_SPACE_STR)) + else if (f_stricmp( szToken, SFLM_WHITESPACE_AS_SPACE_STR) == 0) { if (pColumn->eDataTyp != SFLM_STRING_TYPE) { @@ -773,7 +760,7 @@ Invalid_Ix_Option: } pIxColDef->uiCompareRules |= FLM_COMP_WHITESPACE_AS_SPACE; } - else if (lineHasToken( SFLM_IGNORE_LEADINGSPACES_OPTION_STR)) + else if (f_stricmp( szToken, SFLM_IGNORE_LEADINGSPACES_OPTION_STR) == 0) { if (pColumn->eDataTyp != SFLM_STRING_TYPE) { @@ -781,7 +768,7 @@ Invalid_Ix_Option: } pIxColDef->uiCompareRules |= FLM_COMP_IGNORE_LEADING_SPACE; } - else if (lineHasToken( SFLM_IGNORE_TRAILINGSPACES_OPTION_STR)) + else if (f_stricmp( szToken, SFLM_IGNORE_TRAILINGSPACES_OPTION_STR) == 0) { if (pColumn->eDataTyp != SFLM_STRING_TYPE) { @@ -789,7 +776,7 @@ Invalid_Ix_Option: } pIxColDef->uiCompareRules |= FLM_COMP_IGNORE_TRAILING_SPACE; } - else if (lineHasToken( SFLM_LIMIT_OPTION_STR)) + else if (f_stricmp( szToken, SFLM_LIMIT_OPTION_STR) == 0) { if (pColumn->eDataTyp != SFLM_STRING_TYPE && pColumn->eDataTyp != SFLM_BINARY_TYPE) @@ -804,7 +791,7 @@ Invalid_Ix_Option: else { setErrInfo( m_uiCurrLineNum, - m_uiCurrLineOffset, + uiTokenLineOffset, SQL_ERR_INVALID_INDEX_OPTION, m_uiCurrLineFilePos, m_uiCurrLineBytes); @@ -835,11 +822,70 @@ Invalid_Ix_Option: } } + // See if there are any options for the index itself + + uiEncDefNum = 0; + for (;;) + { + if (RC_BAD( rc = getToken( szToken, sizeof( szToken), TRUE, + &uiTokenLineOffset))) + { + if (rc == NE_SFLM_EOF_HIT) + { + rc = NE_SFLM_OK; + break; + } + else + { + goto Exit; + } + } + + if (f_stricmp( szToken, "offline") == 0) + { + + // Ignore offline option if suspended was specified. + + if (!(uiFlags & IXD_SUSPENDED)) + { + uiFlags |= IXD_OFFLINE; + } + } + else if (f_stricmp( szToken, "suspended") == 0) + { + uiFlags &= (~(IXD_OFFLINE)); + uiFlags |= IXD_SUSPENDED; + } + else if (f_stricmp( szToken, "abspos") == 0) + { + uiFlags |= IXD_ABS_POS; + } + else if (f_stricmp( szToken, "encrypt_with") == 0) + { + if (RC_BAD( rc = getEncDefName( TRUE, szEncDefName, sizeof( szEncDefName), + &uiEncDefNameLen, &pEncDef))) + { + goto Exit; + } + uiEncDefNum = pEncDef->uiEncDefNum; + } + else + { + + // Move the line offset back to the beginning of the token + // so it can be processed by the next SQL statement in the + // stream. + + m_uiCurrLineOffset = uiTokenLineOffset; + break; + } + } + // Create the index. if (RC_BAD( rc = m_pDb->createIndex( pTable->uiTableNum, 0, - szIndexName, uiIndexNameLen, 0, uiFlags, - pFirstIxColDef, uiNumIxColumns))) + szIndexName, uiIndexNameLen, uiEncDefNum, + uiFlags, pFirstIxColDef, uiNumIxColumns))) { goto Exit; } diff --git a/sql/src/createtable.cpp b/sql/src/createtable.cpp index 22eb3ea..d6543d5 100644 --- a/sql/src/createtable.cpp +++ b/sql/src/createtable.cpp @@ -47,6 +47,14 @@ RCODE F_Db::createTable( FLMUINT uiLen; F_COLUMN_DEF * pColumnDef; FLMUINT uiColumnNum; + FLMBOOL bStartedTrans = FALSE; + + // Make sure we are in an update transaction. + + if (RC_BAD( rc = checkTransaction( SFLM_UPDATE_TRANS, &bStartedTrans))) + { + goto Exit; + } // Create a new dictionary, if we don't already have one. @@ -243,8 +251,24 @@ RCODE F_Db::createTable( goto Exit; } + // Commit the transaction if we started it + + if (bStartedTrans) + { + bStartedTrans = FALSE; + if (RC_BAD( rc = transCommit())) + { + goto Exit; + } + } + Exit: + if (bStartedTrans) + { + transAbort(); + } + if (pRow) { pRow->ReleaseRow(); @@ -258,10 +282,16 @@ Exit: //------------------------------------------------------------------------------ RCODE SQLStatement::getDataType( eDataType * peDataType, - FLMUINT * puiMax) + FLMUINT * puiMax, + FLMUINT * puiEncDefNum) { - RCODE rc = NE_SFLM_OK; - + RCODE rc = NE_SFLM_OK; + char szToken [MAX_SQL_TOKEN_SIZE + 1]; + FLMUINT uiTokenLineOffset; + char szEncDefName [MAX_SQL_NAME_LEN + 1]; + FLMUINT uiEncDefNameLen; + F_ENCDEF * pEncDef; + // Leading whitespace has already been skipped // Valid data types are: @@ -278,68 +308,56 @@ RCODE SQLStatement::getDataType( // varbinary(n) // long varbinary - if (lineHasToken( "char") || - lineHasToken( "varchar") || - lineHasToken( "varwchar")) + if (RC_BAD( rc = getToken( szToken, sizeof( szToken), FALSE, + &uiTokenLineOffset))) { - if (RC_BAD( rc = skipWhitespace( FALSE))) + goto Exit; + } + + if (f_stricmp( szToken, "char") == 0 || + f_stricmp( szToken, "varchar") == 0 || + f_stricmp( szToken, "varwchar") == 0) + { + if (RC_BAD( rc = haveToken( "(", FALSE, SQL_ERR_EXPECTING_LPAREN))) { goto Exit; } - if (!lineHasToken( "(")) - { - setErrInfo( m_uiCurrLineNum, - m_uiCurrLineOffset, - SQL_ERR_EXPECTING_LPAREN, - m_uiCurrLineFilePos, - m_uiCurrLineBytes); - rc = RC_SET( NE_SFLM_INVALID_SQL); - goto Exit; - } if (RC_BAD( rc = getUINT( FALSE, puiMax))) { goto Exit; } - if (RC_BAD( rc = skipWhitespace( FALSE))) + if (RC_BAD( rc = haveToken( ")", FALSE, SQL_ERR_EXPECTING_RPAREN))) { goto Exit; } - if (!lineHasToken( ")")) - { - setErrInfo( m_uiCurrLineNum, - m_uiCurrLineOffset, - SQL_ERR_EXPECTING_RPAREN, - m_uiCurrLineFilePos, - m_uiCurrLineBytes); - rc = RC_SET( NE_SFLM_INVALID_SQL); - goto Exit; - } *peDataType = SFLM_STRING_TYPE; } - else if (lineHasToken( "longvarchar") || - lineHasToken( "longwvarchar")) + else if (f_stricmp( szToken, "longvarchar") == 0 || + f_stricmp( szToken, "longwvarchar") == 0) { *peDataType = SFLM_STRING_TYPE; *puiMax = 0; } - else if (lineHasToken( "longvarbinary")) + else if (f_stricmp( szToken, "longvarbinary") == 0) { *peDataType = SFLM_BINARY_TYPE; *puiMax = 0; } - else if (lineHasToken( "long")) + else if (f_stricmp( szToken, "long") == 0) { - if (RC_BAD( rc = skipWhitespace( TRUE))) + if (RC_BAD( rc = getToken( szToken, sizeof( szToken), FALSE, + &uiTokenLineOffset))) { goto Exit; } - if (lineHasToken( "varchar") || - lineHasToken( "varwchar")) + + if (f_stricmp( szToken, "varchar") == 0 || + f_stricmp( szToken, "varwchar") == 0) { *peDataType = SFLM_STRING_TYPE; *puiMax = 0; } - else if (lineHasToken( "varbinary")) + else if (f_stricmp( szToken, "varbinary") == 0) { *peDataType = SFLM_BINARY_TYPE; *puiMax = 0; @@ -349,55 +367,35 @@ RCODE SQLStatement::getDataType( goto Invalid_Data_Type; } } - else if (lineHasToken( "smallint") || - lineHasToken( "integer") || - lineHasToken( "tinyint") || - lineHasToken( "bigint")) + else if (f_stricmp( szToken, "smallint") == 0 || + f_stricmp( szToken, "integer") == 0 || + f_stricmp( szToken, "tinyint") == 0 || + f_stricmp( szToken, "bigint") == 0) { *peDataType = SFLM_NUMBER_TYPE; } - else if (lineHasToken( "binary") || - lineHasToken( "varbinary")) + else if (f_stricmp( szToken, "binary") == 0 || + f_stricmp( szToken, "varbinary") == 0) { - if (RC_BAD( rc = skipWhitespace( FALSE))) + if (RC_BAD( rc = haveToken( "(", FALSE, SQL_ERR_EXPECTING_LPAREN))) { goto Exit; } - if (!lineHasToken( "(")) - { - setErrInfo( m_uiCurrLineNum, - m_uiCurrLineOffset, - SQL_ERR_EXPECTING_LPAREN, - m_uiCurrLineFilePos, - m_uiCurrLineBytes); - rc = RC_SET( NE_SFLM_INVALID_SQL); - goto Exit; - } if (RC_BAD( rc = getUINT( FALSE, puiMax))) { goto Exit; } - if (RC_BAD( rc = skipWhitespace( FALSE))) + if (RC_BAD( rc = haveToken( ")", FALSE, SQL_ERR_EXPECTING_RPAREN))) { goto Exit; } - if (!lineHasToken( ")")) - { - setErrInfo( m_uiCurrLineNum, - m_uiCurrLineOffset, - SQL_ERR_EXPECTING_RPAREN, - m_uiCurrLineFilePos, - m_uiCurrLineBytes); - rc = RC_SET( NE_SFLM_INVALID_SQL); - goto Exit; - } *peDataType = SFLM_BINARY_TYPE; } else { Invalid_Data_Type: setErrInfo( m_uiCurrLineNum, - m_uiCurrLineOffset, + uiTokenLineOffset, SQL_ERR_INVALID_DATA_TYPE, m_uiCurrLineFilePos, m_uiCurrLineBytes); @@ -405,6 +403,29 @@ Invalid_Data_Type: goto Exit; } + // See if they specified any encryption. + + if (RC_BAD( rc = haveToken( "encrypt_with", FALSE))) + { + if (rc == NE_SFLM_NOT_FOUND) + { + rc = NE_SFLM_OK; + } + else + { + goto Exit; + } + } + else + { + if (RC_BAD( rc = getEncDefName( TRUE, szEncDefName, sizeof( szEncDefName), + &uiEncDefNameLen, &pEncDef))) + { + goto Exit; + } + *puiEncDefNum = pEncDef->uiEncDefNum; + } + Exit: return( rc); } @@ -421,12 +442,18 @@ RCODE SQLStatement::processCreateTable( void) FLMUINT uiTableNameLen; char szColumnName [MAX_SQL_NAME_LEN + 1]; FLMUINT uiColumnNameLen; + char szEncDefName [MAX_SQL_NAME_LEN + 1]; + FLMUINT uiEncDefNameLen; char * pszTmp; F_COLUMN_DEF * pColumnDef; F_COLUMN_DEF * pFirstColDef; F_COLUMN_DEF * pLastColDef; FLMUINT uiNumColumnDefs; F_TABLE * pTable; + F_ENCDEF * pEncDef; + FLMUINT uiEncDefNum; + char szToken [MAX_SQL_TOKEN_SIZE + 1]; + FLMUINT uiTokenLineOffset; // If we are in a read transaction, we cannot do this operation @@ -436,6 +463,7 @@ RCODE SQLStatement::processCreateTable( void) } // SYNTAX: CREATE TABLE ( ] // Whitespace must follow the "CREATE TABLE" @@ -452,23 +480,10 @@ RCODE SQLStatement::processCreateTable( void) goto Exit; } - // Skip any whitespace after the table name. - - if (RC_BAD( rc = skipWhitespace( FALSE))) - { - goto Exit; - } - // Left paren must follow table name - if (!lineHasToken( "(")) + if (RC_BAD( rc = haveToken( "(", FALSE, SQL_ERR_EXPECTING_LPAREN))) { - setErrInfo( m_uiCurrLineNum, - m_uiCurrLineOffset, - SQL_ERR_EXPECTING_LPAREN, - m_uiCurrLineFilePos, - m_uiCurrLineBytes); - rc = RC_SET( NE_SFLM_INVALID_SQL); goto Exit; } @@ -479,10 +494,6 @@ RCODE SQLStatement::processCreateTable( void) uiNumColumnDefs = 0; for (;;) { - if (RC_BAD( rc = skipWhitespace( FALSE))) - { - goto Exit; - } // Get the column name @@ -534,7 +545,8 @@ RCODE SQLStatement::processCreateTable( void) // Data type must follow if (RC_BAD( rc = getDataType( &pColumnDef->eColumnDataType, - &pColumnDef->uiMaxLen))) + &pColumnDef->uiMaxLen, + &pColumnDef->uiEncDefNum))) { goto Exit; } @@ -546,13 +558,19 @@ RCODE SQLStatement::processCreateTable( void) goto Exit; } + if (RC_BAD( rc = getToken( szToken, sizeof( szToken), FALSE, + &uiTokenLineOffset))) + { + goto Exit; + } + // See if we are at the end of the list of columns - if (lineHasToken( ")")) + if (f_stricmp( szToken, ")") == 0) { break; } - else if (!lineHasToken( ",")) + else if (f_stricmp( szToken, ",") != 0) { setErrInfo( m_uiCurrLineNum, m_uiCurrLineOffset, @@ -564,10 +582,34 @@ RCODE SQLStatement::processCreateTable( void) } } + // See if an encryption definition was specified + + uiEncDefNum = 0; + if (RC_BAD( rc = haveToken( "encrypt_with", TRUE))) + { + if (rc == NE_SFLM_NOT_FOUND || rc == NE_SFLM_EOF_HIT) + { + rc = NE_SFLM_OK; + } + else + { + goto Exit; + } + } + else + { + if (RC_BAD( rc = getEncDefName( TRUE, szEncDefName, sizeof( szEncDefName), + &uiEncDefNameLen, &pEncDef))) + { + goto Exit; + } + uiEncDefNum = pEncDef->uiEncDefNum; + } + // Create the table - if (RC_BAD( rc = m_pDb->createTable( 0, szTableName, uiTableNameLen, 0, - pFirstColDef, uiNumColumnDefs))) + if (RC_BAD( rc = m_pDb->createTable( 0, szTableName, uiTableNameLen, + uiEncDefNum, pFirstColDef, uiNumColumnDefs))) { goto Exit; }