var fs = require('fs');
var awscli = require("../lib/awscli");
var DynamoDbScanStatement = require('../lib/dynamodb-scan-statement.js');
var DynamoDbQueryStatement = require('../lib/dynamodb-query-statement.js');
var DynamoDbPutItemStatement = require('../lib/dynamodb-put-item-statement.js');
var DynamoDbDeleteItemStatement = require('../lib/dynamodb-delete-item-statement.js');
/**
* AwsDynamoDB class.
* @constructor
*/
function AwsDynamoDB() { }
var DynamoDB = null;
/**
* Connect to the AWS.
* This connection will be set to the statement instances which
* this module will provides.
*
* @param {object} opts
* The object specifying destination to connect such as
* `{ accessKeyId: 'AKID', secretAccessKey: 'SECRET', region: 'us-west-2' }`.
* If this is omitted, the keys in local environment stored
* at '~/.aws/' is used.
*
* @returns {undefined}
*/
AwsDynamoDB.connect = function(opts) {
awscli.connect(opts);
DynamoDB = awscli.getService("DynamoDB");
};
/**
* DynamoDB.listTables
*
* @param {Function} callback Callback function
* @returns {undefined}
*/
AwsDynamoDB.listTables = function(callback) {
DynamoDB.listTables({ }, callback);
};
/**
* Describe a table definition
* @param {string} tableName Tabale name described
* @param {Function} callback callback to receive result.
* @returns {undefined}
*/
AwsDynamoDB.describeTable = function(tableName, callback) {
DynamoDB.describeTable({ TableName: tableName }, callback);
};
AwsDynamoDB.putCreateTableJson = function(filename) {
fs.readFile(filename, function(err, data) {
if(err) {
console.error("ERROR:", err);
return;
}
var desc = JSON.parse(data);
AwsDynamoDB.convertJsonTableDescToCreate(desc, function(err, data){
if(err) {
console.error("ERROR:", err);
return;
}
console.log(JSON.stringify(data, null, " "));
});
});
};
AwsDynamoDB.convertJsonTableDescToCreate = function(desc, callback) {
var create = desc.Table;
if(create.GlobalSecondaryIndexes) {
for(var i = 0; i < create.GlobalSecondaryIndexes.length; i++) {
delete create.GlobalSecondaryIndexes[i].IndexSizeBytes;
delete create.GlobalSecondaryIndexes[i].ProvisionedThroughput.NumberOfDecreasesToday;
delete create.GlobalSecondaryIndexes[i].ProvisionedThroughput.LastIncreaseDateTime;
delete create.GlobalSecondaryIndexes[i].ProvisionedThroughput.LastDecreaseDateTime;
delete create.GlobalSecondaryIndexes[i].IndexStatus;
delete create.GlobalSecondaryIndexes[i].IndexArn;
delete create.GlobalSecondaryIndexes[i].ItemCount;
}
}
delete create.TableArn;
delete create.ProvisionedThroughput.NumberOfDecreasesToday;
delete create.ProvisionedThroughput.LastIncreaseDateTime;
delete create.ProvisionedThroughput.LastDecreaseDateTime;
delete create.TableSizeBytes;
delete create.TableStatus;
delete create.LatestStreamLabel;
delete create.ItemCount;
delete create.CreationDateTime;
delete create.LatestStreamArn;
callback(null, create);
};
/**
* create DynamoDbScanStatement.
*
* SQL-ish Syntax:
*
* ```
* [SELECT <projection-expression>]
* FROM <table-name>
* [WHERE <filter-expression>]
* [LIMIT <limit>]
* ```
*
* * `[]` is representing that can be ommited.
* * `<projection-expression>` - The comma separated attribute names to select.
* * `<table-name>` - DynamoDB table name.
* * `<filter-expression>` - Filtering conditional expression.
* * `<limit>` - The number of items to scan.
*
* @param {string} sql SQL-ish statement
*
* @returns {DynamoDbScanStatement} SQL-ish Scan statement object
*/
AwsDynamoDB.ScanStatement = function(sql) {
var statement = new DynamoDbScanStatement(sql);
statement.dynamodb = DynamoDB;
return statement;
};
/**
* create DynamoDbQueryStatement.
*
* SQL-ish Syntax:
*
* ```
* [SELECT <projection-expression>]
* FROM <table-name>
* WHERE <key-condition-expression>
* [FILTER <filter-expression>]
* [LIMIT <limit>]
* ```
*
* * `[]` is representing that can be ommited.
* * `<projection-expression>` - The comma separated attribute names to select.
* * `<table-name>` - DynamoDB table name.
* * `<key-condition-expression>` - Primary key conditional expression.
* * `<filter-expression>` - Filtering conditional expression.
* * `<limit>` - The number of items to scan.
*
* @param {string} sql SQL-ish statement
*
* @returns {DynamoDbQueryStatement} SQL-ish Query statement object
*/
AwsDynamoDB.QueryStatement = function(sql) {
var statement = new DynamoDbQueryStatement(sql);
statement.dynamodb = DynamoDB;
return statement;
};
/**
* create DynamoDbPutItemStatement.
*
* SQL-ish Syntax:
*
* ```
* INSERT INTO <table-name> ( <attribute-list> )
* VALUES ( <value-list> )
* [WHERE <key-condition-expression>]
* ```
*
* * `[]` is representing that can be ommited.
* * `<table-name>` - DynamoDB table name.
* * `<attribute-list>` - The comma separated attribute names.
* * `<values-list>` - The comma separated attribute values.
* * `<key-condition-expression>` - Primary key conditional expression.
*
* @param {string} sql SQL-ish statement
*
* @returns {DynamoDbPutItemStatement} SQL-ish PutItem statement object
*/
AwsDynamoDB.PutItemStatement = function(sql) {
var statement = new DynamoDbPutItemStatement(sql);
statement.dynamodb = DynamoDB;
return statement;
};
/**
* create DynamoDbDeleteItemStatement.
*
* SQL-ish Syntax:
*
* ```
* DELETE FROM <table-name>
* [WHERE <key-condition-expression>]
* ```
*
* * `[]` is representing that can be ommited.
* * `<table-name>` - DynamoDB table name.
* * `<key-condition-expression>` - Primary key conditional expression.
*
* @param {string} sql SQL-ish statement
*
* @returns {DynamoDbDeleteItemStatement} SQL-ish DeleteItem statement object
*/
AwsDynamoDB.DeleteItemStatement = function(sql) {
var statement = new DynamoDbDeleteItemStatement(sql);
statement.dynamodb = DynamoDB;
return statement;
};
var parsers = require("../lib/dynamodb-sqlish-parser");
AwsDynamoDB.isKeyword = parsers.isKeyword;
module.exports = AwsDynamoDB;