Blob


1 use errors;
2 use fmt;
3 use getopt;
4 use io;
5 use log;
6 use net::dial;
7 use net::ip;
8 use net;
9 use os;
10 use unix::signal;
12 use ev;
13 use http;
14 use sqlite3;
16 fn sighandler(sig: signal::sig, data: nullable *opaque) void = {
17 // Normal signal handler rules don't apply because ev
18 // decouples for us.
20 if (sig == signal::sig::TERM || sig == signal::sig::INT) {
21 log::printfln("got {}; quitting...", signal::signame(sig));
22 ev::loopbreak();
23 return;
24 };
26 log::fatalf("unexpected {}", signal::signame(sig));
27 };
29 fn homepage(req: *http::request, res: *http::reswriter) (void | io::error) = {
30 if (res.code == 0) {
31 http::reply(req, res, 200, "OK")?;
32 http::header(res, "Content-Type", "text/plain;charset=utf-8")?;
33 fmt::fprintfln(res, "こんにちは世界!")?;
34 res.done = false;
35 return;
36 };
38 fmt::fprintfln(res, "シンシャです。")?;
39 };
41 fn page2(req: *http::request, res: *http::reswriter) (void | io::error) = {
42 http::reply(req, res, 200, "OK")?;
43 http::header(res, "Content-Type", "text/plain;charset=utf-8")?;
44 fmt::fprintln(res, "Pagina 2")?;
45 };
47 export fn main() void = {
48 let db = sqlite3::open("shinsha.sqlite3")!;
49 defer sqlite3::close(db)!;
51 let stmt = sqlite3::prepare(db, "select $first, $second")!;
52 defer sqlite3::finalize(stmt)!;
54 sqlite3::bind(stmt, "$first", 42)!;
55 sqlite3::bind(stmt, 2, "hello from hare!")!;
56 // eg. set to null
57 //sqlite3::bind(stmt, "$text", void)!;
59 for (sqlite3::step(stmt)!) {
60 fmt::println(sqlite3::column_text(stmt, 0))!;
61 fmt::println(sqlite3::column_text(stmt, 1))!;
62 };
64 sqlite3::reset(stmt)!;
65 for (sqlite3::step(stmt)!) {
66 fmt::println(sqlite3::column_text(stmt, 0))!;
67 fmt::println(sqlite3::column_text(stmt, 1))!;
68 };
70 sqlite3::reset(stmt)!;
71 sqlite3::clear_bindings(stmt)!;
72 sqlite3::bind(stmt, "$first", "he-he-he!")!;
73 for (sqlite3::step(stmt)!) {
74 fmt::println(sqlite3::column_text(stmt, 0))!;
75 fmt::println(sqlite3::column_text(stmt, 1))!;
76 };
77 };
79 export fn main2() void = {
80 const cmd = getopt::parse(os::args,
81 "web manga reader",
82 ('d', "run in the foreground"),
83 ('v', "verbose output"),
84 );
85 defer getopt::finish(&cmd);
87 let debug = false;
88 let verbose = false;
90 for (let i = 0z; i < len(cmd.opts); i += 1) {
91 const opt = cmd.opts[i];
92 switch (opt.0) {
93 case 'd' =>
94 debug = true;
95 case 'v' =>
96 verbose = true;
97 case =>
98 abort();
99 };
100 };
102 log::printfln("should use debug {} and verbose {}", debug, verbose);
104 const addr = "localhost";
105 const port = "9090";
107 let (ips, port) = match(dial::resolve("tcp", addr, port)) {
108 case let err: net::dial::error =>
109 log::fatal("failed to resolve {}:{}: {}", addr, port,
110 dial::strerror(err));
111 case let pair: ([]ip::addr, u16) =>
112 yield pair;
113 };
115 for (let i = 0z; i < len(ips); i += 1) {
116 match (http::listen(ips[i], port, null)) {
117 case let err: net::error =>
118 log::fatal("failed to listen to {}:{}: {}",
119 ip::string(ips[i]), port, net::strerror(err));
120 case => yield;
121 };
122 };
124 http::handle("/", &homepage);
125 http::handle("/2", &page2);
127 ev::signal(signal::sig::INT, &sighandler, null)!;
128 ev::signal(signal::sig::TERM, &sighandler, null)!;
130 log::printfln("listening on {}:{}", addr, port);
131 match (ev::mainloop()) {
132 case void => yield;
133 case let err: errors::error =>
134 log::fatalf("mainloop failure: {}", errors::strerror(err));
135 };
137 log::printfln("exiting...");
138 };