[软工初级实训]storage

温馨提示:此内容可能已过期/不符合项目要求/编译无法通过。

作者:zhc

#include "Storage.hpp"
#include "Path.hpp"
#include <fstream>
using namespace std;
std::shared_ptr<Storage> Storage::m_instance = nullptr;
Storage::Storage() {
    m_dirty = false;
    readFromFile();
};
bool Storage::readFromFile(void) {
    ifstream fusers(Path::userPath);
    ifstream fmeetings(Path::meetingPath);
    if (!(fusers.is_open() && fmeetings.is_open())){
        return false;
    }
    string str1;
    while (getline(fusers, str1)) {
        string name, password, email, phone;
        if(str1.size() == 0) {
            continue;
        }
        int len=str1.size();
        vector<int>pos;
        for(int i = 0; i < len ; i++){
            if(str1[i] == '"')
            pos.push_back(i);
          }
        for(int i = pos[0]+1 ; i < pos[1] ; i++){
            name.push_back(str1[i]);
        }    
           for(int i = pos[2]+1 ; i < pos[3] ; i++){
               password.push_back(str1[i]);
        }
           for(int i = pos[4]+1 ; i < pos[5] ; i++){
               email.push_back(str1[i]);
        }
           for(int i = pos[6]+1 ; i < pos[7] ; i++){
               phone.push_back(str1[i]);
        }
        User u(name, password, email, phone);
        m_userList.push_back(u);
    }
    fusers.close();
    string str2;
    while (getline(fmeetings, str2)) {
        string sponsor, participators, startDate, endDate, title;
        if(str2.size() == 0) {
                continue;
        }
        int len=str2.size();
        vector<int> pos;
        for(int i = 0; i < len ; i++){
            if(str2[i] == '"')
            pos.push_back(i);
          }
              for(int i = pos[0]+1 ; i < pos[1] ; i++){
                sponsor.push_back(str2[i]);
            }
            for(int i = pos[2]+1 ; i < pos[3] ; i++){
                participators.push_back(str2[i]);
            }
            for(int i = pos[4]+1 ; i < pos[5] ; i++){
                startDate.push_back(str2[i]);
            }    
            for(int i = pos[6]+1 ; i < pos[7] ; i++){
                endDate.push_back(str2[i]);
            }
            for(int i = pos[8]+1 ; i < pos[9] ; i++){
                title.push_back(str2[i]);
            }
        vector<string> v_participators;
        int len2=participators.size();
        string parti;
        for(int i=0;i<len2;i++){
            if(participators[i]!='&'){
                parti.push_back(participators[i]);
            }
            else{
                string temp=parti;
                v_participators.push_back(temp);
                parti.clear();
            }
        }
        v_participators.push_back(parti);
        Date start(startDate);
        Date end(endDate);
        Meeting meeting(sponsor, v_participators, start, end, title);
        m_meetingList.push_back(meeting);
    }
    fmeetings.close();
    return true;
};
bool Storage::writeToFile(void) {
    ofstream fusers(Path::userPath);
    ofstream fmeetings(Path::meetingPath);
    if (!(fusers.is_open() && fmeetings.is_open())){
        return false;
    }
    for (auto it = m_userList.begin();it != m_userList.end();it++) {
        fusers<<'"'<<(*it).getName()<<'"'<<','<<'"'<<(*it).getPassword()<<'"'<<','<<'"'<<(*it).getEmail()<<'"'<<','<<'"'<<(*it).getPhone()<<'"';
        fusers<<"\n";
    }
    fusers.close();
       for(auto it = m_meetingList.begin();it != m_meetingList.end();it++)  {
       fmeetings<<'"'<<(*it).getSponsor()<<'"'<<','<<'"';
       vector<string> par = (*it).getParticipator();
       int len = par.size();
       for(int i = 0 ; i < len-1 ; i++){
             fmeetings<<par[i]<<'&';
       }
       fmeetings<<par[len-1];
       fmeetings<<'"'<<','<<'"'<<(*it).getStartDate().dateToString((*it).getStartDate())<<'"'<<','<<'"'<<(*it).getEndDate().dateToString((*it).getEndDate())<<'"'<<','<<'"'<<(*it).getTitle()<<'"';
         fmeetings<<"\n";
     }
    fmeetings.close();
    return true;
};
std::shared_ptr<Storage> Storage::getInstance(void) {
    if (m_instance == nullptr) {
        m_instance = shared_ptr<Storage>(new Storage());
    }
    return m_instance;
};
Storage::~Storage() {
    sync();
};
void Storage::createUser(const User &t_user) {
    m_userList.push_back(t_user);
    m_dirty = true;
};
std::list<User> Storage::queryUser(std::function<bool(const User &)> filter) const {
    std::list<User> result;
    for (auto it = m_userList.begin();it != m_userList.end();it++) {
        if (filter(*it)){
            result.push_back(*it);
        }
    }
    return result;
};
int Storage::updateUser(std::function<bool(const User &)> filter,
             std::function<void(User &)> switcher) {
    int num = 0;
    for (auto it = m_userList.begin();it != m_userList.end();it++) {
        if (filter(*it)) {
            switcher(*it);
            num++;
        }
    }
    if(num > 0){
        m_dirty = true;
    }
    return num;
};
int Storage::deleteUser(std::function<bool(const User &)> filter) {
    int num = 0;
    for (auto it = m_userList.begin();it != m_userList.end();) {
        if (filter(*it)) {
            it = m_userList.erase(it);
            num++;
        }
        else{
            it++;
        }
    }
    if (num > 0){
        m_dirty = true;
    }
    return num;
};
void Storage::createMeeting(const Meeting &t_meeting) {
    m_meetingList.push_back(t_meeting);
    m_dirty = true;
};
std::list<Meeting> Storage::queryMeeting(
  std::function<bool(const Meeting &)> filter) const {
    list<Meeting> meeting;
    for (auto it = m_meetingList.begin();it != m_meetingList.end();it++) {
        if (filter(*it))
            meeting.push_back(*it);
    }
    return meeting;
};
int Storage::updateMeeting(std::function<bool(const Meeting &)> filter,
                std::function<void(Meeting &)> switcher) {
    int num = 0;
    for (auto it = m_meetingList.begin();it != m_meetingList.end();it++) {
        if (filter(*it)) {
            switcher(*it);
            num++;
        }
    }
    if (num > 0){
        m_dirty = true;
    }
    return num;
};
int Storage::deleteMeeting(std::function<bool(const Meeting &)> filter) {
    int num = 0;
    for (auto it = m_meetingList.begin();it != m_meetingList.end();) {
        if (filter(*it)) {
            it = m_meetingList.erase(it);
            num++;
        }
        else
            it++;
    }
    if (num > 0){
        m_dirty = true;
    }
    return num;
};
bool Storage::sync(void) {
    m_dirty = false;
    return writeToFile();
};
支持 makedown语法