Skip to content

Commit 2a407bf

Browse files
committed
2012-06-13
1 parent 2298c22 commit 2a407bf

File tree

4 files changed

+76
-1
lines changed

4 files changed

+76
-1
lines changed

2012-06-13/913.c

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#include<fcntl.h>
2+
#include<stdio.h>
3+
#include<stdlib.h>
4+
#include<string.h>
5+
#include<gdbm-ndbm.h>
6+
7+
int main(void){
8+
DBM *counterdb;
9+
datum key, value;
10+
char *query_string;
11+
int value_body;
12+
fputs("Content-Type: text/plain; charset=utf-8\n\n", stdout);
13+
query_string = getenv("QUERY_STRING");
14+
if(!query_string) query_string = "";
15+
counterdb = dbm_open("counterdb", O_RDWR | O_CREAT,
16+
S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
17+
if(!counterdb){
18+
fputs("database error.\n", stdout);
19+
return 0;
20+
}
21+
if(query_string[0] == '\0'){
22+
for(key = dbm_firstkey(counterdb); key.dptr != NULL;
23+
key = dbm_nextkey(counterdb)){
24+
value = dbm_fetch(counterdb, key);
25+
fwrite(key.dptr, 1, key.dsize, stdout);
26+
fputs(" = ", stdout);
27+
printf("%d\n", *(int *)value.dptr);
28+
}
29+
}
30+
else{
31+
key.dptr = query_string;
32+
key.dsize = strlen(query_string);
33+
value = dbm_fetch(counterdb, key);
34+
if(value.dptr)
35+
(*(int *)value.dptr)++;
36+
else{
37+
value_body = 1;
38+
value.dptr = (char *)&value_body;
39+
value.dsize = sizeof(int);
40+
}
41+
dbm_store(counterdb, key, value, DBM_REPLACE);
42+
printf("%d\n", *(int *)value.dptr);
43+
}
44+
dbm_close(counterdb);
45+
return 0;
46+
}

2012-06-13/OMakefile

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CFLAGS += -g -lgdbm_compat
2+
3+
CProgram(913, 913)
4+
5+
report: ../lib.m4 report.m4 913.c
6+
m4 report.m4 | nkf -W8 -e > report
7+
8+
.DEFAULT: report

2012-06-13/report.m4

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
include(`../lib.m4')dnl
2+
header(`9', `913', `WWWプログラミング')dnl
3+
4+
今回用いたプログラムのソースコードを以下に示す。
5+
6+
source(`913.c')dnl
7+
8+
この CGI は、複数の名前付きカウンタを提供する。データの保存、読み出しには gdbm
9+
ライブラリを用いた。
10+
11+
このプログラムは、環境変数 QUERY_STRING がセットされていないか空のどちらかであれ
12+
ば、データベースの情報全てを読み出して出力する。環境変数 QUERY_STRING が空でない
13+
文字列であれば、その文字列をキーとしてデータベースから値を読み出し、インクリメン
14+
トした値を同じキーで書き込み、インクリメント後の値を出力する。
15+
16+
http://www.coins.tsukuba.ac.jp/~s1111365/syspro/2012-06-13/913 に今回作成した
17+
CGI を設置した。この URI でアクセスすると全てのカウンタの情報を出力し、末尾に ?
18+
とカウンタ名を付けてアクセスすると指定したカウンタをインクリメントし、インクリメ
19+
ント後のカウンタの値を出力する。
20+
21+
footer()dnl

OMakeroot

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ open build/C
33

44
DefineCommandVars()
55

6-
.SUBDIRS: . 2012-04-18 2012-04-25 2012-05-02 2012-05-09 2012-05-16
6+
.SUBDIRS: . 2012-04-18 2012-04-25 2012-05-02 2012-05-09 2012-06-13

0 commit comments

Comments
 (0)