in dax/internal/client/response.go [489:597]
func decodeBatchWriteItemOutput(ctx context.Context, reader *cbor.Reader, keySchemaCache *lru.Lru, attrNamesListToId *lru.Lru, output *dynamodb.BatchWriteItemOutput) (*dynamodb.BatchWriteItemOutput, error) {
if output != nil {
output.UnprocessedItems = map[string][]types.WriteRequest{}
}
if consumed, err := consumeNil(reader); err != nil {
return output, err
} else if consumed {
return output, nil
}
numTables, err := reader.ReadMapLength()
if err != nil {
return output, err
}
if output == nil {
output = &dynamodb.BatchWriteItemOutput{UnprocessedItems: map[string][]types.WriteRequest{}}
}
if numTables > 0 {
unprocessed := make(map[string][]types.WriteRequest, numTables)
for i := 0; i < numTables; i++ {
table, err := reader.ReadString()
if err != nil {
return output, err
}
tableKeys, err := getKeySchema(ctx, keySchemaCache, table)
if err != nil {
return output, err
}
numObjs, err := reader.ReadArrayLength()
if err != nil {
return output, err
}
numItems := numObjs / 2
wrs := make([]types.WriteRequest, numItems)
for j := 0; j < numItems; j++ {
keys, err := decodeKey(reader, tableKeys)
if err != nil {
return output, err
}
item, err := decodeNonKeyAttributes(ctx, reader, attrNamesListToId, nil)
if err != nil {
return output, err
}
wr := types.WriteRequest{}
if item == nil {
wr.DeleteRequest = &types.DeleteRequest{Key: keys}
} else {
for k, v := range keys {
item[k] = v
}
wr.PutRequest = &types.PutRequest{Item: item}
}
wrs[j] = wr
}
unprocessed[table] = wrs
}
if len(unprocessed) != 0 {
output.UnprocessedItems = unprocessed
}
}
numCC, err := reader.ReadArrayLength()
if err != nil {
return output, err
}
if numCC > 0 {
output.ConsumedCapacity = make([]types.ConsumedCapacity, numCC)
for i := 0; i < numCC; i++ {
capacity, err := decodeConsumedCapacity(reader)
if err != nil {
return output, err
}
output.ConsumedCapacity[i] = *capacity
}
}
icmLen, err := reader.ReadMapLength()
if err != nil {
return output, err
}
if icmLen > 0 {
output.ItemCollectionMetrics = make(map[string][]types.ItemCollectionMetrics, icmLen)
for i := 0; i < icmLen; i++ {
table, err := reader.ReadString()
if err != nil {
return output, err
}
keys, err := getKeySchema(ctx, keySchemaCache, table)
if err != nil {
return output, err
}
pkey := *keys[0].AttributeName
numMetrics, err := reader.ReadArrayLength()
if err != nil {
return output, err
}
metrics := make([]types.ItemCollectionMetrics, numMetrics)
for j := 0; j < numMetrics; j++ {
itemCollectionMetric, err := decodeItemCollectionMetrics(reader, pkey)
if err != nil {
return output, err
}
metrics[j] = *itemCollectionMetric
}
output.ItemCollectionMetrics[table] = metrics
}
}
return output, nil
}