func()

in iot-onboarding-service/src/cloudrack-lambda-core/db/db.go [292:358]


func (dbc DBConfig) GetMany(records []DynamoRecord, data interface{}) error {
	//Dynamo db currently limits read batches to 100 items OR up to 16 MB of data,
	//https: //docs.aws.amazon.com/sdk-for-go/api/service/dynamodb/#DynamoDB.BatchGetItem
	batches := core.Chunk(InterfaceSlice(records), 100)
	for i, dataArray := range batches {

		log.Printf("DB> Batch %v fetching: %+v", i, dataArray)
		items := make([]map[string]*dynamodb.AttributeValue, len(dataArray), len(dataArray))
		for i, item := range dataArray {
			rec := item.(DynamoRecord)
			av := map[string]*dynamodb.AttributeValue{
				dbc.PrimaryKey: {
					S: aws.String(rec.Pk),
				},
			}
			if rec.Sk != "" {
				av[dbc.SortKey] = &dynamodb.AttributeValue{
					S: aws.String(rec.Sk),
				}
			}
			items[i] = av
		}

		bgii := &dynamodb.BatchGetItemInput{
			RequestItems: map[string]*dynamodb.KeysAndAttributes{
				dbc.TableName: &dynamodb.KeysAndAttributes{
					Keys: items,
				},
			},
		}
		log.Printf("DB> DynamoDB Batch Get rq %+v", bgii)

		bgio, err := dbc.DbService.BatchGetItem(bgii)
		if err != nil {
			if aerr, ok := err.(awserr.Error); ok {
				switch aerr.Code() {
				case dynamodb.ErrCodeProvisionedThroughputExceededException:
					fmt.Println(dynamodb.ErrCodeProvisionedThroughputExceededException, aerr.Error())
				case dynamodb.ErrCodeResourceNotFoundException:
					fmt.Println(dynamodb.ErrCodeResourceNotFoundException, aerr.Error())
				case dynamodb.ErrCodeItemCollectionSizeLimitExceededException:
					fmt.Println(dynamodb.ErrCodeItemCollectionSizeLimitExceededException, aerr.Error())
				case dynamodb.ErrCodeRequestLimitExceeded:
					fmt.Println(dynamodb.ErrCodeRequestLimitExceeded, aerr.Error())
				case dynamodb.ErrCodeInternalServerError:
					fmt.Println(dynamodb.ErrCodeInternalServerError, aerr.Error())
				default:
					fmt.Println(aerr.Error())
				}
			} else {
				// Print the error, cast err to awserr.Error to get the Code and
				// Message from an error.
				fmt.Println(err.Error())
			}
			return err
		}
		//log.Printf("DB> DynamoDB Batch Get rs %+v", bgio)
		err = dynamodbattribute.UnmarshalListOfMaps(bgio.Responses[dbc.TableName], data)
		if err != nil {
			fmt.Println("DB:GetMany> Error while unmarshalling")
			fmt.Println(err.Error())
			return err
		}
		//log.Printf("DB> DynamoDB Batch Get unmarchalled rs %+v", data)
	}
	return nil
}