UNPKG

3.15 kBJavaScriptView Raw
1var crypto = require('crypto')
2
3module.exports = function createTable(store, data, cb) {
4
5 var key = data.TableName, tableDb = store.tableDb
6
7 tableDb.lock(key, function(release) {
8 cb = release(cb)
9
10 tableDb.get(key, function(err) {
11 if (err && err.name != 'NotFoundError') return cb(err)
12 if (!err) {
13 err = new Error
14 err.statusCode = 400
15 err.body = {
16 __type: 'com.amazonaws.dynamodb.v20120810#ResourceInUseException',
17 message: '',
18 }
19 return cb(err)
20 }
21
22 data.TableArn = 'arn:aws:dynamodb:' + tableDb.awsRegion + ':' + tableDb.awsAccountId + ':table/' + data.TableName
23 data.TableId = uuidV4()
24 data.CreationDateTime = Date.now() / 1000
25 data.ItemCount = 0
26 if (!data.ProvisionedThroughput) {
27 data.ProvisionedThroughput = {ReadCapacityUnits: 0, WriteCapacityUnits: 0}
28 }
29 data.ProvisionedThroughput.NumberOfDecreasesToday = 0
30 data.TableSizeBytes = 0
31 data.TableStatus = 'CREATING'
32 if (data.BillingMode == 'PAY_PER_REQUEST') {
33 data.BillingModeSummary = {BillingMode: 'PAY_PER_REQUEST'}
34 data.TableThroughputModeSummary = {TableThroughputMode: 'PAY_PER_REQUEST'}
35 delete data.BillingMode
36 }
37 if (data.LocalSecondaryIndexes) {
38 data.LocalSecondaryIndexes.forEach(function(index) {
39 index.IndexArn = 'arn:aws:dynamodb:' + tableDb.awsRegion + ':' + tableDb.awsAccountId + ':table/' +
40 data.TableName + '/index/' + index.IndexName
41 index.IndexSizeBytes = 0
42 index.ItemCount = 0
43 })
44 }
45 if (data.GlobalSecondaryIndexes) {
46 data.GlobalSecondaryIndexes.forEach(function(index) {
47 index.IndexArn = 'arn:aws:dynamodb:' + tableDb.awsRegion + ':' + tableDb.awsAccountId + ':table/' +
48 data.TableName + '/index/' + index.IndexName
49 index.IndexSizeBytes = 0
50 index.ItemCount = 0
51 index.IndexStatus = 'CREATING'
52 index.ProvisionedThroughput.NumberOfDecreasesToday = 0
53 })
54 }
55
56 tableDb.put(key, data, function(err) {
57 if (err) return cb(err)
58
59 setTimeout(function() {
60
61 // Shouldn't need to lock/fetch as nothing should have changed
62 data.TableStatus = 'ACTIVE'
63 if (data.GlobalSecondaryIndexes) {
64 data.GlobalSecondaryIndexes.forEach(function(index) {
65 index.IndexStatus = 'ACTIVE'
66 })
67 }
68
69 if (data.BillingModeSummary) {
70 data.BillingModeSummary.LastUpdateToPayPerRequestDateTime = data.CreationDateTime
71 }
72
73 tableDb.put(key, data, function(err) {
74 // eslint-disable-next-line no-console
75 if (err && !/Database is not open/.test(err)) console.error(err.stack || err)
76 })
77
78 }, store.options.createTableMs)
79
80 cb(null, {TableDescription: data})
81 })
82 })
83 })
84
85}
86
87function uuidV4() {
88 var bytes = crypto.randomBytes(14).toString('hex')
89 return bytes.slice(0, 8) + '-' + bytes.slice(8, 12) + '-4' + bytes.slice(13, 16) + '-' +
90 bytes.slice(16, 20) + '-' + bytes.slice(20, 28)
91}