bool Command::DoReadParam( void ) { Variable* var = mpVM->mVariables[ mObject ]; if( mpVM->mArgcRun <= mObject ) { var->AssignValue( mpExpr->get_Value() ); return true; } sqlite3_value* vl = mpVM->mpArgv[ mObject ]; switch( sqlite3_value_type( vl ) ) { case kDouble : var->AssignValue( sqlite3_value_double( vl ) ); break; case kInt : var->AssignValue( sqlite3_value_int( vl ) ); break; case kText : { const char* str = (const char*) sqlite3_value_text( vl ); wstring wstr; ConvertFromUTF8( str, strlen( str ), wstr ); var->AssignValue( wstr ); } break; default: var->AssignValue( Value() ); break; } return true; }
bool Command::DoFetch( void ) { // TODO: exceptions Cursor* cr = mpVM->mCursors[ mObject ]; // TODO: exception if( !cr->mpStmt || !cr->mpStatQ ) return true; cr->mpStatQ->ApplyBinds(); int res = sqlite3_step( cr->mpStmt ); bool step = ( res == SQLITE_ROW ); // Update %FOUND and %NOTFOUND properties cr->GetVarFound()->AssignValue( step ); cr->GetVarNotFound()->AssignValue( !step ); // TODO: exception if( !step ) return true; Value vl; // Read values from cursor int count = min<int>( mFields.size(), sqlite3_column_count( cr->mpStmt ) ); for( int i = 0 ; i < count ; ++i ) { Variable* var = mpVM->mVariables[ mFields[ i ] ]; ReadValue( cr->mpStmt, vl, i, var->mValue.mType ); var->AssignValue( vl ); } return true; }
Variable* AddGlobalVariable( const wstring& name, const Value& value ) { Variable* var = FindGlobalVariable( name ); if( var ) return var; var = new Variable; var->AssignValue( value ); gGlobalVariables[ name ] = var; return var; }