Lab1
Loading...
Searching...
No Matches
rapidjson_storage_strategy.h
1#pragma once
2#include "istorage_strategy.h"
3#include "rapidjson/document.h"
4#include "rapidjson/writer.h"
5#include "rapidjson/stringbuffer.h"
6#include "rapidjson/prettywriter.h"
7#include <QFile>
8#include <QDebug>
9#include <fstream>
10#include <sstream>
11
13public:
14 bool save(const QString& filePath,
15 const QList<Note>& notes,
16 const QList<Schema>& schemas,
17 const QMap<QString, int>& stats) override
18 {
19 using namespace rapidjson;
20 StringBuffer sb;
21 PrettyWriter<StringBuffer> writer(sb);
22
23 writer.StartObject();
24
25 writer.Key("schemas");
26 writer.StartArray();
27 for (const auto& schema : schemas) {
28 writer.StartObject();
29 writer.Key("name");
30 writer.String(schema.getName().toStdString().c_str());
31
32 writer.Key("fields");
33 writer.StartArray();
34 for (const auto& field : schema.getFields()) {
35 writer.StartObject();
36 writer.Key("name"); writer.String(field.name.toStdString().c_str());
37 writer.Key("type"); writer.String(field.type.toStdString().c_str());
38 writer.EndObject();
39 }
40 writer.EndArray();
41 writer.EndObject();
42 }
43 writer.EndArray();
44
45 writer.Key("notes");
46 writer.StartArray();
47 for (const auto& note : notes) {
48 writer.StartObject();
49 writer.Key("title"); writer.String(note.getTitle().toStdString().c_str());
50 writer.Key("schemaId"); writer.Int(note.getSchemaId());
51
52 writer.Key("fields");
53 writer.StartObject();
54 auto fields = note.getFields();
55 for (auto it = fields.begin(); it != fields.end(); ++it) {
56 writer.Key(it.key().toStdString().c_str());
57 writer.String(it.value().toStdString().c_str());
58 }
59 writer.EndObject();
60
61 writer.Key("tags");
62 writer.StartArray();
63 for (const auto& tag : note.getTags()) {
64 writer.String(tag.toStdString().c_str());
65 }
66 writer.EndArray();
67
68 writer.Key("image"); writer.String(note.getImage().toStdString().c_str());
69 writer.Key("pinned"); writer.Bool(note.isPinned());
70
71 writer.EndObject();
72 }
73 writer.EndArray();
74
75 writer.Key("stats");
76 writer.StartObject();
77 for(auto it = stats.begin(); it != stats.end(); ++it) {
78 writer.Key(it.key().toStdString().c_str());
79 writer.Int(it.value());
80 }
81 writer.EndObject();
82
83 writer.EndObject();
84
85 std::ofstream file(filePath.toStdString());
86 if (!file.is_open()) return false;
87
88 file << sb.GetString();
89 qInfo() << "Saved via RapidJSON Strategy";
90 return true;
91 }
92
93 bool load(const QString& filePath,
94 QList<Note>& notes,
95 QList<Schema>& schemas,
96 QMap<QString, int>& stats) override
97 {
98
99 qWarning() << "RapidJSON load not implemented for full structure yet.";
100 return false;
101 }
102};
Інтерфейс для реалізації патерну Стратегія (Strategy Pattern).
Definition istorage_strategy.h:15
Definition rapidjson_storage_strategy.h:12
bool load(const QString &filePath, QList< Note > &notes, QList< Schema > &schemas, QMap< QString, int > &stats) override
Завантажує дані з файлу.
Definition rapidjson_storage_strategy.h:93
bool save(const QString &filePath, const QList< Note > &notes, const QList< Schema > &schemas, const QMap< QString, int > &stats) override
Зберігає дані у вказаний файл.
Definition rapidjson_storage_strategy.h:14