Added SQL upgrade script
This commit is contained in:
parent
1e2e23142b
commit
77b3ded476
8 changed files with 738 additions and 4 deletions
11
README.md
11
README.md
|
@ -25,16 +25,21 @@ Subscribe to Mailtrain Newsletter [here](http://mailtrain.org/subscription/EysIv
|
||||||
|
|
||||||
## Installation
|
## 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
|
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
|
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 `mysql -u MYSQL_USER -p MYSQL_DB < setup/mailtrain.sql`
|
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`
|
5. Run the server `NODE_ENV=production npm start`
|
||||||
6. Open [http://localhost:3000/](http://localhost:3000/)
|
6. Open [http://localhost:3000/](http://localhost:3000/)
|
||||||
7. Authenticate as `admin`:`test`
|
7. Authenticate as `admin`:`test`
|
||||||
8. Navigate to [http://localhost:3000/settings](http://localhost:3000/settings) and update service configuration
|
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
|
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
|
## 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`:
|
Some servers expose custom port and hostname options through environment variables. To support these, create a new configuration file `config/local.js`:
|
||||||
|
|
|
@ -32,6 +32,8 @@ user="mailtrain"
|
||||||
password="mailtrain"
|
password="mailtrain"
|
||||||
database="mailtrain"
|
database="mailtrain"
|
||||||
charset="utf8mb4"
|
charset="utf8mb4"
|
||||||
|
# enter path for mysql command line application
|
||||||
|
command="mysql"
|
||||||
|
|
||||||
[redis]
|
[redis]
|
||||||
# enable to use Redis session cache or disable if Redis is not installed
|
# enable to use Redis session cache or disable if Redis is not installed
|
||||||
|
|
|
@ -6,7 +6,8 @@
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "grunt",
|
"test": "grunt",
|
||||||
"start": "node index.js"
|
"start": "node index.js",
|
||||||
|
"sql": "node setup/sql.js"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
|
183
setup/sql.js
Normal file
183
setup/sql.js
Normal file
|
@ -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);
|
||||||
|
});
|
500
setup/sql/mailtrain.sql
Normal file
500
setup/sql/mailtrain.sql
Normal file
|
@ -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
|
22
setup/sql/update-00001.sql
Normal file
22
setup/sql/update-00001.sql
Normal file
|
@ -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;
|
21
setup/sql/update-template.sql
Normal file
21
setup/sql/update-template.sql
Normal file
|
@ -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;
|
Loading…
Add table
Add a link
Reference in a new issue