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
}