198 行
7.3 KiB
PHP
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";
|
|
}
|
|
?>
|