mirror of
https://github.com/whyour/qinglong.git
synced 2025-11-22 16:38:33 +08:00
* Initial plan * Stop running tasks before starting new scheduled instance Co-authored-by: whyour <22700758+whyour@users.noreply.github.com> * Add multi-instance support and fix stop to kill all running instances - Add allow_multiple_instances field to Crontab model (default: 0 for single instance) - Add validation for new field in commonCronSchema - Add getAllPids and killAllTasks utility functions - Update stop method to kill ALL running instances of a task - Update runCron to respect allow_multiple_instances config - Backward compatible: defaults to single instance mode Co-authored-by: whyour <22700758+whyour@users.noreply.github.com> * Add UI support for allow_multiple_instances configuration - Add allow_multiple_instances field to ICrontab interface - Add instance mode selector in task creation/edit modal - Add translations for instance mode in Chinese and English - Default to single instance mode for backward compatibility Co-authored-by: whyour <22700758+whyour@users.noreply.github.com> * Add allow_multiple_instances column migration and optimize db.ts - Add allow_multiple_instances column to Crontabs table migration - Refactor migration code to use data-driven approach - Replace 11 individual try-catch blocks with single loop - Improve code maintainability and readability Co-authored-by: whyour <22700758+whyour@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: whyour <22700758+whyour@users.noreply.github.com>
60 lines
2.0 KiB
TypeScript
60 lines
2.0 KiB
TypeScript
import Logger from './logger';
|
|
import { EnvModel } from '../data/env';
|
|
import { CrontabModel } from '../data/cron';
|
|
import { DependenceModel } from '../data/dependence';
|
|
import { AppModel } from '../data/open';
|
|
import { SystemModel } from '../data/system';
|
|
import { SubscriptionModel } from '../data/subscription';
|
|
import { CrontabViewModel } from '../data/cronView';
|
|
import { sequelize } from '../data';
|
|
|
|
export default async () => {
|
|
try {
|
|
await CrontabModel.sync();
|
|
await DependenceModel.sync();
|
|
await AppModel.sync();
|
|
await SystemModel.sync();
|
|
await EnvModel.sync();
|
|
await SubscriptionModel.sync();
|
|
await CrontabViewModel.sync();
|
|
|
|
// 初始化新增字段
|
|
const migrations = [
|
|
{
|
|
table: 'CrontabViews',
|
|
column: 'filterRelation',
|
|
type: 'VARCHAR(255)',
|
|
},
|
|
{ table: 'Subscriptions', column: 'proxy', type: 'VARCHAR(255)' },
|
|
{ table: 'CrontabViews', column: 'type', type: 'NUMBER' },
|
|
{ table: 'Subscriptions', column: 'autoAddCron', type: 'NUMBER' },
|
|
{ table: 'Subscriptions', column: 'autoDelCron', type: 'NUMBER' },
|
|
{ table: 'Crontabs', column: 'sub_id', type: 'NUMBER' },
|
|
{ table: 'Crontabs', column: 'extra_schedules', type: 'JSON' },
|
|
{ table: 'Crontabs', column: 'task_before', type: 'TEXT' },
|
|
{ table: 'Crontabs', column: 'task_after', type: 'TEXT' },
|
|
{ table: 'Crontabs', column: 'log_name', type: 'VARCHAR(255)' },
|
|
{
|
|
table: 'Crontabs',
|
|
column: 'allow_multiple_instances',
|
|
type: 'NUMBER',
|
|
},
|
|
{ table: 'Envs', column: 'isPinned', type: 'NUMBER' },
|
|
];
|
|
|
|
for (const migration of migrations) {
|
|
try {
|
|
await sequelize.query(
|
|
`alter table ${migration.table} add column ${migration.column} ${migration.type}`,
|
|
);
|
|
} catch (error) {
|
|
// Column already exists or other error, continue
|
|
}
|
|
}
|
|
|
|
Logger.info('✌️ DB loaded');
|
|
} catch (error) {
|
|
Logger.error('✌️ DB load failed', error);
|
|
}
|
|
};
|