試験ノート - 実装ドリル 1.0
読み取り中…
検索中…
一致する文字列を見つけられません
comment_only.cpp
1// =================================
2// includes
3// =================================
4// tip : "mini_db.hpp"
5// arpa/inet, netinet/in, sys/socket, unistd
6// cerrno, csignal, cstdlib, cstring
7// fstream, iostream, sstream, vector
8
9// =================================
10// anonymous namespace (TU 限定)
11// =================================
12// volatile sig_atomic_t g_running = 1; // SIGINT で 0
13//
14// void on_sigint(int)
15// {
16// // g_running = 0; // フラグを倒すだけ (signal-safe)
17// }
18
19// =================================
20// main()
21// =================================
22// int main(int argc, char **argv)
23// {
24// // 引数チェック (argc != 3) / "Wrong number of arguments" -> return 1
25//
26// // port = atoi(argv[1]) / 範囲チェック (1..65535)
27//
28// // signal(SIGINT, on_sigint)
29// // signal(SIGPIPE, SIG_IGN)
30//
31// // MiniDb server(port, argv[2]);
32// // server.setup();
33// // server.run();
34// // return 0;
35// }
36
37// =================================
38// error
39// =================================
40// void fatal(void)
41// {
42// // cerr << "Fatal error"
43// // exit(1)
44// }
45
46// =================================
47// ctor / dtor
48// =================================
49
50// MiniDb::MiniDb(int port, const string &path)
51// : メンバ初期化子で port_, path_ を保存
52// listen_fd_ = -1, max_fd_ = -1
53// {
54// // FD_ZERO(&active_fds_);
55// // ※ ここでは socket / load は呼ばない (setup() で行う)
56// }
57
58// MiniDb::~MiniDb()
59// {
60// // buffers_ を走査して全クライアント fd を close
61// // listen_fd_ >= 0 なら close
62// // ※ save() はここでは呼ばない (SIGINT 経路で run() の最後)
63// }
64
65// =================================
66// setup() & helper (load)
67// =================================
68
69// void MiniDb::setup()
70// {
71// // recovery db_ : load()
72//
73// // create socket, and error handling
74// // set socket option for reuse
75//
76// // preparation sockaddr_in for bind, and listen
77// // sockaddr_in : family / sin_addr.s_addr / sin_port
78// // To bind / listen(128) / fatal
79// // Tip reinterpret_cast<sockaddr *>(&addr) sockaddr_in * -> sockaddr *
80//
81// // set active_fds_ and max_fd_
82//
83// // cout << "ready"
84// }
85
86// void MiniDb::load()
87// {
88// // ifstream(path_) — 開けなければ return
89// // while (ifs >> key >> value)
90// // db_[key] = value;
91// }
92
93// =================================
94// run() のメインループ
95// =================================
96
97// void MiniDb::run()
98// {
99// // while (g_running)
100// // rfds = active_fds_; // ビット集合を複製
101// // select(max_fd_+1, &rfds, NULL, NULL, NULL)
102// // EINTR -> continue
103// // その他 -> fatal
104// // for (fd = 0..max_fd_ && rv > 0):
105// // FD_ISSET でなければ skip
106// // rv-- : 動きのあったfdのカウントを減らす。
107// // listen_fd_ -> accept_client()
108// // else -> recv_data(fd)
109// //
110// // ループ脱出後に save(); // SIGINT 安全な場所で永続化
111// }
112
113// =================================
114// accept_client()
115// =================================
116
117// void MiniDb::accept_client()
118// {
119// // new fd : accept() , 失敗時はfatal()
120// // update active_fds_
121// // update max_fd_
122// // set buffers_[fd] <- ""
123// }
124
125// =================================
126// recv_data() & helper (disconnect)
127// =================================
128
129// void MiniDb::recv_data(int fd)
130// {
131// // recv to buf[1024] (and return n)
132//
133// // error or end case : n <= 0
134// // end : n < 0 && EINTR -> silent return
135// // other -> disconnect(fd) return
136//
137// // accumulation in the recv buffer
138// // &acc <- buffer_[fd]
139// // append : acc <- receve buf
140//
141// // <- pos (std::string::size_type)
142// // loop : execute commands line by line : until nopos (pos = find('\n')
143// // cut out a line
144// // erase until '\n'
145// // handle_command() -> after response string use
146// // send return string
147//
148// // (Leave the rest in buffer_ and wait for the next recv)
149// }
150
151// void MiniDb::disconnect(int fd)
152// {
153// // ファイルディスクリプタを閉じる
154// // フィルタ解除 : FD_CLR
155// // fdで受信したバッファを破棄。
156// // max_fd_ を巻き戻す (listen_fd_ より下げない)
157// }
158
159// =================================
160// handle_command()
161// =================================
162
163// 入出力対応:
164// POST <k> <v> -> "0\n"
165// GET <k> (hit) -> "0 <v>\n"
166// GET <k> (miss) -> "1\n"
167// DELETE <k> (hit) -> "0\n"
168// DELETE <k> (miss) -> "1\n"
169// それ以外 / 空行 -> "2\n"
170
171// std::string MiniDb::handle_command(const std::string &line)
172// {
173// // istringstream でトークン列に分解 (vector<string> tok)
174// //
175// // tok.empty() -> "2\n"
176// // tok[0]=="POST" && size==3 -> db_[k]=v / "0\n"
177// // tok[0]=="GET" && size==2 -> find / hit "0 v\n" / miss "1\n"
178// // tok[0]=="DELETE" && size==2 -> erase>0 "0\n" / 0 "1\n"
179// // それ以外 (引数数不一致を含む) -> "2\n"
180// }
181
182// =================================
183// save()
184// =================================
185
186// void MiniDb::save() const
187// {
188// // ofstream(path_) — 開けなければ return
189// // for each db_ entry:
190// // ofs << key << " " << value << "\n";
191// }