1#! /usr/bin/ruby -w
2
3#=================================================================================================
4# Test cases of Curia for Ruby
5#                                                       Copyright (C) 2000-2005 Mikio Hirabayashi
6# This file is part of QDBM, Quick Database Manager.
7# QDBM is free software; you can redistribute it and/or modify it under the terms of the GNU
8# Lesser General Public License as published by the Free Software Foundation; either version
9# 2.1 of the License or any later version.  QDBM is distributed in the hope that it will be
10# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
12# details.
13# You should have received a copy of the GNU Lesser General Public License along with QDBM; if
14# not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
15# 02111-1307 USA.
16#=================================================================================================
17
18
19require 'curia'
20
21
22# main routine
23def main()
24  $0.gsub!(/.*\//, "")
25  (ARGV.length >= 1) || usage()
26  if(ARGV[0] == "write")
27    rv = runwrite()
28  elsif(ARGV[0] == "read")
29    rv = runread()
30  elsif(ARGV[0] == "misc")
31    rv = runmisc()
32  else
33    usage()
34  end
35  return rv
36end
37
38
39# print the usage and exit
40def usage()
41  printf(STDERR, "%s: test cases for Curia for Ruby\n", $0)
42  printf(STDERR, "\n")
43  printf(STDERR, "usage:\n")
44  printf(STDERR, "  %s write name rnum bnum dnum\n", $0)
45  printf(STDERR, "  %s read name\n", $0)
46  printf(STDERR, "  %s misc name\n", $0)
47  printf(STDERR, "\n")
48  exit(1)
49end
50
51
52# parse arguments of write command
53def runwrite()
54  name = nil
55  rnum = -1
56  bnum = -1
57  dnum = -1
58  i = 1
59  while(i < ARGV.length)
60    if(!name && ARGV[i] =~ /^-/)
61      usage()
62    elsif(!name)
63      name = ARGV[i]
64    elsif(rnum < 0)
65      rnum = ARGV[i].to_i()
66    elsif(bnum < 0)
67      bnum = ARGV[i].to_i()
68    elsif(dnum < 0)
69      dnum = ARGV[i].to_i()
70    else
71      usage()
72    end
73    i += 1
74  end
75  (name && rnum > 0 && bnum > 0 && dnum > 0) || usage()
76  dowrite(name, rnum, bnum, dnum)
77  return 0
78end
79
80
81# parse arguments of read command
82def runread()
83  name = nil
84  i = 1
85  while(i < ARGV.length)
86    if(!name && ARGV[i] =~ /^-/)
87      usage()
88    elsif(!name)
89      name = ARGV[i]
90    else
91      usage()
92    end
93    i += 1
94  end
95  (name) || usage()
96  doread(name)
97  return 0
98end
99
100
101# parse arguments of misc command
102def runmisc()
103  name = nil
104  i = 1
105  while(i < ARGV.length)
106    if(!name && ARGV[i] =~ /^-/)
107      usage()
108    elsif(!name)
109      name = ARGV[i]
110    else
111      usage()
112    end
113    i += 1
114  end
115  (name) || usage()
116  domisc(name)
117  return 0
118end
119
120
121# perform write command
122def dowrite(name, rnum, bnum, dnum)
123  printf("<Writing Test>\n  name=%s  rnum=%d  bnum=%d  dnum=%d\n\n", name, rnum, bnum, dnum)
124  curia = nil
125  begin
126    # open a database
127    curia = Curia::new(name, Curia::OWRITER | Curia::OCREAT | Curia::OTRUNC, bnum, dnum)
128    # loop for each record
129    STDOUT.sync = true
130    1.upto(rnum) do |i|
131      buf = sprintf("%08d", i)
132      # store a record
133      curia.put(buf, buf)
134      # print progression
135      if(rnum > 250 && i % (rnum / 250) == 0)
136        print(".")
137        if(i == rnum || i % (rnum / 10) == 0)
138          printf(" (%08d)\n", i)
139        end
140      end
141    end
142  rescue
143    printf("%s: %s: %s\n", $0, name, $!)
144    return 1
145  ensure
146    begin
147      # close the database
148      (curia) && curia.close()
149    rescue
150      return 1
151    end
152  end
153  printf("ok\n\n")
154  return 0
155end
156
157
158# perform read command
159def doread(name)
160  printf("<Reading Test>\n  name=%s\n\n", name)
161  curia = nil
162  begin
163    # open a database
164    curia = Curia::new(name)
165    # get the number of record
166    rnum = curia.rnum()
167    # loop for each record
168    STDOUT.sync = true
169    1.upto(rnum) do |i|
170      buf = sprintf("%08d", i)
171      # store a record
172      curia.get(buf)
173      # print progression
174      if(rnum > 250 && i % (rnum / 250) == 0)
175        print(".")
176        if(i == rnum || i % (rnum / 10) == 0)
177          printf(" (%08d)\n", i)
178        end
179      end
180    end
181  rescue
182    printf("%s: %s: %s\n", $0, name, $!)
183    return 1
184  ensure
185    begin
186      # close the database
187      (curia) && curia.close()
188    rescue
189      return 1
190    end
191  end
192  printf("ok\n\n")
193  return 0
194end
195
196
197# perform misc command
198def domisc(name)
199  loopnum = 500
200  bucketnum = 16
201  divnum = 3
202  threadnum = 10
203  printf("<Miscellaneous Test>\n  name=%s\n\n", name)
204  curia = nil
205  begin
206    # open the database
207    printf("Creating a database ... ")
208    curia = Curia::open("casket", Curia::OWRITER | Curia::OCREAT | Curia::OTRUNC,
209                        bucketnum, divnum)
210    printf("ok\n")
211    # store records
212    printf("Storing records ... ")
213    1.upto(loopnum) do |i|
214      buf =  sprintf("%08d", i)
215      curia[buf] = buf
216    end
217    printf("ok\n")
218    # retrieve records
219    printf("Retrieving records ... ")
220    1.upto(loopnum) do |i|
221      buf =  sprintf("%08d", i)
222      (curia[buf] == buf) || raise("key and value does not match")
223    end
224    printf("ok\n")
225    # traverse records
226    printf("Traversing records ... ")
227    curia.each() do |key, val|
228      (key == val) || raise("key and value does not match")
229    end
230    curia.keys()
231    curia.values()
232    printf("ok\n")
233    # silent mode operations
234    printf("Silent mode operations ... ")
235    curia.silent = true
236    curia.put("foo", "bar", Curia::DKEEP)
237    curia.put("foo", "bar", Curia::DKEEP)
238    curia.get("foo")
239    curia.out("foo")
240    curia.out("foo")
241    curia.get("nil")
242    curia.fetch("nil", "void");
243    curia.keys()
244    curia.values()
245    printf("ok\n")
246  rescue
247    printf("%s: %s: %s\n", $0, name, $!)
248    return 1
249  ensure
250    # close the database
251    printf("Closing the database ... ")
252    (curia) && curia.close()
253    printf("ok\n")
254  end
255  # test iterator and threads
256  printf("Processing with iterator and threads ... ")
257  Curia::new("casket", Curia::OWRITER) do |curia|
258    (curia.rnum() == loopnum) || raise("record number is invalid")
259    curia.clear()
260    threads = []
261    1.upto(threadnum) do |i|
262      t = Thread::new() do
263        1.upto(loopnum) do |j|
264          buf = sprintf("%08d", j)
265          curia.put(buf, "*", Curia::DCAT)
266        end
267      end
268      threads.push(t)
269    end
270    threads.each do |t|
271      t.join()
272    end
273    1.upto(loopnum) do |i|
274      buf = sprintf("%08d", i)
275      (curia.vsiz(buf) == threadnum) || raise("thread writing is invalid")
276    end
277    (curia.index("*" * threadnum)) || raise("thread writing is invalid")
278  end
279  printf("ok\n")
280  printf("all ok\n\n")
281  return 0
282end
283
284
285# execute main
286$0.gsub!(/.*\//, "")
287exit(main())
288
289
290
291# END OF FILE
292