1
0
mirror of https://github.com/xuthus83/pigallery2.git synced 2024-11-03 21:04:03 +08:00
pigallery2/backend/model/sql/SQLConnection.ts

161 lines
4.7 KiB
TypeScript
Raw Normal View History

2018-03-31 03:30:30 +08:00
import 'reflect-metadata';
import {Connection, ConnectionOptions, createConnection, getConnection} from 'typeorm';
import {UserEntity} from './enitites/UserEntity';
import {UserRoles} from '../../../common/entities/UserDTO';
import {PhotoEntity} from './enitites/PhotoEntity';
import {DirectoryEntity} from './enitites/DirectoryEntity';
import {Config} from '../../../common/config/private/Config';
import {SharingEntity} from './enitites/SharingEntity';
import {DataBaseConfig, DatabaseType} from '../../../common/config/private/IPrivateConfig';
import {PasswordHelper} from '../PasswordHelper';
import {ProjectPath} from '../../ProjectPath';
import {VersionEntity} from './enitites/VersionEntity';
import {Logger} from '../../Logger';
import {MediaEntity} from './enitites/MediaEntity';
import {VideoEntity} from './enitites/VideoEntity';
import {DataStructureVersion} from '../../../common/DataStructureVersion';
2018-11-26 07:26:29 +08:00
import {FileEntity} from './enitites/FileEntity';
2019-01-12 23:41:45 +08:00
import {FaceRegionEntry} from './enitites/FaceRegionEntry';
import {PersonEntry} from './enitites/PersonEntry';
2016-12-27 23:09:47 +08:00
export class SQLConnection {
2016-12-27 23:09:47 +08:00
constructor() {
2017-07-04 01:17:49 +08:00
}
2016-12-27 23:09:47 +08:00
2017-07-04 01:17:49 +08:00
private static connection: Connection = null;
2016-12-27 23:09:47 +08:00
2017-07-04 01:17:49 +08:00
public static async getConnection(): Promise<Connection> {
if (this.connection == null) {
const options: any = this.getDriver(Config.Server.database);
2018-12-22 18:49:56 +08:00
// options.name = 'main';
2017-10-20 00:08:07 +08:00
options.entities = [
UserEntity,
2018-11-26 07:26:29 +08:00
FileEntity,
2019-01-12 23:41:45 +08:00
FaceRegionEntry,
PersonEntry,
MediaEntity,
2017-10-20 00:08:07 +08:00
PhotoEntity,
VideoEntity,
DirectoryEntity,
SharingEntity,
VersionEntity
2017-10-20 00:08:07 +08:00
];
options.synchronize = false;
2019-01-14 00:38:39 +08:00
// options.logging = 'all';
2017-10-20 00:08:07 +08:00
this.connection = await createConnection(options);
2018-01-31 09:01:16 +08:00
await SQLConnection.schemeSync(this.connection);
2016-12-27 23:09:47 +08:00
}
2017-07-04 01:17:49 +08:00
return this.connection;
}
2016-12-27 23:09:47 +08:00
2017-07-08 18:43:42 +08:00
public static async tryConnection(config: DataBaseConfig) {
2017-07-13 00:31:19 +08:00
try {
2018-03-31 03:30:30 +08:00
await getConnection('test').close();
2017-07-13 00:31:19 +08:00
} catch (err) {
}
const options: any = this.getDriver(config);
2018-03-31 03:30:30 +08:00
options.name = 'test';
options.entities = [
UserEntity,
2018-11-26 07:26:29 +08:00
FileEntity,
2019-01-12 23:41:45 +08:00
FaceRegionEntry,
PersonEntry,
MediaEntity,
PhotoEntity,
VideoEntity,
DirectoryEntity,
SharingEntity,
VersionEntity
];
options.synchronize = false;
// options.logging = "all";
2017-10-20 00:08:07 +08:00
const conn = await createConnection(options);
2018-01-31 09:01:16 +08:00
await SQLConnection.schemeSync(conn);
await conn.close();
return true;
}
2018-03-31 03:30:30 +08:00
public static async init(): Promise<void> {
const connection = await this.getConnection();
const userRepository = connection.getRepository(UserEntity);
const admins = await userRepository.find({role: UserRoles.Admin});
if (admins.length === 0) {
const a = new UserEntity();
2018-03-31 03:30:30 +08:00
a.name = 'admin';
a.password = PasswordHelper.cryptPassword('admin');
a.role = UserRoles.Admin;
await userRepository.save(a);
}
}
2018-01-31 09:01:16 +08:00
private static async schemeSync(connection: Connection) {
let version = null;
try {
version = await connection.getRepository(VersionEntity).findOne();
} catch (ex) {
}
if (version && version.version === DataStructureVersion) {
return;
}
2018-03-31 03:30:30 +08:00
Logger.info('Updating database scheme');
if (!version) {
version = new VersionEntity();
}
version.version = DataStructureVersion;
2018-12-23 23:50:20 +08:00
let users: UserEntity[] = [];
try {
users = await connection.getRepository(UserEntity).createQueryBuilder('user').getMany();
} catch (ex) {
}
await connection.dropDatabase();
await connection.synchronize();
await connection.getRepository(VersionEntity).save(version);
2018-12-22 18:49:56 +08:00
try {
await connection.getRepository(UserEntity).save(users);
} catch (e) {
await connection.dropDatabase();
await connection.synchronize();
await connection.getRepository(VersionEntity).save(version);
Logger.warn('Could not move users to the new db scheme, deleting them. Details:' + e.toString());
}
}
2017-10-20 00:08:07 +08:00
private static getDriver(config: DataBaseConfig): ConnectionOptions {
let driver: ConnectionOptions = null;
if (config.type === DatabaseType.mysql) {
driver = {
2018-03-31 03:30:30 +08:00
type: 'mysql',
2017-07-08 18:43:42 +08:00
host: config.mysql.host,
port: 3306,
username: config.mysql.username,
password: config.mysql.password,
database: config.mysql.database
};
} else if (config.type === DatabaseType.sqlite) {
driver = {
2018-03-31 03:30:30 +08:00
type: 'sqlite',
2017-10-20 00:08:07 +08:00
database: ProjectPath.getAbsolutePath(config.sqlite.storage)
};
}
return driver;
2017-07-08 18:43:42 +08:00
}
2016-12-27 23:09:47 +08:00
2017-07-14 05:39:09 +08:00
public static async close() {
try {
if (this.connection != null) {
await this.connection.close();
2017-12-20 00:19:48 +08:00
this.connection = null;
}
2017-07-14 05:39:09 +08:00
} catch (err) {
console.error(err);
2017-07-14 05:39:09 +08:00
}
}
2016-12-27 23:09:47 +08:00
2017-07-04 01:17:49 +08:00
}