mirror of
https://github.com/ONLYOFFICE/server.git
synced 2026-02-10 18:05:07 +08:00
rename db columns, remove unused tr_format
This commit is contained in:
committed by
Alexander.Trofimov
parent
46b5f04600
commit
92817345f3
@ -540,11 +540,11 @@ function* getCallback(id) {
|
||||
var selectRes = yield sqlBase.getCallbackPromise(id);
|
||||
if (selectRes.length > 0) {
|
||||
var row = selectRes[0];
|
||||
if (row.dc_callback) {
|
||||
callbackUrl = row.dc_callback;
|
||||
if (row.callback) {
|
||||
callbackUrl = row.callback;
|
||||
}
|
||||
if (row.dc_baseurl) {
|
||||
baseUrl = row.dc_baseurl;
|
||||
if (row.baseurl) {
|
||||
baseUrl = row.baseurl;
|
||||
}
|
||||
}
|
||||
if (null != callbackUrl && null != baseUrl) {
|
||||
@ -563,8 +563,8 @@ function* getChangesIndex(docId) {
|
||||
res = parseInt(redisRes);
|
||||
} else {
|
||||
var getRes = yield sqlBase.getChangesIndexPromise(docId);
|
||||
if (getRes && getRes.length > 0 && null != getRes[0]['dc_change_id']) {
|
||||
res = getRes[0]['dc_change_id'] + 1;
|
||||
if (getRes && getRes.length > 0 && null != getRes[0]['change_id']) {
|
||||
res = getRes[0]['change_id'] + 1;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
@ -971,9 +971,9 @@ exports.install = function(server, callbackFunction) {
|
||||
element = arrayElements[j];
|
||||
|
||||
// Добавляем GMT, т.к. в базу данных мы пишем UTC, но сохраняется туда строка без UTC и при зачитывании будет неправильное время
|
||||
objChangesDocument.push({docid: docId, change: element['dc_data'],
|
||||
time: element['dc_date'].getTime(), user: element['dc_user_id'],
|
||||
useridoriginal: element['dc_user_id_original']});
|
||||
objChangesDocument.push({docid: docId, change: element['change_data'],
|
||||
time: element['change_date'].getTime(), user: element['user_id'],
|
||||
useridoriginal: element['user_id_original']});
|
||||
}
|
||||
return objChangesDocument;
|
||||
}
|
||||
@ -1282,7 +1282,7 @@ exports.install = function(server, callbackFunction) {
|
||||
try {
|
||||
var result = yield sqlBase.checkStatusFilePromise(docId);
|
||||
|
||||
var status = result[0]['tr_status'];
|
||||
var status = result[0]['status'];
|
||||
if (FileStatus.Ok === status) {
|
||||
// Все хорошо, статус обновлять не нужно
|
||||
} else if (FileStatus.SaveVersion === status) {
|
||||
@ -1290,7 +1290,7 @@ exports.install = function(server, callbackFunction) {
|
||||
var updateMask = new taskResult.TaskResultData();
|
||||
updateMask.key = docId;
|
||||
updateMask.status = status;
|
||||
updateMask.statusInfo = result[0]['tr_status_info'];
|
||||
updateMask.statusInfo = result[0]['status_info'];
|
||||
var updateTask = new taskResult.TaskResultData();
|
||||
updateTask.status = taskResult.FileStatus.Ok;
|
||||
updateTask.statusInfo = constants.NO_ERROR;
|
||||
|
||||
@ -161,9 +161,9 @@ function _insertChangesCallback (startIndex, objChanges, docId, index, user, cal
|
||||
baseConnector.sqlQuery(sqlCommand, callback);
|
||||
}
|
||||
exports.deleteChangesCallback = function (docId, deleteIndex, callback) {
|
||||
var sqlCommand = "DELETE FROM " + tableChanges + " WHERE dc_key='" + docId + "'";
|
||||
var sqlCommand = "DELETE FROM " + tableChanges + " WHERE id='" + docId + "'";
|
||||
if (null !== deleteIndex)
|
||||
sqlCommand += " AND dc_change_id >= " + deleteIndex;
|
||||
sqlCommand += " AND change_id >= " + deleteIndex;
|
||||
sqlCommand += ";";
|
||||
baseConnector.sqlQuery(sqlCommand, callback);
|
||||
};
|
||||
@ -185,7 +185,7 @@ function _deleteChanges (docId, deleteIndex) {
|
||||
exports.deleteChangesCallback(docId, deleteIndex, function () {unLockCriticalSection(docId);});
|
||||
}
|
||||
exports.getCallback = function(docId, callback) {
|
||||
getDataFromTable(c_oTableId.callbacks, "*", "dc_key='" + docId + "'", callback);
|
||||
getDataFromTable(c_oTableId.callbacks, "*", "id='" + docId + "'", callback);
|
||||
};
|
||||
exports.getCallbackPromise = function(docId) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
@ -199,7 +199,7 @@ exports.getCallbackPromise = function(docId) {
|
||||
});
|
||||
};
|
||||
exports.deleteCallback = function (docId, callback) {
|
||||
deleteFromTable(c_oTableId.callbacks, "dc_key='" + docId + "'", callback);
|
||||
deleteFromTable(c_oTableId.callbacks, "id='" + docId + "'", callback);
|
||||
};
|
||||
exports.deleteCallbackPromise = function (docId) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
@ -214,7 +214,7 @@ exports.deleteCallbackPromise = function (docId) {
|
||||
};
|
||||
exports.getChangesIndex = function(docId, callback) {
|
||||
var table = getTableById(c_oTableId.changes);
|
||||
var sqlCommand = 'SELECT MAX(dc_change_id) as dc_change_id FROM ' + table + ' WHERE dc_key=' + baseConnector.sqlEscape(docId) + ';';
|
||||
var sqlCommand = 'SELECT MAX(change_id) as change_id FROM ' + table + ' WHERE id=' + baseConnector.sqlEscape(docId) + ';';
|
||||
baseConnector.sqlQuery(sqlCommand, callback);
|
||||
};
|
||||
exports.getChangesIndexPromise = function(docId) {
|
||||
@ -230,9 +230,9 @@ exports.getChangesIndexPromise = function(docId) {
|
||||
};
|
||||
exports.getChangesPromise = function (docId, optStartIndex, optEndIndex) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
var getCondition = 'dc_key='+baseConnector.sqlEscape(docId);
|
||||
var getCondition = 'id='+baseConnector.sqlEscape(docId);
|
||||
if (null != optStartIndex && null != optEndIndex) {
|
||||
getCondition += ' AND dc_change_id>=' + optStartIndex + ' AND dc_change_id<' + optEndIndex;
|
||||
getCondition += ' AND change_id>=' + optStartIndex + ' AND change_id<' + optEndIndex;
|
||||
}
|
||||
getDataFromTable(c_oTableId.changes, "*", getCondition, function(error, result) {
|
||||
if (error) {
|
||||
@ -247,12 +247,12 @@ exports.getChanges = function (docId, callback) {
|
||||
lockCriticalSection(docId, function () {_getChanges(docId, callback);});
|
||||
};
|
||||
function _getChanges (docId, callback) {
|
||||
getDataFromTable(c_oTableId.changes, "*", "dc_key='" + docId + "'",
|
||||
getDataFromTable(c_oTableId.changes, "*", "id='" + docId + "'",
|
||||
function (error, result) {unLockCriticalSection(docId); if (callback) callback(error, result);});
|
||||
}
|
||||
|
||||
exports.checkStatusFile = function (docId, callbackFunction) {
|
||||
var sqlCommand = "SELECT tr_status FROM " + tableResult + " WHERE tr_key='" + docId + "';";
|
||||
var sqlCommand = "SELECT status FROM " + tableResult + " WHERE id='" + docId + "';";
|
||||
baseConnector.sqlQuery(sqlCommand, callbackFunction);
|
||||
};
|
||||
exports.checkStatusFilePromise = function (docId) {
|
||||
@ -268,7 +268,7 @@ exports.checkStatusFilePromise = function (docId) {
|
||||
};
|
||||
exports.updateStatusFile = function (docId) {
|
||||
// Статус OK = 1
|
||||
var sqlCommand = "UPDATE " + tableResult + " SET tr_status=1 WHERE tr_key='" + docId + "';";
|
||||
var sqlCommand = "UPDATE " + tableResult + " SET status=1 WHERE id='" + docId + "';";
|
||||
baseConnector.sqlQuery(sqlCommand);
|
||||
};
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -25,14 +25,14 @@ function* getConvertStatus(cmd, selectRes, baseUrl) {
|
||||
if (selectRes.length > 0) {
|
||||
var docId = cmd.getDocId();
|
||||
var row = selectRes[0];
|
||||
switch (row.tr_status) {
|
||||
switch (row.status) {
|
||||
case taskResult.FileStatus.Ok:
|
||||
status.url = yield storage.getSignedUrl(baseUrl, docId + '/' + cmd.getTitle());
|
||||
break;
|
||||
case taskResult.FileStatus.Err:
|
||||
case taskResult.FileStatus.ErrToReload:
|
||||
status.err = row.tr_status_info;
|
||||
if (taskResult.FileStatus.ErrToReload == row.tr_status) {
|
||||
status.err = row.status_info;
|
||||
if (taskResult.FileStatus.ErrToReload == row.status) {
|
||||
yield canvasService.cleanupCache(docId);
|
||||
}
|
||||
break;
|
||||
@ -42,7 +42,7 @@ function* getConvertStatus(cmd, selectRes, baseUrl) {
|
||||
status.err = constants.UNKNOWN;
|
||||
break;
|
||||
}
|
||||
var lastOpenDate = row.tr_last_open_date;
|
||||
var lastOpenDate = row.last_open_date;
|
||||
if (new Date().getTime() - lastOpenDate.getTime() > CONVERT_TIMEOUT) {
|
||||
status.err = constants.CONVERT_TIMEOUT;
|
||||
}
|
||||
@ -60,7 +60,6 @@ function* convertByCmd(cmd, async, baseUrl, opt_healthcheck) {
|
||||
|
||||
var task = new taskResult.TaskResultData();
|
||||
task.key = docId;
|
||||
task.format = cmd.getFormat();
|
||||
task.status = taskResult.FileStatus.WaitQueue;
|
||||
task.statusInfo = constants.NO_ERROR;
|
||||
task.title = cmd.getTitle();
|
||||
|
||||
@ -32,7 +32,7 @@ var checkFileExpire = function() {
|
||||
currentRemovedCount = 0;
|
||||
expired = yield taskResult.getExpired(cfgExpFilesRemovedAtOnce, cfgExpFiles);
|
||||
for (var i = 0; i < expired.length; ++i) {
|
||||
var docId = expired[i].tr_key;
|
||||
var docId = expired[i].id;
|
||||
//проверяем что никто не сидит в документе
|
||||
var hvals = yield docsCoServer.getAllPresencePromise(docId);
|
||||
if(0 == hvals.length){
|
||||
|
||||
@ -19,7 +19,6 @@ var FileStatus = {
|
||||
|
||||
function TaskResultData() {
|
||||
this.key = null;
|
||||
this.format = null;
|
||||
this.status = null;
|
||||
this.statusInfo = null;
|
||||
this.lastOpenDate = null;
|
||||
@ -31,9 +30,6 @@ TaskResultData.prototype.completeDefaults = function() {
|
||||
if (!this.key) {
|
||||
this.key = '';
|
||||
}
|
||||
if (!this.format) {
|
||||
this.format = '';
|
||||
}
|
||||
if (!this.status) {
|
||||
this.status = FileStatus.None;
|
||||
}
|
||||
@ -57,16 +53,16 @@ TaskResultData.prototype.completeDefaults = function() {
|
||||
function getUpsertString(task, opt_updateUserIndex) {
|
||||
task.completeDefaults();
|
||||
var dateNow = sqlBase.getDateTime(new Date());
|
||||
var commandArg = [task.key, task.format, task.status, task.statusInfo, dateNow, task.title, task.userIndex, task.changeId];
|
||||
var commandArg = [task.key, task.status, task.statusInfo, dateNow, task.title, task.userIndex, task.changeId];
|
||||
var commandArgEsc = commandArg.map(function(curVal) {
|
||||
return sqlBase.baseConnector.sqlEscape(curVal)
|
||||
});
|
||||
var sql = 'INSERT INTO task_result ( tr_key, tr_format, tr_status, tr_status_info, tr_last_open_date, tr_title,' +
|
||||
' tr_user_index, tr_change_id ) VALUES (' + commandArgEsc.join(', ') + ') ON DUPLICATE KEY UPDATE' +
|
||||
' tr_last_open_date = ' + sqlBase.baseConnector.sqlEscape(dateNow);
|
||||
var sql = 'INSERT INTO task_result ( id, status, status_info, last_open_date, title,' +
|
||||
' user_index, change_id ) VALUES (' + commandArgEsc.join(', ') + ') ON DUPLICATE KEY UPDATE' +
|
||||
' last_open_date = ' + sqlBase.baseConnector.sqlEscape(dateNow);
|
||||
if (opt_updateUserIndex) {
|
||||
//todo LAST_INSERT_ID in posgresql - RETURNING
|
||||
sql += ', tr_user_index = LAST_INSERT_ID(tr_user_index + 1);';
|
||||
sql += ', user_index = LAST_INSERT_ID(user_index + 1);';
|
||||
} else {
|
||||
sql += ';';
|
||||
}
|
||||
@ -87,7 +83,7 @@ function upsert(task, opt_updateUserIndex) {
|
||||
}
|
||||
|
||||
function getSelectString(docId) {
|
||||
return 'SELECT * FROM task_result WHERE tr_key=' + sqlBase.baseConnector.sqlEscape(docId) + ';';
|
||||
return 'SELECT * FROM task_result WHERE id=' + sqlBase.baseConnector.sqlEscape(docId) + ';';
|
||||
}
|
||||
|
||||
function select(docId) {
|
||||
@ -104,33 +100,30 @@ function select(docId) {
|
||||
}
|
||||
function toUpdateArray(task, updateTime) {
|
||||
var res = [];
|
||||
if (null != task.format) {
|
||||
res.push('tr_format=' + sqlBase.baseConnector.sqlEscape(task.format));
|
||||
}
|
||||
if (null != task.status) {
|
||||
res.push('tr_status=' + sqlBase.baseConnector.sqlEscape(task.status));
|
||||
res.push('status=' + sqlBase.baseConnector.sqlEscape(task.status));
|
||||
}
|
||||
if (null != task.statusInfo) {
|
||||
res.push('tr_status_info=' + sqlBase.baseConnector.sqlEscape(task.statusInfo));
|
||||
res.push('status_info=' + sqlBase.baseConnector.sqlEscape(task.statusInfo));
|
||||
}
|
||||
if (updateTime) {
|
||||
res.push('tr_last_open_date=' + sqlBase.baseConnector.sqlEscape(sqlBase.getDateTime(new Date())));
|
||||
res.push('last_open_date=' + sqlBase.baseConnector.sqlEscape(sqlBase.getDateTime(new Date())));
|
||||
}
|
||||
if (null != task.title) {
|
||||
res.push('tr_title=' + sqlBase.baseConnector.sqlEscape(task.title));
|
||||
res.push('title=' + sqlBase.baseConnector.sqlEscape(task.title));
|
||||
}
|
||||
if (null != task.indexUser) {
|
||||
res.push('tr_index_user=' + sqlBase.baseConnector.sqlEscape(task.indexUser));
|
||||
res.push('user_index=' + sqlBase.baseConnector.sqlEscape(task.indexUser));
|
||||
}
|
||||
if (null != task.changeId) {
|
||||
res.push('tr_change_id=' + sqlBase.baseConnector.sqlEscape(task.changeId));
|
||||
res.push('change_id=' + sqlBase.baseConnector.sqlEscape(task.changeId));
|
||||
}
|
||||
return res;
|
||||
}
|
||||
function getUpdateString(task) {
|
||||
var commandArgEsc = toUpdateArray(task, true);
|
||||
return 'UPDATE task_result SET ' + commandArgEsc.join(', ') +
|
||||
' WHERE tr_key=' + sqlBase.baseConnector.sqlEscape(task.key) + ';';
|
||||
' WHERE id=' + sqlBase.baseConnector.sqlEscape(task.key) + ';';
|
||||
}
|
||||
|
||||
function update(task) {
|
||||
@ -148,7 +141,7 @@ function update(task) {
|
||||
function getUpdateIfString(task, mask) {
|
||||
var commandArgEsc = toUpdateArray(task, true);
|
||||
var commandArgEscMask = toUpdateArray(mask);
|
||||
commandArgEscMask.push('tr_key=' + sqlBase.baseConnector.sqlEscape(mask.key));
|
||||
commandArgEscMask.push('id=' + sqlBase.baseConnector.sqlEscape(mask.key));
|
||||
return 'UPDATE task_result SET ' + commandArgEsc.join(', ') +
|
||||
' WHERE ' + commandArgEscMask.join(' AND ') + ';';
|
||||
}
|
||||
@ -169,12 +162,12 @@ function updateIf(task, mask) {
|
||||
function getInsertString(task) {
|
||||
var dateNow = sqlBase.getDateTime(new Date());
|
||||
task.completeDefaults();
|
||||
var commandArg = [task.key, task.format, task.status, task.statusInfo, dateNow, task.title, task.userIndex, task.changeId];
|
||||
var commandArg = [task.key, task.status, task.statusInfo, dateNow, task.title, task.userIndex, task.changeId];
|
||||
var commandArgEsc = commandArg.map(function(curVal) {
|
||||
return sqlBase.baseConnector.sqlEscape(curVal)
|
||||
});
|
||||
return 'INSERT INTO task_result ( tr_key, tr_format, tr_status, tr_status_info, tr_last_open_date, tr_title,'+
|
||||
' tr_user_index, tr_change_id) VALUES (' + commandArgEsc.join(', ') + ');';
|
||||
return 'INSERT INTO task_result ( id, status, status_info, last_open_date, title, user_index, change_id) VALUES (' +
|
||||
commandArgEsc.join(', ') + ');';
|
||||
}
|
||||
function addRandomKey(task) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
@ -215,7 +208,7 @@ function* addRandomKeyTask(key) {
|
||||
}
|
||||
|
||||
function getRemoveString(docId) {
|
||||
return 'DELETE FROM task_result WHERE tr_key=' + sqlBase.baseConnector.sqlEscape(docId) + ';';
|
||||
return 'DELETE FROM task_result WHERE id=' + sqlBase.baseConnector.sqlEscape(docId) + ';';
|
||||
}
|
||||
function remove(docId) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
@ -233,8 +226,8 @@ function getExpiredString(maxCount, expireSeconds) {
|
||||
var expireDate = new Date();
|
||||
utils.addSeconds(expireDate, -expireSeconds);
|
||||
var expireDateStr = sqlBase.baseConnector.sqlEscape(sqlBase.getDateTime(expireDate));
|
||||
return 'SELECT * FROM task_result WHERE tr_last_open_date <= ' + expireDateStr +
|
||||
' AND NOT EXISTS(SELECT dc_key FROM doc_changes WHERE dc_key = tr_key LIMIT 1) LIMIT ' + maxCount + ';';
|
||||
return 'SELECT * FROM task_result WHERE last_open_date <= ' + expireDateStr +
|
||||
' AND NOT EXISTS(SELECT id FROM doc_changes WHERE doc_changes.id = task_result.id LIMIT 1) LIMIT ' + maxCount + ';';
|
||||
}
|
||||
function getExpired(maxCount, expireSeconds) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
|
||||
@ -260,7 +260,7 @@ function* processDownloadFromStorage(dataConvert, cmd, task, tempDirs) {
|
||||
let changes = yield promiseGetChanges(cmd.getDocId());
|
||||
for (var i = 0; i < changes.length; ++i) {
|
||||
var change = changes[i];
|
||||
if (null === changesAuthor || changesAuthor !== change.dc_user_id_original) {
|
||||
if (null === changesAuthor || changesAuthor !== change.user_id_original) {
|
||||
if (null !== changesAuthor) {
|
||||
changesBuffers.push(new Buffer(']', 'utf8'));
|
||||
let dataZipFile = Buffer.concat(changesBuffers);
|
||||
@ -269,15 +269,15 @@ function* processDownloadFromStorage(dataConvert, cmd, task, tempDirs) {
|
||||
var filePath = path.join(changesDir, fileName);
|
||||
fs.writeFileSync(filePath, dataZipFile);
|
||||
}
|
||||
changesAuthor = change.dc_user_id_original;
|
||||
var strDate = baseConnector.getDateTime(change.dc_date);
|
||||
changesHistoryData.push({'userid': changesAuthor, 'username': change.dc_user_name, 'date': strDate});
|
||||
changesAuthor = change.user_id_original;
|
||||
var strDate = baseConnector.getDateTime(change.change_date);
|
||||
changesHistoryData.push({'userid': changesAuthor, 'username': change.user_name, 'date': strDate});
|
||||
changesBuffers = [];
|
||||
changesBuffers.push(new Buffer('[', 'utf8'));
|
||||
} else {
|
||||
changesBuffers.push(new Buffer(',', 'utf8'));
|
||||
}
|
||||
changesBuffers.push(new Buffer(change.dc_data, 'utf8'));
|
||||
changesBuffers.push(new Buffer(change.change_data, 'utf8'));
|
||||
}
|
||||
if (null !== changesBuffers) {
|
||||
changesBuffers.push(new Buffer(']', 'utf8'));
|
||||
|
||||
@ -32,10 +32,10 @@ DROP TABLE IF EXISTS `doc_changes`;
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `doc_callbacks` (
|
||||
`dc_key` varchar(255) NOT NULL,
|
||||
`dc_callback` text NOT NULL,
|
||||
`dc_baseurl` text NOT NULL,
|
||||
PRIMARY KEY (`dc_key`)
|
||||
`id` varchar(255) NOT NULL,
|
||||
`callback` text NOT NULL,
|
||||
`baseurl` text NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
--
|
||||
@ -50,14 +50,14 @@ CREATE TABLE IF NOT EXISTS `doc_callbacks` (
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `doc_changes` (
|
||||
`dc_key` varchar(255) NOT NULL,
|
||||
`dc_change_id` int(10) unsigned NOT NULL,
|
||||
`dc_user_id` varchar(255) NOT NULL,
|
||||
`dc_user_id_original` varchar(255) NOT NULL,
|
||||
`dc_user_name` varchar(255) NOT NULL,
|
||||
`dc_data` longtext NOT NULL,
|
||||
`dc_date` datetime NOT NULL,
|
||||
PRIMARY KEY (`dc_key`,`dc_change_id`)
|
||||
`id` varchar(255) NOT NULL,
|
||||
`change_id` int(10) unsigned NOT NULL,
|
||||
`user_id` varchar(255) NOT NULL,
|
||||
`user_id_original` varchar(255) NOT NULL,
|
||||
`user_name` varchar(255) NOT NULL,
|
||||
`change_data` longtext NOT NULL,
|
||||
`change_date` datetime NOT NULL,
|
||||
PRIMARY KEY (`id`,`change_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
--
|
||||
@ -72,15 +72,14 @@ CREATE TABLE IF NOT EXISTS `doc_changes` (
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `task_result` (
|
||||
`tr_key` varchar(255) NOT NULL,
|
||||
`tr_format` varchar(45) NOT NULL,
|
||||
`tr_status` tinyint(3) NOT NULL,
|
||||
`tr_status_info` int(10) NOT NULL,
|
||||
`tr_last_open_date` datetime NOT NULL,
|
||||
`tr_title` varchar(255) NOT NULL,
|
||||
`tr_user_index` int(10) unsigned NOT NULL DEFAULT 1,
|
||||
`tr_change_id` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`tr_key`)
|
||||
`id` varchar(255) NOT NULL,
|
||||
`status` tinyint(3) NOT NULL,
|
||||
`status_info` int(10) NOT NULL,
|
||||
`last_open_date` datetime NOT NULL,
|
||||
`title` varchar(255) NOT NULL,
|
||||
`user_index` int(10) unsigned NOT NULL DEFAULT 1,
|
||||
`change_id` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
--
|
||||
|
||||
Reference in New Issue
Block a user