package org.xmlsh.aws; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.xml.stream.XMLStreamException; import net.sf.saxon.s9api.SaxonApiException; import org.xmlsh.aws.util.AWSDDBCommand; import org.xmlsh.core.CoreException; import org.xmlsh.core.Options; import org.xmlsh.core.OutputPort; import org.xmlsh.core.UnexpectedException; import org.xmlsh.core.XValue; import com.amazonaws.AmazonClientException; import com.amazonaws.services.dynamodbv2.model.AttributeValue; import com.amazonaws.services.dynamodbv2.model.ScanRequest; import com.amazonaws.services.dynamodbv2.model.ScanResult; import com.amazonaws.services.dynamodbv2.model.Select; public class ddbScan extends AWSDDBCommand { private int kLIMIT = 100; /** * @param args * @throws IOException */ @Override public int run(List<XValue> args) throws Exception { Options opts = getOptions(sTABLE_OPTIONS, sKEY_OPTIONS , sATTR_EXPR_OPTIONS , sCONSISTANT_OPTS , "limit:,filter=filter-expression:,select:,index-name:,key-condition-expression:,projection-expression:"); parseOptions(opts, args); args = opts.getRemainingArgs(); setSerializeOpts(this.getSerializeOpts(opts)); try { getDDBClient(opts); } catch (UnexpectedException e) { usage(e.getLocalizedMessage()); return 1; } int ret = -1; ret = scan(opts); return ret; } private int scan(Options opts) throws IOException, XMLStreamException, SaxonApiException, CoreException { String filterExpression = opts.getOptString("filter", null); ScanRequest scanRequest = new ScanRequest(). withTableName(opts.getOptStringRequired("table")). withExpressionAttributeNames(parseAttrNameExprs(opts)). withExpressionAttributeValues(parseAttrValueExprs(opts)); int userLimit = opts.getOptInt("limit", 0); if (userLimit > 0) scanRequest.setLimit(Math.min(userLimit, kLIMIT)); if( opts.hasOpt("index-name")) scanRequest.setIndexName( opts.getOptStringRequired("index-name")); if( opts.hasOpt("projection-expression")) scanRequest.setProjectionExpression( opts.getOptStringRequired("projection-expression")); if (filterExpression != null) scanRequest.setFilterExpression(filterExpression); if( opts.hasOpt("select")) scanRequest.setSelect(parseSelect(opts.getOptStringRequired("select"))); ArrayList<RequestMetrics> metrics = new ArrayList<RequestMetrics>(); Map<String, AttributeValue> exclusiveStartKey =null; boolean bStarted = false ; do { traceCall("scan"); if (exclusiveStartKey != null) scanRequest.setExclusiveStartKey(exclusiveStartKey); ScanResult result = null; try { result = mAmazon.scan(scanRequest); } catch (AmazonClientException e) { return handleException(e); } finally { if( bStarted ) endResult(); } if( ! bStarted ) bStarted = startResult(); metrics.add( new RequestMetrics(result.getCount(), result.getScannedCount(), result.getConsumedCapacity())); for( Map<String, AttributeValue> item : result.getItems() ){ writeItem(item); } exclusiveStartKey = result.getLastEvaluatedKey(); } while( exclusiveStartKey != null ); writeMetrics( metrics ); endResult(); return 0; } private Select parseSelect(String select) { return Select.fromValue(select.toUpperCase()); } }