文件
Parlz/migrate.php
T
2026-06-04 22:42:27 +08:00

198 行
7.3 KiB
PHP

<?php
require_once 'db.php';
class DataMigrator {
private $db;
public function __construct() {
$this->db = Database::getInstance();
}
public function migrate() {
echo "开始数据迁移...\n";
// 迁移用户数据
$this->migrateUsers();
// 迁移好友数据
$this->migrateFriends();
// 迁移群组数据
$this->migrateGroups();
// 迁移群成员数据
$this->migrateGroupMembers();
// 迁移消息数据
$this->migrateMessages();
echo "数据迁移完成!\n";
}
private function migrateUsers() {
echo "迁移用户数据...\n";
$usersJson = file_get_contents(__DIR__ . '/data/users.json');
$users = json_decode($usersJson, true);
foreach ($users as $user) {
$sql = "INSERT OR IGNORE INTO users (id, username, password, created_at, last_login, online, avatar)
VALUES (:id, :username, :password, :created_at, :last_login, :online, :avatar)";
$params = [
'id' => $user['id'],
'username' => $user['username'],
'password' => $user['password'],
'created_at' => $user['created_at'],
'last_login' => $user['last_login'],
'online' => isset($user['online']) ? ($user['online'] ? 1 : 0) : 0,
'avatar' => isset($user['avatar']) ? $user['avatar'] : ''
];
$this->db->execute($sql, $params);
}
echo "用户数据迁移完成\n";
}
private function migrateFriends() {
echo "迁移好友数据...\n";
$friendsJson = file_get_contents(__DIR__ . '/data/friends.json');
$friends = json_decode($friendsJson, true);
foreach ($friends as $friend) {
$sql = "INSERT OR IGNORE INTO friends (id, user_id, friend_id, created_at, status)
VALUES (:id, :user_id, :friend_id, :created_at, :status)";
$params = [
'id' => $friend['id'],
'user_id' => $friend['user_id'],
'friend_id' => $friend['friend_id'],
'created_at' => $friend['created_at'],
'status' => $friend['status']
];
$this->db->execute($sql, $params);
}
echo "好友数据迁移完成\n";
}
private function migrateGroups() {
echo "迁移群组数据...\n";
$groupsJson = file_get_contents(__DIR__ . '/data/groups.json');
$groups = json_decode($groupsJson, true);
foreach ($groups as $group) {
$sql = "INSERT OR IGNORE INTO groups (id, name, creator_id, created_at, avatar)
VALUES (:id, :name, :creator_id, :created_at, :avatar)";
$params = [
'id' => $group['id'],
'name' => $group['name'],
'creator_id' => $group['creator_id'],
'created_at' => $group['created_at'],
'avatar' => isset($group['avatar']) ? $group['avatar'] : ''
];
$this->db->execute($sql, $params);
// 迁移群公告
if (isset($group['announcements'])) {
foreach ($group['announcements'] as $announcement) {
$announcementSql = "INSERT OR IGNORE INTO group_announcements (id, group_id, content, created_by, created_at)
VALUES (:id, :group_id, :content, :created_by, :created_at)";
$announcementParams = [
'id' => $announcement['id'],
'group_id' => $group['id'],
'content' => $announcement['content'],
'created_by' => $announcement['created_by'],
'created_at' => $announcement['created_at']
];
$this->db->execute($announcementSql, $announcementParams);
}
}
}
echo "群组数据迁移完成\n";
}
private function migrateGroupMembers() {
echo "迁移群成员数据...\n";
$groupMembersJson = file_get_contents(__DIR__ . '/data/group_members.json');
$groupMembers = json_decode($groupMembersJson, true);
foreach ($groupMembers as $member) {
$sql = "INSERT OR IGNORE INTO group_members (group_id, user_id, role, joined_at)
VALUES (:group_id, :user_id, :role, :joined_at)";
$params = [
'group_id' => $member['group_id'],
'user_id' => $member['user_id'],
'role' => $member['role'],
'joined_at' => $member['joined_at']
];
$this->db->execute($sql, $params);
}
echo "群成员数据迁移完成\n";
}
private function migrateMessages() {
echo "迁移消息数据...\n";
$messagesJson = file_get_contents(__DIR__ . '/data/messages.json');
$messages = json_decode($messagesJson, true);
foreach ($messages as $message) {
$sql = "INSERT OR IGNORE INTO messages (id, sender_id, receiver_id, content, timestamp, read, is_image, is_group, recalled)
VALUES (:id, :sender_id, :receiver_id, :content, :timestamp, :read, :is_image, :is_group, :recalled)";
$params = [
'id' => $message['id'],
'sender_id' => $message['sender_id'],
'receiver_id' => $message['receiver_id'],
'content' => $message['content'],
'timestamp' => $message['timestamp'],
'read' => isset($message['read']) ? ($message['read'] ? 1 : 0) : 0,
'is_image' => isset($message['is_image']) ? ($message['is_image'] ? 1 : 0) : 0,
'is_group' => isset($message['is_group']) ? ($message['is_group'] ? 1 : 0) : 0,
'recalled' => isset($message['recalled']) ? ($message['recalled'] ? 1 : 0) : 0
];
$this->db->execute($sql, $params);
// 迁移消息引用
if (isset($message['quote'])) {
$quoteSql = "INSERT OR IGNORE INTO message_quotes (message_id, sender, content, quoted_message_id)
VALUES (:message_id, :sender, :content, :quoted_message_id)";
$quoteParams = [
'message_id' => $message['id'],
'sender' => $message['quote']['sender'],
'content' => $message['quote']['content'],
'quoted_message_id' => isset($message['quote']['message_id']) ? $message['quote']['message_id'] : null
];
$this->db->execute($quoteSql, $quoteParams);
}
}
echo "消息数据迁移完成\n";
}
}
// 执行迁移
if (php_sapi_name() === 'cli') {
$migrator = new DataMigrator();
$migrator->migrate();
} else {
echo "请在命令行中执行此脚本\n";
}
?>