Put local variables footer in all c, h files.
[idzebra-moved-to-github.git] / test / api / t15.c
1 /* $Id: t15.c,v 1.4 2006-05-10 08:13:35 adam Exp $
2    Copyright (C) 2004-2005
3    Index Data ApS
4
5 This file is part of the Zebra server.
6
7 Zebra is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 Zebra is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with Zebra; see the file LICENSE.zebra.  If not, write to the
19 Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA.
21 */
22
23 #if HAVE_SYS_STAT_H
24 #include <sys/stat.h>
25 #endif
26 #if HAVE_SYS_TYPES_H
27 #include <sys/types.h>
28 #endif
29 #if HAVE_UNISTD_H
30 #include <unistd.h>
31 #endif
32 #if HAVE_SYS_WAIT_H
33 #include <sys/wait.h>
34 #endif
35
36 #include "testlib.h"
37
38 static void update_process(ZebraService zs, int iter)
39 {
40     int i;
41     for (i = 0; i<iter; i++)
42     {
43         const char *rec = "<gils><title>some</title></gils>";
44         ZebraHandle zh = zebra_open(zs, 0);
45         // printf("update_record i=%d\n", i);
46         zebra_add_record(zh, rec, strlen(rec));
47         if ((i % 30) == 0 || i == iter-1)
48             zebra_commit(zh);
49         zebra_close(zh);
50     }
51 }
52
53 static void search_process(ZebraService zs, int iter)
54 {
55     zint hits_max = 0;
56     int i;
57     for (i = 0; i<iter; i++)
58     {
59         ZebraHandle zh = zebra_open(zs, 0);
60         zint hits;          
61         ZEBRA_RES res = zebra_search_PQF(zh, "@attr 1=4 some", "default",
62                                          &hits);
63         YAZ_CHECK(res == ZEBRA_OK);
64         
65         YAZ_CHECK(hits >= hits_max);
66         if (hits < hits_max)
67             printf("hits=%lld hits_max=%lld\n", hits, hits_max);
68             hits_max = hits;
69         zebra_close(zh);
70     }
71 }
72
73 static pid_t fork_service(ZebraService zs, int iter,
74                            void (*f)(ZebraService zs, int iter))
75 {
76     pid_t pid = fork();
77
78     YAZ_CHECK(pid != -1);
79     if (pid)
80         return pid;
81     
82     (*f)(zs, iter);
83     YAZ_CHECK_TERM;
84 }
85
86 static void tst(int argc, char **argv)
87 {
88     ZebraService zs;
89     ZebraHandle zh;
90     
91     mkdir("register", 0775);
92     mkdir("shadow", 0775);
93
94     zs = tl_start_up("zebra15.cfg", argc, argv);
95     YAZ_CHECK(zs);
96
97     zh = zebra_open(zs, 0);
98     YAZ_CHECK(zh);
99
100     YAZ_CHECK(zebra_select_database(zh, "Default") == ZEBRA_OK);
101
102     zebra_init(zh);
103
104     YAZ_CHECK(zebra_create_database (zh, "Default") == ZEBRA_OK);
105     YAZ_CHECK(zebra_select_database(zh, "Default") == ZEBRA_OK);
106     zebra_close(zh);
107
108     update_process(zs, 1);
109
110 #if HAVE_SYS_WAIT_H
111 #if HAVE_UNISTD_H
112     if (1)
113     {
114         int status[3];
115         pid_t pids[3];
116
117         pids[0] = fork_service(zs, 200, search_process);
118         pids[1] = fork_service(zs, 20, update_process);
119         pids[2] = fork_service(zs, 20, update_process);
120         waitpid(pids[0], &status[0], 0);
121         YAZ_CHECK(status[0] == 0);
122         waitpid(pids[1], &status[1], 0);
123         YAZ_CHECK(status[1] == 0);
124         waitpid(pids[2], &status[2], 0);
125         YAZ_CHECK(status[2] == 0);
126     }
127 #endif
128 #endif
129
130 }
131
132 TL_MAIN
133 /*
134  * Local variables:
135  * c-basic-offset: 4
136  * indent-tabs-mode: nil
137  * End:
138  * vim: shiftwidth=4 tabstop=8 expandtab
139  */
140