1 | var crypto = require('crypto')
|
2 |
|
3 | module.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 |
|
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 |
|
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 |
|
87 | function 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 | }
|