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