1#!/bin/sh -
2#	$Id: s_java_stat,v 12.27 2008/04/25 14:50:06 bschmeck Exp $
3#
4# Build the Java files.
5
6msgjava="/*-
7 * Automatically built by dist/s_java_stat.
8 * Only the javadoc comments can be edited.
9 *
10 * See the file LICENSE for redistribution information.
11 *
12 * Copyright (c) 2002,2008 Oracle.  All rights reserved.
13 */"
14
15s=/tmp/__java.sed
16t=/tmp/__java
17t0=/tmp/__java0
18c=/tmp/__javajnic
19u1=/tmp/__javautil1
20u2=/tmp/__javautil2
21trap 'rm -f $s $t $t0 $c $u1 $u2; exit 0' 0 1 2 3 13 15
22
23# Script to convert DB C structure declarations into Java declarations.
24jclass()
25{
26	cat > $s <<EOF
27/struct __db_$1 {/,/^}/{
28	/__db_$1/d
29	/;/!d
30	/^}/d
31	/db_threadid_t/d
32	/char[	 ]*/{
33		s/^[	 ]*char[*	 ]*[	 ]*\([^[;]*\).*/\\
34$2    private String \1;\\
35$2    public String get_\1() {\\
36$2        return \1;\\
37$2    }/p
38		d
39	}
40	/time_t/{
41		s/^[	 ]*[^	 ]*[	 ]*\([^;]*\).*/\\
42$2    private long \1;\\
43$2    public long get_\1() {\\
44$2        return \1;\\
45$2    }/p
46		d
47	}
48	/db_seq_t/{
49		s/^[	 ]*[^	 ]*[	 ]*\([^;]*\).*/\\
50$2    private long \1;\\
51$2    public long get_\1() {\\
52$2        return \1;\\
53$2    }/p
54		d
55	}
56	/DB_LSN[	 ]*/{
57		s/^[	 ]*[^	 ]*[	 ]*\([^;]*\).*/\\
58$2    private LogSequenceNumber \1;\\
59$2    public LogSequenceNumber get_\1() {\\
60$2        return \1;\\
61$2    }/p
62		d
63	}
64	/DB_TXN_ACTIVE[	 ]*\*/{
65		s/^[	 ]*[^\*]*\*[	 ]*\([^;]*\).*/\\
66$2    private Active[] \1;\\
67$2    public Active[] get_\1() {\\
68$2        return \1;\\
69$2    }/p
70		d
71	}
72	/u_int8_t[	 ]*xid\[/{
73		s/^[	 ]*[^	 ]*[	 ]*\([^[;]*\).*/\\
74$2    private byte[] \1;\\
75$2    public byte[] get_\1() {\\
76$2        return \1;\\
77$2    }/p
78		d
79	}
80	/u_int32_t.*startup_complete/{
81		s/^[	 ]*[^	 ]*[	 ]*\([^[;]*\).*/\\
82$2    private int \1;\\
83$2    public boolean get_\1() {\\
84$2        return (\1 != 0);\\
85$2    }/p
86		d
87	}
88	s/^[	 ]*[^	 ]*[	 ]*\([^;]*\).*/\\
89$2    private int \1;\\
90$2    public int get_\1() {\\
91$2        return \1;\\
92$2    }/p
93}
94EOF
95	sed -n -f $s < ../dbinc/db.in |
96	perl -w -p -e 's/get_(st|bt|hash|qs|compact)_/get_/;' \
97	           -e 'if (m/get.*\(/) {' \
98	           -e     's/_n([b-df-hj-np-tv-z]|upgrade)/_num_$1/;' \
99	           -e     's/_(min|max)([a-z])/_$1_$2/;' \
100	           -e     's/_mvcc/_multiversion/;' \
101	           -e     's/cnt/_count_/;' \
102	           -e     's/_pg/_pages_/;' \
103	           -e     's/(count|flag|free|page|percent|size|sync|timeout)/_$1/g;' \
104	           -e     's/([^p])(id\()/$1_$2/g;' \
105	           -e     's/__*/_/g;' \
106	           -e     's/_(.)/\U$1/g' \
107	           -e '};' \
108	           -e '1'
109}
110
111# Script to convert DB C structure declarations into a JNI method to fill the
112# corresponding Java class
113jclass_jni()
114{
115	fill=__dbj_fill_$1
116	j_class=$2
117	jni_fieldid_decls $1 $2
118	jni_fieldids $1 $2
119	cat > $s <<EOF
120/struct __db_$1 {/,/^}/{
121	/__db_$1/d
122	/;/!d
123	/^}/d
124	/db_threadid_t/d
125	/char[	 ]*/{
126		s/^[	 ]*char[*	 ]*[	 ]*\([^[;]*\).*/	JAVADB_STAT_STRING(jnienv, jobj, $1_\1_fid, statp, \1);/p
127		d
128	}
129	/time_t/{
130		s/^[	 ]*[^	 ]*[	 ]*\([^;]*\).*/	JAVADB_STAT_LONG(jnienv, jobj, $1_\1_fid, statp, \1);/p
131		d
132	}
133	/db_seq_t/{
134		s/^[	 ]*[^	 ]*[	 ]*\([^;]*\).*/	JAVADB_STAT_LONG(jnienv, jobj, $1_\1_fid, statp, \1);/p
135		d
136	}
137	/DB_LSN[	 ]*/{
138		s/^[	 ]*[^	 ]*[	 ]*\([^;]*\).*/	JAVADB_STAT_LSN(jnienv, jobj, $1_\1_fid, statp, \1);/p
139		d
140	}
141	/DB_TXN_ACTIVE[	 ]*\*/{
142		s/^[	 ]*[^\*]*\*[	 ]*\([^;]*\).*/	JAVADB_STAT_ACTIVE(jnienv, jobj, $1_\1_fid, statp, \1);/p
143		d
144	}
145	/u_int8_t[	 ]*xid\[/{
146		s/^[	 ]*[^	 ]*[	 ]*\([^[;]*\).*/	JAVADB_STAT_XID(jnienv, jobj, $1_\1_fid, statp, \1);/p
147		d
148	}
149	s/^[	 ]*[^	 ]*[	 ]*\([^;]*\).*/	JAVADB_STAT_INT(jnienv, jobj, $1_\1_fid, statp, \1);/p
150}
151EOF
152	echo "static int $fill(JNIEnv *jnienv," >> $c
153	echo "    jobject jobj, struct __db_$1 *statp) {" >> $c
154	sed -n -f $s < ../dbinc/db.in >> $c
155        echo '	return (0);' >> $c
156	echo '}' >> $c
157}
158
159jni_fieldid_decls()
160{
161	cat > $s <<EOF
162/struct __db_$1 {/,/^}/{
163	/__db_$1/d
164	/;/!d
165	/^}/d
166	/db_threadid_t/d
167	/char[	 ]*/{
168		s/^[	 ]*char[*	 ]*[	 ]*\([^[;]*\).*/static jfieldID $1_\1_fid;/p
169		d
170	}
171	/time_t/{
172		s/^[	 ]*[^	 ]*[	 ]*\([^;]*\).*/static jfieldID $1_\1_fid;/p
173		d
174	}
175	/db_seq_t/{
176		s/^[	 ]*[^	 ]*[	 ]*\([^;]*\).*/static jfieldID $1_\1_fid;/p
177		d
178	}
179	/DB_LSN[	 ]*/{
180		s/^[	 ]*[^	 ]*[	 ]*\([^;]*\).*/static jfieldID $1_\1_fid;/p
181		d
182	}
183	/DB_TXN_ACTIVE[	 ]*\*/{
184		s/^[	 ]*[^\*]*\*[	 ]*\([^;]*\).*/static jfieldID $1_\1_fid;/p
185		d
186	}
187	/u_int8_t[	 ]*xid\[/{
188		s/^[	 ]*[^	 ]*[	 ]*\([^[;]*\).*/static jfieldID $1_\1_fid;/p
189		d
190	}
191	s/^[	 ]*[^	 ]*[	 ]*\([^;]*\).*/static jfieldID $1_\1_fid;/p
192}
193EOF
194	sed -n -f $s < ../dbinc/db.in >> $u1
195}
196
197jni_fieldids()
198{
199	cat > $s <<EOF
200/struct __db_$1 {/,/^}/{
201	/__db_$1/d
202	/;/!d
203	/^}/d
204	/db_threadid_t/d
205	/char[	 ]*/{
206		s/^[	 ]*char[*	 ]*[	 ]*\([^[;]*\).*/	{ \&$1_\1_fid, \&$1_class, \"\1\", \"Ljava\/lang\/String;\" },/p
207		d
208	}
209	/time_t/{
210		s/^[	 ]*[^	 ]*[	 ]*\([^;]*\).*/	{ \&$1_\1_fid, \&$1_class, \"\1\", \"J\" },/p
211		d
212	}
213	/db_seq_t/{
214		s/^[	 ]*[^	 ]*[	 ]*\([^;]*\).*/	{ \&$1_\1_fid, \&$1_class, \"\1\", \"J\" },/p
215		d
216	}
217	/DB_LSN[	 ]*/{
218		s/^[	 ]*[^	 ]*[	 ]*\([^;]*\).*/	{ \&$1_\1_fid, \&$1_class, \"\1\", \"L\" DB_PKG \"LogSequenceNumber;\" },/p
219		d
220	}
221	/DB_TXN_ACTIVE[	 ]*\*/{
222		s/^[	 ]*[^\*]*\*[	 ]*\([^;]*\).*/	{ \&$1_\1_fid, \&$1_class, \"\1\", \"[L\" DB_PKG \"TransactionStats\$Active;\" },/p
223		d
224	}
225	/u_int8_t[	 ]*xid\[/{
226		s/^[	 ]*[^	 ]*[	 ]*\([^[;]*\).*/	{ \&$1_\1_fid, \&$1_class, \"\1\", \"[B\" },/p
227		d
228	}
229	s/^[	 ]*[^	 ]*[	 ]*\([^;]*\).*/	{ \&$1_\1_fid, \&$1_class, \"\1\", \"I\" },/p
230}
231EOF
232	sed -n -f $s < ../dbinc/db.in >> $u2
233}
234
235# Script to convert DB C structure declarations into a toString method body
236jclass_toString()
237{
238	cat > $s <<EOF
239/struct __db_$1 {/,/^}/{
240	/__db_$1/d
241	/;/!d
242	/^}/d
243	/db_threadid_t/d
244	/char[	 ]*/{
245		s/^[	 ]*char[*	 ]*[	 ]*\([^[;]*\).*/$3            + "\\\\n$3  \1=" + \1/p
246		d
247	}
248	/DB_TXN_ACTIVE[	 ]*\*/{
249		s/^[	 ]*[^\*]*\*[	 ]*\([^;]*\).*/$3            + \"\\\\n$3  \1=\" + DbUtil.objectArrayToString(\1, \"\1\")/p
250		d
251	}
252	/u_int8_t[	 ]*xid\[/{
253		s/^[	 ]*[^	 ]*[	 ]*\([^[;]*\).*/$3            + \"\\\\n$3  \1=\" + DbUtil.byteArrayToString(\1)/p
254		d
255	}
256	/u_int32_t.*startup_complete/{
257		s/^[	 ]*[^	 ]*[	 ]*\([^[;]*\).*/$3            + \"\\\\n$3  \1=\" + (\1 != 0)/p
258		d
259	}
260	s/^[	 ]*[^	 ]*[	 ]*\([^;]*\).*/$3            + \"\\\\n$3  \1=\" + \1/p
261}
262EOF
263	echo
264	echo "$3    public String toString() {"
265	echo "$3        return \"$2:\""
266	sed -n -f $s < ../dbinc/db.in
267	echo "$3            ;"
268	echo "$3    }"
269}
270
271stat_class()
272{
273	c_struct=__db_$1
274	j_class=$2
275	extends=$3
276	imports=$4
277	extradecls=$5
278
279	(cat <<EOF
280$msgjava
281
282package com.sleepycat.db;
283$imports
284public class $j_class$extends {
285    // no public constructor
286    /* package */ $j_class() {}$extradecls
287EOF
288	 jclass $1
289	 jclass_toString $1 $2
290	 echo '}') > $t0
291	f=../java/src/com/sleepycat/db/$j_class.java
292	./s_javadoc_merge $f $t0 > $t
293	cmp $t $f > /dev/null 2>&1 ||
294	    (echo "Building $f" && rm -f $f && cp $t $f && chmod 444 $f)
295	jclass_jni $1 $2
296}
297
298echo "$msgjava" > $c
299> $u1
300> $u2
301
302stat_class bt_stat BtreeStats " extends DatabaseStats"
303
304# Build CompactStats.java - not purely a statistics class, but close enough to
305# share this code.
306(cat <<EOF
307$msgjava
308
309package com.sleepycat.db;
310
311import com.sleepycat.db.internal.DbUtil;
312
313public class CompactStats
314{
315    // no public constructor
316    /* package */ CompactStats() {}
317
318    /* package */
319    CompactStats(int fillpercent, int timeout, int pages) {
320        this.compact_fillpercent = fillpercent;
321        this.compact_timeout = timeout;
322        this.compact_pages = pages;
323    }
324EOF
325 jclass compact
326 jclass_toString compact CompactStats
327 echo '}') |
328   psed 's,public int get\(FillPercent\|Pages(\|Timeout\|Truncate\),/* package */ int get\1,g'> $t0
329f=../java/src/com/sleepycat/db/CompactStats.java
330./s_javadoc_merge $f $t0 > $t
331cmp $t $f > /dev/null 2>&1 ||
332    (echo "Building $f" && rm -f $f && cp $t $f && chmod 444 $f)
333jclass_jni compact __dbj_fill_compact
334
335stat_class h_stat HashStats " extends DatabaseStats"
336stat_class lock_stat LockStats
337stat_class log_stat LogStats
338stat_class mpool_fstat CacheFileStats
339stat_class mpool_stat CacheStats
340stat_class mutex_stat MutexStats
341stat_class qam_stat QueueStats " extends DatabaseStats"
342stat_class rep_stat ReplicationStats "" "
343import com.sleepycat.db.internal.DbConstants;
344" "
345    public static final int REP_CLIENT = DbConstants.DB_REP_CLIENT;
346
347    public static final int REP_MASTER = DbConstants.DB_REP_MASTER;
348
349    public static final int REP_NONE = 0;"
350
351stat_class repmgr_stat ReplicationManagerStats
352stat_class seq_stat SequenceStats
353
354# Build TransactionStats.java - special because of embedded Active class
355(echo "$msgjava"
356 echo
357 echo 'package com.sleepycat.db;'
358 echo
359 echo 'import com.sleepycat.db.internal.DbUtil;'
360 echo
361 echo 'public class TransactionStats'
362 echo '{'
363 echo "    // no public constructor"
364 echo "    /* package */ TransactionStats() {}"
365 echo
366 echo "    public static class Active {"
367 echo "        // no public constructor"
368 echo "        /* package */ Active() {}"
369 jclass txn_active "    "
370 jclass_toString txn_active Active "    "
371 echo '    };'
372 jclass txn_stat
373 jclass_toString txn_stat TransactionStats
374 echo '}') > $t0
375f=../java/src/com/sleepycat/db/TransactionStats.java
376./s_javadoc_merge $f $t0 > $t
377cmp $t $f > /dev/null 2>&1 ||
378    (echo "Building $f" && rm -f $f && cp $t $f && chmod 444 $f)
379jclass_jni txn_stat __dbj_fill_txn_stat
380jclass_jni txn_active __dbj_fill_txn_active
381
382mv $c $t
383f=../libdb_java/java_stat_auto.c
384cmp $t $f > /dev/null 2>&1 ||
385    (echo "Building $f" && rm -f $f && cp $t $f && chmod 444 $f)
386
387f=../libdb_java/java_util.i
388sed '/BEGIN-STAT-FIELD-DECLS/q' < $f > $t
389cat $u1 >> $t
390sed -n '/END-STAT-FIELD-DECLS/,/BEGIN-STAT-FIELDS/p' < $f >> $t
391cat $u2 >> $t
392sed -n '/END-STAT-FIELDS/,$p' < $f >> $t
393cmp $t $f > /dev/null 2>&1 ||
394    (echo "Building $f" && rm -f $f && cp $t $f && chmod 644 $f)
395