UNPKG

dynalite

Version:

An implementation of Amazon's DynamoDB built on LevelDB

95 lines (80 loc) 3.3 kB
var crypto = require('crypto') module.exports = function createTable(store, data, cb) { var key = data.TableName, tableDb = store.tableDb tableDb.lock(key, function(release) { cb = release(cb) tableDb.get(key, function(err) { if (err && err.name != 'NotFoundError') return cb(err) if (!err) { err = new Error err.statusCode = 400 err.body = { __type: 'com.amazonaws.dynamodb.v20120810#ResourceInUseException', message: '', } return cb(err) } data.TableArn = 'arn:aws:dynamodb:' + tableDb.awsRegion + ':' + tableDb.awsAccountId + ':table/' + data.TableName data.TableId = uuidV4() data.CreationDateTime = Date.now() / 1000 data.ItemCount = 0 if (!data.ProvisionedThroughput) { data.ProvisionedThroughput = {ReadCapacityUnits: 0, WriteCapacityUnits: 0} } data.ProvisionedThroughput.NumberOfDecreasesToday = 0 data.TableSizeBytes = 0 data.TableStatus = 'CREATING' if (data.BillingMode == 'PAY_PER_REQUEST') { data.BillingModeSummary = {BillingMode: 'PAY_PER_REQUEST'} data.TableThroughputModeSummary = {TableThroughputMode: 'PAY_PER_REQUEST'} delete data.BillingMode } if (data.LocalSecondaryIndexes) { data.LocalSecondaryIndexes.forEach(function(index) { index.IndexArn = 'arn:aws:dynamodb:' + tableDb.awsRegion + ':' + tableDb.awsAccountId + ':table/' + data.TableName + '/index/' + index.IndexName index.IndexSizeBytes = 0 index.ItemCount = 0 }) } if (data.GlobalSecondaryIndexes) { data.GlobalSecondaryIndexes.forEach(function(index) { index.IndexArn = 'arn:aws:dynamodb:' + tableDb.awsRegion + ':' + tableDb.awsAccountId + ':table/' + data.TableName + '/index/' + index.IndexName index.IndexSizeBytes = 0 index.ItemCount = 0 index.IndexStatus = 'CREATING' if (!index.ProvisionedThroughput) { index.ProvisionedThroughput = {ReadCapacityUnits: 0, WriteCapacityUnits: 0} } index.ProvisionedThroughput.NumberOfDecreasesToday = 0 }) } tableDb.put(key, data, function(err) { if (err) return cb(err) setTimeout(function() { // Shouldn't need to lock/fetch as nothing should have changed data.TableStatus = 'ACTIVE' if (data.GlobalSecondaryIndexes) { data.GlobalSecondaryIndexes.forEach(function(index) { index.IndexStatus = 'ACTIVE' }) } if (data.BillingModeSummary) { data.BillingModeSummary.LastUpdateToPayPerRequestDateTime = data.CreationDateTime } tableDb.put(key, data, function(err) { // eslint-disable-next-line no-console if (err && !/Database is not open/.test(err)) console.error(err.stack || err) }) }, store.options.createTableMs) cb(null, {TableDescription: data}) }) }) }) } function uuidV4() { var bytes = crypto.randomBytes(14).toString('hex') return bytes.slice(0, 8) + '-' + bytes.slice(8, 12) + '-4' + bytes.slice(13, 16) + '-' + bytes.slice(16, 20) + '-' + bytes.slice(20, 28) }