From 77b3ded4768b85f9be7ea50366243a2d5555a4f7 Mon Sep 17 00:00:00 2001 From: Andris Reinman Date: Tue, 19 Apr 2016 12:05:13 +0300 Subject: [PATCH] Added SQL upgrade script --- README.md | 11 +- config/default.toml | 2 + package.json | 3 +- setup/sql.js | 183 ++++++++++ setup/{mailtrain.sql => sql/base.sql} | 0 setup/sql/mailtrain.sql | 500 ++++++++++++++++++++++++++ setup/sql/update-00001.sql | 22 ++ setup/sql/update-template.sql | 21 ++ 8 files changed, 738 insertions(+), 4 deletions(-) create mode 100644 setup/sql.js rename setup/{mailtrain.sql => sql/base.sql} (100%) create mode 100644 setup/sql/mailtrain.sql create mode 100644 setup/sql/update-00001.sql create mode 100644 setup/sql/update-template.sql diff --git a/README.md b/README.md index b15b4dcd..a92bee72 100644 --- a/README.md +++ b/README.md @@ -25,16 +25,21 @@ Subscribe to Mailtrain Newsletter [here](http://mailtrain.org/subscription/EysIv ## Installation - 1. Download and unpack Mailtrain [sources](https://github.com/andris9/mailtrain/archive/master.zip) + 1. Download Mailtrain files using git: `git clone git://github.com/andris9/mailtrain.git` and open Mailtrain folder `cd mailtrain` 2. Run `npm install` in the Mailtrain folder to install required dependencies - 3. Copy [config/default.toml](config/default.toml) as `config/production.toml` and update MySQL settings in it - 4. Import SQL tables by running `mysql -u MYSQL_USER -p MYSQL_DB < setup/mailtrain.sql` + 3. Copy [config/default.toml](config/default.toml) as `config/production.toml` and update MySQL and any other settings in it + 4. Import SQL tables by running `npm run sql` (invokes `mysql` command in the background, so you should have it installed). If MySQL configuration in config file is not correct then this command fails 5. Run the server `NODE_ENV=production npm start` 6. Open [http://localhost:3000/](http://localhost:3000/) 7. Authenticate as `admin`:`test` 8. Navigate to [http://localhost:3000/settings](http://localhost:3000/settings) and update service configuration 9. Navigate to [http://localhost:3000/users/account](http://localhost:3000/users/account) and update user information and password +## Upgrade + + * Replace old files with new ones by running in the Mailtrain folder `git pull origin master` + * Upgrade MySQL tables by running `npm run sql` + ## Using environment variables Some servers expose custom port and hostname options through environment variables. To support these, create a new configuration file `config/local.js`: diff --git a/config/default.toml b/config/default.toml index 44b5e960..3c6f8af8 100644 --- a/config/default.toml +++ b/config/default.toml @@ -32,6 +32,8 @@ user="mailtrain" password="mailtrain" database="mailtrain" charset="utf8mb4" +# enter path for mysql command line application +command="mysql" [redis] # enable to use Redis session cache or disable if Redis is not installed diff --git a/package.json b/package.json index e2a90037..8b2ba3d4 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "main": "index.js", "scripts": { "test": "grunt", - "start": "node index.js" + "start": "node index.js", + "sql": "node setup/sql.js" }, "repository": { "type": "git", diff --git a/setup/sql.js b/setup/sql.js new file mode 100644 index 00000000..b17514e8 --- /dev/null +++ b/setup/sql.js @@ -0,0 +1,183 @@ +'use strict'; + +let config = require('config'); +let db = require('../lib/db'); +let spawn = require('child_process').spawn; +let settings = require('../lib/models/settings'); +let log = require('npmlog'); +let fs = require('fs'); +let pathlib = require('path'); +let Handlebars = require('handlebars'); + +log.level = 'verbose'; + +function listTables(callback) { + db.getConnection((err, connection) => { + if (err) { + return callback(err); + } + let query = 'SHOW TABLES'; + connection.query(query, (err, rows) => { + connection.release(); + if (err) { + return callback(err); + } + let tables = {}; + [].concat(rows || []).forEach(row => { + let name; + let table; + Object.keys(row).forEach(key => { + if (/^Tables_in_/i.test(key)) { + table = name = row[key]; + } + }); + if (/__\d+$/.test(name)) { + let parts = name.split('__'); + parts.pop(); + table = parts.join('__'); + } + if (tables.hasOwnProperty(table)) { + tables[table].push(name); + } else { + tables[table] = [name]; + } + return table; + }); + return callback(null, tables); + }); + }); +} + + +function getSchemaVersion(callback) { + settings.list(['db_schema_version'], (err, configItems) => { + if (err) { + return callback(err); + } + let dbSchemaVersion = Number(configItems.dbSchemaVersion) || 0; + + callback(null, dbSchemaVersion); + }); +} + +function listUpdates(current, callback) { + current = current || 0; + fs.readdir(__dirname + '/sql', (err, list) => { + if (err) { + return callback(err); + } + + let updates = []; + [].concat(list || []).forEach(row => { + if (/^update-\d+\.sql$/i.test(row)) { + let seq = row.match(/\d+/)[0]; + if (seq > current) { + updates.push({ + seq: Number(seq), + path: pathlib.join(__dirname, 'sql', row) + }); + } + } + }); + + return callback(null, updates); + }); +} + +function getSql(path, data, callback) { + fs.readFile(path, 'utf-8', (err, source) => { + if (err) { + return callback(err); + } + let renderer = Handlebars.compile(source); + return callback(null, renderer(data || {})); + }); +} + +function runInitial(callback) { + let path = pathlib.join(__dirname, 'sql', 'mailtrain.sql'); + applyUpdate({ + path + }, callback); +} + +function runUpdates(callback) { + listTables((err, tables) => { + if (err) { + return callback(err); + } + + if (!tables.settings) { + log.info('Initial', 'SQL not set up, initializing'); + return runInitial(callback); + } + + getSchemaVersion((err, schemaVersion) => { + if (err) { + return callback(err); + } + + listUpdates(schemaVersion, (err, updates) => { + if (err) { + return callback(err); + } + + let pos = 0; + let runNext = () => { + if (pos >= updates.length) { + return callback(null, pos); + } + let update = updates[pos++]; + update.data = { + tables + }; + applyUpdate(update, (err, status) => { + if (err) { + return callback(err); + } + if (status) { + log.info('Update', 'Update %s applied', update.seq); + } else { + log.info('Update', 'Update %s not applied', update.seq); + } + + runNext(); + }); + }; + + runNext(); + }); + }); + + }); +} + +function applyUpdate(update, callback) { + getSql(update.path, update.data, (err, sql) => { + if (err) { + return callback(err); + } + + let cmd = spawn(config.mysql.command || 'mysql', ['-h', config.mysql.host || 'localhost', '-P', config.mysql.port || 3306, '-u', config.mysql.user, '-p' + config.mysql.password, '-D', config.mysql.database]); + + cmd.stdout.pipe(process.stdout); + cmd.stderr.pipe(process.stderr); + + cmd.on('close', code => { + if (code) { + return callback(new Error('mysql command exited with code ' + code)); + } + return callback(null, true); + }); + cmd.stdin.end(sql); + }); +} + +runUpdates(err => { + if (err) { + log.error('RESULT', err); + process.exit(1); + } + log.info('RESULT', 'SQL Upgrade Completed'); + process.exit(0); +}); diff --git a/setup/mailtrain.sql b/setup/sql/base.sql similarity index 100% rename from setup/mailtrain.sql rename to setup/sql/base.sql diff --git a/setup/sql/mailtrain.sql b/setup/sql/mailtrain.sql new file mode 100644 index 00000000..2388a4ac --- /dev/null +++ b/setup/sql/mailtrain.sql @@ -0,0 +1,500 @@ +-- MySQL dump 10.16 Distrib 10.1.12-MariaDB, for osx10.11 (x86_64) +-- +-- Host: localhost Database: frontmail +-- ------------------------------------------------------ +-- Server version 10.1.12-MariaDB + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `campaign` +-- + +DROP TABLE IF EXISTS `campaign`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `campaign` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `list` int(11) unsigned NOT NULL, + `segment` int(11) unsigned NOT NULL, + `subscription` int(11) unsigned NOT NULL, + `status` tinyint(4) unsigned NOT NULL DEFAULT '0', + `response` varchar(255) DEFAULT NULL, + `response_id` varchar(255) CHARACTER SET ascii DEFAULT NULL, + `updated` timestamp NULL DEFAULT NULL, + `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `list` (`list`,`segment`,`subscription`), + KEY `created` (`created`), + KEY `response_id` (`response_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `campaign` +-- + +LOCK TABLES `campaign` WRITE; +/*!40000 ALTER TABLE `campaign` DISABLE KEYS */; +/*!40000 ALTER TABLE `campaign` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `campaign_tracker` +-- + +DROP TABLE IF EXISTS `campaign_tracker`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `campaign_tracker` ( + `list` int(11) unsigned NOT NULL, + `subscriber` int(11) unsigned NOT NULL, + `link` int(11) NOT NULL, + `ip` varchar(100) CHARACTER SET ascii DEFAULT NULL, + `country` varchar(2) CHARACTER SET ascii DEFAULT NULL, + `count` int(11) unsigned NOT NULL DEFAULT '1', + PRIMARY KEY (`list`,`subscriber`,`link`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `campaign_tracker` +-- + +LOCK TABLES `campaign_tracker` WRITE; +/*!40000 ALTER TABLE `campaign_tracker` DISABLE KEYS */; +/*!40000 ALTER TABLE `campaign_tracker` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `campaigns` +-- + +DROP TABLE IF EXISTS `campaigns`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `campaigns` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `cid` varchar(255) CHARACTER SET ascii NOT NULL, + `name` varchar(255) NOT NULL DEFAULT '', + `description` text, + `list` int(11) unsigned NOT NULL, + `segment` int(11) unsigned DEFAULT NULL, + `template` int(11) unsigned NOT NULL, + `from` varchar(255) DEFAULT '', + `address` varchar(255) DEFAULT '', + `subject` varchar(255) DEFAULT '', + `html` text, + `text` text, + `status` tinyint(4) unsigned NOT NULL DEFAULT '1', + `status_change` timestamp NULL DEFAULT NULL, + `delivered` int(11) unsigned NOT NULL DEFAULT '0', + `opened` int(11) unsigned NOT NULL DEFAULT '0', + `clicks` int(11) unsigned NOT NULL DEFAULT '0', + `unsubscribed` int(11) unsigned NOT NULL DEFAULT '0', + `bounced` int(1) unsigned NOT NULL DEFAULT '0', + `complained` int(1) unsigned NOT NULL DEFAULT '0', + `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `cid` (`cid`), + KEY `name` (`name`(191)), + KEY `status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `campaigns` +-- + +LOCK TABLES `campaigns` WRITE; +/*!40000 ALTER TABLE `campaigns` DISABLE KEYS */; +/*!40000 ALTER TABLE `campaigns` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `confirmations` +-- + +DROP TABLE IF EXISTS `confirmations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `confirmations` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `cid` varchar(255) CHARACTER SET ascii NOT NULL, + `list` int(11) unsigned NOT NULL, + `email` varchar(255) NOT NULL, + `data` text NOT NULL, + `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `cid` (`cid`), + KEY `list` (`list`), + CONSTRAINT `confirmations_ibfk_1` FOREIGN KEY (`list`) REFERENCES `lists` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `confirmations` +-- + +LOCK TABLES `confirmations` WRITE; +/*!40000 ALTER TABLE `confirmations` DISABLE KEYS */; +/*!40000 ALTER TABLE `confirmations` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `custom_fields` +-- + +DROP TABLE IF EXISTS `custom_fields`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `custom_fields` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `list` int(11) unsigned NOT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 DEFAULT '', + `key` varchar(100) CHARACTER SET ascii NOT NULL, + `default_value` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL, + `type` varchar(255) CHARACTER SET ascii NOT NULL DEFAULT '', + `group` int(11) unsigned DEFAULT NULL, + `column` varchar(255) CHARACTER SET ascii DEFAULT NULL, + `visible` tinyint(4) unsigned NOT NULL DEFAULT '1', + `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `list` (`list`,`column`), + KEY `list_2` (`list`), + CONSTRAINT `custom_fields_ibfk_1` FOREIGN KEY (`list`) REFERENCES `lists` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `custom_fields` +-- + +LOCK TABLES `custom_fields` WRITE; +/*!40000 ALTER TABLE `custom_fields` DISABLE KEYS */; +/*!40000 ALTER TABLE `custom_fields` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `import_failed` +-- + +DROP TABLE IF EXISTS `import_failed`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `import_failed` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `import` int(11) unsigned NOT NULL, + `email` varchar(255) NOT NULL DEFAULT '', + `reason` varchar(255) DEFAULT NULL, + `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `import` (`import`), + CONSTRAINT `import_failed_ibfk_1` FOREIGN KEY (`import`) REFERENCES `importer` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `import_failed` +-- + +LOCK TABLES `import_failed` WRITE; +/*!40000 ALTER TABLE `import_failed` DISABLE KEYS */; +/*!40000 ALTER TABLE `import_failed` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `importer` +-- + +DROP TABLE IF EXISTS `importer`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `importer` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `list` int(11) unsigned NOT NULL, + `type` tinyint(4) unsigned NOT NULL DEFAULT '1', + `path` varchar(255) NOT NULL DEFAULT '', + `size` int(11) unsigned NOT NULL DEFAULT '0', + `delimiter` varchar(1) CHARACTER SET ascii NOT NULL DEFAULT ',', + `status` tinyint(4) unsigned NOT NULL DEFAULT '0', + `error` varchar(255) DEFAULT NULL, + `processed` int(11) unsigned NOT NULL DEFAULT '0', + `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `mapping` text CHARACTER SET utf8mb4 NOT NULL, + `finished` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `list` (`list`), + CONSTRAINT `importer_ibfk_1` FOREIGN KEY (`list`) REFERENCES `lists` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `importer` +-- + +LOCK TABLES `importer` WRITE; +/*!40000 ALTER TABLE `importer` DISABLE KEYS */; +/*!40000 ALTER TABLE `importer` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `links` +-- + +DROP TABLE IF EXISTS `links`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `links` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `cid` varchar(255) CHARACTER SET ascii NOT NULL DEFAULT '', + `campaign` int(11) unsigned NOT NULL, + `url` varchar(255) CHARACTER SET ascii NOT NULL DEFAULT '', + `clicks` int(11) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `cid` (`cid`), + UNIQUE KEY `campaign_2` (`campaign`,`url`), + KEY `campaign` (`campaign`), + CONSTRAINT `links_ibfk_1` FOREIGN KEY (`campaign`) REFERENCES `campaigns` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `links` +-- + +LOCK TABLES `links` WRITE; +/*!40000 ALTER TABLE `links` DISABLE KEYS */; +/*!40000 ALTER TABLE `links` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `lists` +-- + +DROP TABLE IF EXISTS `lists`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `lists` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `cid` varchar(255) CHARACTER SET ascii NOT NULL, + `name` varchar(255) NOT NULL DEFAULT '', + `description` text, + `subscribers` int(11) unsigned DEFAULT '0', + `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `cid` (`cid`), + KEY `name` (`name`(191)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `lists` +-- + +LOCK TABLES `lists` WRITE; +/*!40000 ALTER TABLE `lists` DISABLE KEYS */; +/*!40000 ALTER TABLE `lists` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `segment_rules` +-- + +DROP TABLE IF EXISTS `segment_rules`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `segment_rules` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `segment` int(11) unsigned NOT NULL, + `column` varchar(255) CHARACTER SET ascii NOT NULL DEFAULT '', + `value` varchar(255) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + KEY `segment` (`segment`), + CONSTRAINT `segment_rules_ibfk_1` FOREIGN KEY (`segment`) REFERENCES `segments` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `segment_rules` +-- + +LOCK TABLES `segment_rules` WRITE; +/*!40000 ALTER TABLE `segment_rules` DISABLE KEYS */; +/*!40000 ALTER TABLE `segment_rules` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `segments` +-- + +DROP TABLE IF EXISTS `segments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `segments` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `list` int(11) unsigned NOT NULL, + `name` varchar(255) NOT NULL DEFAULT '', + `type` tinyint(4) unsigned NOT NULL, + `created` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `list` (`list`), + KEY `name` (`name`(191)), + CONSTRAINT `segments_ibfk_1` FOREIGN KEY (`list`) REFERENCES `lists` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `segments` +-- + +LOCK TABLES `segments` WRITE; +/*!40000 ALTER TABLE `segments` DISABLE KEYS */; +/*!40000 ALTER TABLE `segments` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `settings` +-- + +DROP TABLE IF EXISTS `settings`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `settings` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `key` varchar(255) CHARACTER SET ascii NOT NULL DEFAULT '', + `value` text NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key` (`key`) +) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `settings` +-- + +LOCK TABLES `settings` WRITE; +/*!40000 ALTER TABLE `settings` DISABLE KEYS */; +INSERT INTO `settings` VALUES (1,'smtp_hostname','localhost'),(2,'smtp_port','465'),(3,'smtp_encryption','TLS'),(4,'smtp_user','username'),(5,'smtp_pass','password'),(6,'service_url','http://localhost:3000/'),(7,'admin_email','admin@example.com'),(8,'smtp_max_connections','5'),(9,'smtp_max_messages','100'),(10,'smtp_log',''),(11,'default_sender','My Awesome Company'),(12,'default_postaddress','1234 Main Street'),(13,'default_from','My Awesome Company'),(14,'default_address','admin@example.com'),(15,'default_subject','Test message'),(16,'default_homepage','http://localhost:3000/'),(17,'db_schema_version','1'); +/*!40000 ALTER TABLE `settings` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `subscription` +-- + +DROP TABLE IF EXISTS `subscription`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `subscription` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `cid` varchar(255) CHARACTER SET ascii NOT NULL, + `email` varchar(255) CHARACTER SET utf8 NOT NULL DEFAULT '', + `opt_in_ip` varchar(100) DEFAULT NULL, + `opt_in_country` varchar(2) DEFAULT NULL, + `imported` int(11) unsigned DEFAULT NULL, + `status` tinyint(4) unsigned NOT NULL DEFAULT '1', + `status_change` timestamp NULL DEFAULT NULL, + `latest_open` timestamp NULL DEFAULT NULL, + `latest_click` timestamp NULL DEFAULT NULL, + `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `first_name` varchar(255) DEFAULT NULL, + `last_name` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `email` (`email`), + UNIQUE KEY `cid` (`cid`), + KEY `status` (`status`), + KEY `first_name` (`first_name`(191)), + KEY `last_name` (`last_name`(191)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `subscription` +-- + +LOCK TABLES `subscription` WRITE; +/*!40000 ALTER TABLE `subscription` DISABLE KEYS */; +/*!40000 ALTER TABLE `subscription` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `templates` +-- + +DROP TABLE IF EXISTS `templates`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `templates` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `description` text, + `html` text, + `text` text, + `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `name` (`name`(191)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `templates` +-- + +LOCK TABLES `templates` WRITE; +/*!40000 ALTER TABLE `templates` DISABLE KEYS */; +/*!40000 ALTER TABLE `templates` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `users` +-- + +DROP TABLE IF EXISTS `users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `users` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `username` varchar(255) NOT NULL DEFAULT '', + `password` varchar(255) NOT NULL DEFAULT '', + `email` varchar(255) CHARACTER SET utf8 DEFAULT NULL, + `reset_token` varchar(255) CHARACTER SET ascii DEFAULT NULL, + `reset_expire` timestamp NULL DEFAULT NULL, + `created` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `email` (`email`), + KEY `username` (`username`(191)), + KEY `reset` (`reset_token`), + KEY `check_reset` (`username`(191),`reset_token`,`reset_expire`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `users` +-- + +LOCK TABLES `users` WRITE; +/*!40000 ALTER TABLE `users` DISABLE KEYS */; +INSERT INTO `users` VALUES (1,'admin','$2a$10$mzKU71G62evnGB2PvQA4k..Wf9jASk.c7a8zRMHh6qQVjYJ2r/g/K','admin@example.com',NULL,NULL,'2016-04-19 08:51:04'); +/*!40000 ALTER TABLE `users` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2016-04-19 11:53:09 diff --git a/setup/sql/update-00001.sql b/setup/sql/update-00001.sql new file mode 100644 index 00000000..3ad9febe --- /dev/null +++ b/setup/sql/update-00001.sql @@ -0,0 +1,22 @@ +# Header section +# Define incrementing schema version number +SET @schema_version = '1'; + +# Upgrade script section +CREATE TABLE `import_failed` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `import` int(11) unsigned NOT NULL, + `email` varchar(255) NOT NULL DEFAULT '', + `reason` varchar(255) DEFAULT NULL, + `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `import` (`import`), + CONSTRAINT `import_failed_ibfk_1` FOREIGN KEY (`import`) REFERENCES `importer` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +# Footer section +LOCK TABLES `settings` WRITE; +/*!40000 ALTER TABLE `settings` DISABLE KEYS */; +INSERT INTO `settings` (`key`, `value`) VALUES('db_schema_version', @schema_version) ON DUPLICATE KEY UPDATE `value`=@schema_version; +/*!40000 ALTER TABLE `settings` ENABLE KEYS */; +UNLOCK TABLES; diff --git a/setup/sql/update-template.sql b/setup/sql/update-template.sql new file mode 100644 index 00000000..3982b6a7 --- /dev/null +++ b/setup/sql/update-template.sql @@ -0,0 +1,21 @@ +# This file is a handlebars template +# To modify several similar tables at once use (replace [] with {}): +# [[#each tablename]] ALTER TABLE `[[this]]` ... [[/each]] +# NB! as this is a handlebars file, then remember to escape any template sequences + +# Header section +# Define incrementing schema version number +SET @schema_version = 'XXX'; + +# Upgrade script section +#### INSERT YOUR UPGRADE SCRIPT BELOW THIS LINE ###### + + +#### INSERT YOUR UPGRADE SCRIPT ABOVE THIS LINE ###### + +# Footer section. Updates schema version in settings +LOCK TABLES `settings` WRITE; +/*!40000 ALTER TABLE `settings` DISABLE KEYS */; +INSERT INTO `settings` (`key`, `value`) VALUES('db_schema_version', @schema_version) ON DUPLICATE KEY UPDATE `value`=@schema_version; +/*!40000 ALTER TABLE `settings` ENABLE KEYS */; +UNLOCK TABLES;