25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

107 lines
5.7KB

  1. ' Create the first local Access database. Refuses to overwrite an existing file.
  2. Option Explicit
  3. Dim fs, source, settings, dbPath, folder, catalog, db, sql, configPath
  4. Set fs = CreateObject("Scripting.FileSystemObject")
  5. source = fs.BuildPath(fs.GetParentFolderName(WScript.ScriptFullName), "common.vbs")
  6. ExecuteGlobal fs.OpenTextFile(source, 1).ReadAll
  7. If WScript.Arguments.Count > 1 Then StopWithError "Usage: init-db.vbs [config path]"
  8. configPath = ConfigFilePath()
  9. If WScript.Arguments.Count = 1 Then configPath = WScript.Arguments(0)
  10. On Error Resume Next
  11. Set settings = LoadConfig(configPath)
  12. If Err.Number <> 0 Then StopWithError "Configuration: " & Err.Description
  13. dbPath = ResolveDbPath(settings)
  14. If Err.Number <> 0 Then StopWithError "Database path: " & Err.Description
  15. On Error GoTo 0
  16. If fs.FileExists(dbPath) Then StopWithError "Database already exists: " & dbPath
  17. folder = fs.GetParentFolderName(dbPath)
  18. If Not fs.FolderExists(folder) Then CreateFolders folder
  19. On Error Resume Next
  20. Set catalog = CreateObject("ADOX.Catalog")
  21. catalog.Create "Provider=" & settings("DB_PROVIDER") & ";Data Source=" & dbPath & _
  22. ";Jet OLEDB:Engine Type=5;"
  23. If Err.Number <> 0 Then StopWithError "Cannot create MDB with " & settings("DB_PROVIDER") & _
  24. " in this script host: " & Err.Description
  25. Set catalog = Nothing
  26. Set db = CreateObject("ADODB.Connection")
  27. db.Open "Provider=" & settings("DB_PROVIDER") & ";Data Source=" & dbPath & ";"
  28. If Err.Number <> 0 Then StopWithError "Cannot open new MDB: " & Err.Description
  29. On Error GoTo 0
  30. RunSql "CREATE TABLE [AppMeta] ([SchemaVersion] INTEGER NOT NULL, [CreatedAtUtc] DATETIME)"
  31. RunSql "CREATE TABLE [Contact] ([Id] COUNTER CONSTRAINT [pkContact] PRIMARY KEY, " & _
  32. "[EmailOriginal] TEXT(254) NOT NULL, [EmailKey] TEXT(254) NOT NULL, " & _
  33. "[BusinessName] TEXT(200), [SourceReference] MEMO, [AcquiredAtUtc] DATETIME, " & _
  34. "[Country] TEXT(2), [EligibilityBasis] TEXT(100), [CreatedAtUtc] DATETIME)"
  35. RunSql "CREATE TABLE [Suppression] ([EmailKey] TEXT(254) NOT NULL, [Reason] TEXT(40) NOT NULL, " & _
  36. "[RecordedAtUtc] DATETIME, [EvidenceReference] MEMO)"
  37. RunSql "CREATE TABLE [TemplateVersion] ([Id] COUNTER CONSTRAINT [pkTemplateVersion] PRIMARY KEY, " & _
  38. "[TemplateName] TEXT(200) NOT NULL, [VersionNumber] INTEGER NOT NULL, " & _
  39. "[HtmlContent] MEMO NOT NULL, [ContentHash] TEXT(64), [ImportedAtUtc] DATETIME, " & _
  40. "[ValidationStatus] TEXT(30))"
  41. RunSql "CREATE TABLE [TemplateImage] ([Id] COUNTER CONSTRAINT [pkTemplateImage] PRIMARY KEY, " & _
  42. "[TemplateVersionId] INTEGER NOT NULL, [OriginalRelativePath] TEXT(255) NOT NULL, " & _
  43. "[ContentType] TEXT(40) NOT NULL, [ContentHash] TEXT(64), " & _
  44. "[SnapshotBytes] LONGBINARY, [ContentId] TEXT(200))"
  45. RunSql "CREATE TABLE [Campaign] ([Id] COUNTER CONSTRAINT [pkCampaign] PRIMARY KEY, " & _
  46. "[Name] TEXT(200) NOT NULL, [SenderKey] TEXT(254) NOT NULL, " & _
  47. "[FromSnapshot] TEXT(254), [ReplyToSnapshot] TEXT(254), " & _
  48. "[PostalAddressSnapshot] MEMO, [Subject] TEXT(255), [TemplateVersionId] INTEGER, " & _
  49. "[Status] TEXT(30) NOT NULL, [StartAtUtc] DATETIME, [ApprovedAtUtc] DATETIME)"
  50. RunSql "CREATE TABLE [Delivery] ([Id] COUNTER CONSTRAINT [pkDelivery] PRIMARY KEY, " & _
  51. "[CampaignId] INTEGER NOT NULL, [ContactId] INTEGER NOT NULL, " & _
  52. "[EmailKey] TEXT(254) NOT NULL, [Status] TEXT(30) NOT NULL, " & _
  53. "[AttemptCount] INTEGER NOT NULL, [LastAttemptAtUtc] DATETIME, " & _
  54. "[ProviderMessageId] TEXT(200), [LastErrorCode] TEXT(100))"
  55. RunSql "CREATE TABLE [Attempt] ([Id] COUNTER CONSTRAINT [pkAttempt] PRIMARY KEY, " & _
  56. "[DeliveryId] INTEGER NOT NULL, [StartedAtUtc] DATETIME, [EndedAtUtc] DATETIME, " & _
  57. "[Outcome] TEXT(30) NOT NULL, [ProviderRequestId] TEXT(200), [SanitizedError] MEMO)"
  58. RunSql "CREATE TABLE [DispatchState] ([SenderKey] TEXT(254) NOT NULL, " & _
  59. "[LastAttemptAtUtc] DATETIME, [NextAllowedAttemptUtc] DATETIME)"
  60. RunSql "CREATE TABLE [OperationalState] ([Id] INTEGER NOT NULL, [GlobalPause] BIT NOT NULL, " & _
  61. "[LastOptOutReviewAtUtc] DATETIME, [LastConfigHash] TEXT(64))"
  62. RunSql "CREATE TABLE [ProtectedSecret] ([Id] TEXT(100) NOT NULL, [Purpose] TEXT(50) NOT NULL, " & _
  63. "[DpapiCiphertext] LONGBINARY, [CreatedAtUtc] DATETIME, [RotatedAtUtc] DATETIME)"
  64. RunSql "CREATE TABLE [AuditEvent] ([Id] COUNTER CONSTRAINT [pkAuditEvent] PRIMARY KEY, " & _
  65. "[Actor] TEXT(100), [Action] TEXT(100) NOT NULL, [EntityId] TEXT(100), " & _
  66. "[TimestampUtc] DATETIME, [Detail] MEMO)"
  67. RunSql "CREATE UNIQUE INDEX [uxContactEmail] ON [Contact] ([EmailKey])"
  68. RunSql "CREATE UNIQUE INDEX [uxSuppressionEmail] ON [Suppression] ([EmailKey])"
  69. RunSql "CREATE UNIQUE INDEX [uxDeliveryCampaignEmail] ON [Delivery] ([CampaignId], [EmailKey])"
  70. RunSql "CREATE UNIQUE INDEX [uxDispatchSender] ON [DispatchState] ([SenderKey])"
  71. RunSql "CREATE UNIQUE INDEX [uxProtectedSecretId] ON [ProtectedSecret] ([Id])"
  72. RunSql "CREATE INDEX [ixDeliveryStatus] ON [Delivery] ([Status], [CampaignId])"
  73. RunSql "CREATE INDEX [ixAttemptDelivery] ON [Attempt] ([DeliveryId])"
  74. RunSql "CREATE INDEX [ixTemplateImageVersion] ON [TemplateImage] ([TemplateVersionId])"
  75. RunSql "INSERT INTO [AppMeta] ([SchemaVersion]) VALUES (1)"
  76. RunSql "INSERT INTO [OperationalState] ([Id], [GlobalPause]) VALUES (1, TRUE)"
  77. db.Close
  78. WScript.Echo "Created MDB schema version 1: " & dbPath
  79. WScript.Quit 0
  80. Sub RunSql(statement)
  81. On Error Resume Next
  82. db.Execute statement
  83. If Err.Number <> 0 Then StopWithError "Schema initialization failed: " & Err.Description & _
  84. vbCrLf & "Statement: " & statement
  85. On Error GoTo 0
  86. End Sub
  87. Sub CreateFolders(path)
  88. Dim parent
  89. parent = fs.GetParentFolderName(path)
  90. If Not fs.FolderExists(parent) Then CreateFolders parent
  91. fs.CreateFolder path
  92. End Sub
  93. Sub StopWithError(message)
  94. WScript.Echo "ERROR: " & message
  95. WScript.Quit 1
  96. End Sub

Powered by TurnKey Linux.