///PD_TRACE_DECLARE_FUNCTION ( SDB__MTHDEFAULTGET, "mthDefaultGet" ) INT32 mthDefaultGet( const CHAR *fieldName, const bson::BSONElement &in, _mthSAction *action, bson::BSONElement &out ) { INT32 rc = SDB_OK ; PD_TRACE_ENTRY( SDB__MTHDEFAULTGET ) ; SDB_ASSERT( NULL != action, "can not be null" ) ; if ( !in.eoo() ) { out = in ; goto done ; } if ( action->getObj().isEmpty() ) { bson::BSONObjBuilder builder ; builder.appendAs( action->getValue(), fieldName ) ; bson::BSONObj obj = builder.obj() ; action->setObj( builder.obj() ) ; action->setValue( obj.getField( fieldName ) ) ; } out = action->getValue() ; done: PD_TRACE_EXITRC( SDB__MTHDEFAULTGET, rc ) ; return rc ; }
///PD_TRACE_DECLARE_FUNCTION ( SDB__MTHSLICEBUILD, "mthSliceBuild" ) INT32 mthSliceBuild( const CHAR *fieldName, const bson::BSONElement &e, _mthSAction *action, bson::BSONObjBuilder &builder ) { INT32 rc = SDB_OK ; PD_TRACE_ENTRY( SDB__MTHSLICEBUILD ) ; SDB_ASSERT( NULL != action, "can not be null" ) ; INT32 begin = 0 ; INT32 limit = -1 ; if ( e.eoo() ) { goto done ; } else if ( Array == e.type() ) { action->getSlicePair( begin, limit ) ; _mthSliceIterator i( e.embeddedObject(), begin, limit ) ; BSONArrayBuilder sliceBuilder( builder.subarrayStart( fieldName ) ) ; while ( i.more() ) { sliceBuilder.append( i.next() ) ; } sliceBuilder.doneFast() ; } else { builder.append( e ) ; } done: PD_TRACE_EXITRC( SDB__MTHSLICEBUILD, rc ) ; return rc ; }
///PD_TRACE_DECLARE_FUNCTION ( SDB__MTHRTRIMPARSER_PARSE, "_mthRTrimParser::parse" ) INT32 _mthRTrimParser::parse( const bson::BSONElement &e, _mthSAction &action ) const { INT32 rc = SDB_OK ; PD_TRACE_ENTRY(SDB__MTHRTRIMPARSER_PARSE ) ; #if defined (_DEBUG) if ( 0 != _name.compare( e.fieldName() ) ) { PD_LOG( PDERROR, "field name[%s] is not valid", e.fieldName() ) ; rc = SDB_INVALIDARG ; goto error ; } #endif if ( e.eoo() ) { PD_LOG( PDERROR, "invalid element" ) ; rc = SDB_INVALIDARG ; goto error ; } action.setAttribute( MTH_S_ATTR_PROJECTION ) ; action.setFunc( &mthRTrimBuild, &mthRTrimGet ) ; action.setName( _name.c_str() ) ; done: PD_TRACE_EXITRC( SDB__MTHRTRIMPARSER_PARSE, rc ) ; return rc ; error: goto done ; }
///PD_TRACE_DECLARE_FUNCTION ( SDB__MTHINCLUDEBUILD, "mthIncludeBuild" ) INT32 mthIncludeBuild( const CHAR *fieldName, const bson::BSONElement &e, _mthSAction *action, bson::BSONObjBuilder &builder ) { INT32 rc = SDB_OK ; PD_TRACE_ENTRY( SDB__MTHINCLUDEBUILD ) ; SDB_ASSERT( NULL != action, "can not be null" ) ; if ( !e.eoo() ) { builder.append( e ) ; } PD_TRACE_EXITRC( SDB__MTHINCLUDEBUILD, rc ) ; return rc ; }
///PD_TRACE_DECLARE_FUNCTION ( SDB__MTHDEFAULTBUILD, "mthDefaultBuild" ) INT32 mthDefaultBuild( const CHAR *fieldName, const bson::BSONElement &e, _mthSAction *action, bson::BSONObjBuilder &builder ) { INT32 rc = SDB_OK ; PD_TRACE_ENTRY( SDB__MTHDEFAULTBUILD ) ; SDB_ASSERT( NULL != action, "can not be null" ) ; if ( e.eoo() ) { builder.appendAs( action->getValue(), fieldName ) ; } else { builder.append( e ) ; } PD_TRACE_EXITRC( SDB__MTHDEFAULTBUILD, rc ) ; return rc ; }
///PD_TRACE_DECLARE_FUNCTION ( SDB__MTHINCLUDEPARSER_PARSE, "_mthIncludeParser::parse" ) INT32 _mthIncludeParser::parse( const bson::BSONElement &e, _mthSAction &action ) const { INT32 rc = SDB_OK ; PD_TRACE_ENTRY( SDB__MTHINCLUDEPARSER_PARSE ) ; SDB_ASSERT( !e.eoo(), "can not be eoo" ) ; if ( !e.isNumber() ) { PD_LOG( PDERROR, "invalid element type[%d]", e.type() ) ; rc = SDB_INVALIDARG ; goto error ; } #if defined (_DEBUG) if ( 0 != _name.compare( e.fieldName() ) ) { PD_LOG( PDERROR, "field name[%s] is not valid", e.fieldName() ) ; rc = SDB_INVALIDARG ; goto error ; } #endif action.setName( _name.c_str() ) ; if ( 0 == e.numberLong() ) { action.setAttribute( MTH_S_ATTR_EXCLUDE ) ; } else { action.setAttribute( MTH_S_ATTR_INCLUDE ) ; action.setFunc( &mthIncludeBuild, &mthIncludeGet ) ; } done: PD_TRACE_EXITRC( SDB__MTHINCLUDEPARSER_PARSE, rc ) ; return rc ; error: goto done ; }
///PD_TRACE_DECLARE_FUNCTION ( SDB__MTHSACTIONPARSER_GETACTION, "_mthSActionParser::getAction" ) INT32 _mthSActionParser::parse( const bson::BSONElement &e, _mthSAction &action ) const { INT32 rc = SDB_OK ; PD_TRACE_ENTRY( SDB__MTHSACTIONPARSER_GETACTION ) ; SDB_ASSERT( !e.eoo(), "can not be invalid" ) ; const CHAR *fieldName = e.fieldName() ; action.clear() ; if ( '$' != *fieldName ) { goto done ; } { PARSERS::const_iterator itr = _parsers.find( fieldName ) ; if ( _parsers.end() == itr ) { PD_LOG( PDERROR, "can not find the parser of action[%s]", fieldName ) ; rc = SDB_INVALIDARG ; goto error ; } rc = itr->second->parse( e, action ) ; if ( SDB_OK != rc ) { PD_LOG( PDERROR, "failed to parse action:%d", rc ) ; goto error ; } } done: PD_TRACE_EXITRC( SDB__MTHSACTIONPARSER_GETACTION, rc ) ; return rc ; error: goto done ; }