1/* Statistics classes */
2%{
3/*
4 * These macros are used by code generated by the s_java script.
5 */
6#define JAVADB_STAT_INT(jenv, jobj, fid, statp, name)			\
7		(*jenv)->SetIntField(jenv, jobj, fid, (jint)statp->name)
8
9#define JAVADB_STAT_STRING(jenv, jobj, fid, statp, name)		\
10		(*jenv)->SetObjectField(jenv, jobj, fid,		\
11		    (*jenv)->NewStringUTF(jenv, statp->name))
12
13#define JAVADB_STAT_LSN(jenv, jobj, fid, statp, name)			\
14		(*jenv)->SetObjectField(jenv, jobj, fid,		\
15		    __dbj_wrap_DB_LSN(jenv, &statp->name))
16
17#define JAVADB_STAT_LONG(jenv, jobj, fid, statp, name)			\
18		(*jenv)->SetLongField(jenv, jobj, fid,			\
19		    (jlong)statp->name)
20
21#define JAVADB_STAT_XID(jenv, jobj, fid, statp, name) {			\
22	jobject jarr =							\
23	    (*jenv)->NewByteArray(jenv, (jsize)DB_XIDDATASIZE);		\
24	(*jenv)->SetByteArrayRegion(jenv, jarr,				\
25	    0, (jsize)DB_XIDDATASIZE, (jbyte *)statp->name);		\
26	(*jenv)->SetObjectField(jenv, jobj, fid, jarr);			\
27	}
28
29/*
30 * We build the active list separately.
31 */
32#define JAVADB_STAT_ACTIVE(jenv, cl, jobj, statp, name) \
33	do {} while(0)
34
35#include "java_stat_auto.c"
36%}
37
38%define JAVA_STAT_CLASS(_ctype, _jtype, _name)
39JAVA_TYPEMAP(_ctype, _jtype, jobject)
40%typemap(out) _ctype %{
41	$result = (*jenv)->NewObject(jenv, _name##_class, _name##_construct);
42	if ($result != NULL)
43		__dbj_fill_##_name(jenv, $result, $1);
44	__os_ufree(NULL, $1);
45%}
46%enddef
47
48JAVA_STAT_CLASS(DB_COMPACT *, com.sleepycat.db.CompactStats, compact)
49%typemap(freearg) DB_COMPACT * %{ __dbj_fill_compact(jenv, $input, $1); %}
50%typemap(in) DB_COMPACT * (DB_COMPACT compact) %{
51        memset(&compact, 0, sizeof (DB_COMPACT));
52        $1 = &compact;
53        $1->compact_fillpercent = (*jenv)->GetIntField(jenv, $input,
54            compact_compact_fillpercent_fid);
55        $1->compact_timeout = (*jenv)->GetIntField(jenv, $input,
56            compact_compact_timeout_fid);
57        $1->compact_pages = (*jenv)->GetIntField(jenv, $input,
58            compact_compact_pages_fid);
59%}
60
61JAVA_STAT_CLASS(DB_LOCK_STAT *, com.sleepycat.db.LockStats, lock_stat)
62JAVA_STAT_CLASS(DB_LOG_STAT *, com.sleepycat.db.LogStats, log_stat)
63JAVA_STAT_CLASS(DB_MPOOL_STAT *, com.sleepycat.db.CacheStats, mpool_stat)
64
65JAVA_TYPEMAP(DB_MPOOL_FSTAT **, com.sleepycat.db.CacheFileStats[], jobjectArray)
66%typemap(out) DB_MPOOL_FSTAT ** {
67	int i, len;
68
69	len = 0;
70	while ($1[len] != NULL)
71		len++;
72	$result = (*jenv)->NewObjectArray(jenv, (jsize)len,
73	    mpool_fstat_class, 0);
74	if ($result == NULL) {
75		__os_ufree(NULL, $1);
76		return $null;
77	}
78	for (i = 0; i < len; i++) {
79		jobject obj = (*jenv)->NewObject(jenv, mpool_fstat_class,
80		    mpool_fstat_construct);
81		if (obj == NULL) {
82			__os_ufree(NULL, $1);
83			return $null; /* an exception is pending */
84		}
85		(*jenv)->SetObjectArrayElement(jenv, $result, i, obj);
86		__dbj_fill_mpool_fstat(jenv, obj, $1[i]);
87	}
88	__os_ufree(NULL, $1);
89}
90
91JAVA_STAT_CLASS(DB_MUTEX_STAT *, com.sleepycat.db.MutexStats, mutex_stat)
92JAVA_STAT_CLASS(DB_REP_STAT *, com.sleepycat.db.ReplicationStats, rep_stat)
93JAVA_STAT_CLASS(DB_REPMGR_STAT *, com.sleepycat.db.ReplicationManagerStats, repmgr_stat)
94JAVA_STAT_CLASS(DB_SEQUENCE_STAT *, com.sleepycat.db.SequenceStats, seq_stat)
95JAVA_TYPEMAP(DB_TXN_STAT *, com.sleepycat.db.TransactionStats, jobject)
96%typemap(out) DB_TXN_STAT * {
97	unsigned int i;
98	jobjectArray actives;
99	$result = (*jenv)->NewObject(jenv, txn_stat_class, txn_stat_construct);
100	if ($result != NULL)
101		__dbj_fill_txn_stat(jenv, $result, $1);
102
103	actives = (*jenv)->NewObjectArray(jenv, (jsize)$1->st_nactive,
104	    txn_active_class, 0);
105	if (actives == NULL) {
106		__os_ufree(NULL, $1);
107		return $null;
108	}
109	(*jenv)->SetObjectField(jenv, $result,
110	    txn_stat_st_txnarray_fid, actives);
111	for (i = 0; i < $1->st_nactive; i++) {
112		jobject obj = (*jenv)->NewObject(jenv, txn_active_class,
113		    txn_active_construct);
114		if (obj == NULL) {
115			__os_ufree(NULL, $1);
116			return $null; /* an exception is pending */
117		}
118		(*jenv)->SetObjectArrayElement(jenv, actives, (jsize)i, obj);
119		__dbj_fill_txn_active(jenv, obj, &$1->st_txnarray[i]);
120	}
121	__os_ufree(NULL, $1);
122}
123
124/* Db.stat return - special case */
125%typemap(out) void * %{
126	if ($1 == NULL)
127		$result = NULL;
128	else {
129		DB *db = (DB *)arg1;
130		DBTYPE dbtype;
131		int err;
132
133		if ((err = db->get_type(db, &dbtype)) != 0) {
134			__dbj_throw(jenv, err, NULL, NULL, DB2JDBENV);
135			return $null;
136		}
137
138		switch (dbtype) {
139			/* Btree and recno share the same stat structure */
140		case DB_BTREE:
141		case DB_RECNO:
142			$result = (*jenv)->NewObject(jenv, bt_stat_class,
143			    bt_stat_construct);
144			if ($result != NULL)
145				__dbj_fill_bt_stat(jenv, $result,
146				    (DB_BTREE_STAT *)$1);
147			break;
148
149			/* Hash stat structure */
150		case DB_HASH:
151			$result = (*jenv)->NewObject(jenv, h_stat_class,
152			    h_stat_construct);
153			if ($result != NULL)
154				__dbj_fill_h_stat(jenv, $result,
155				    (DB_HASH_STAT *)$1);
156			break;
157
158		case DB_QUEUE:
159			$result = (*jenv)->NewObject(jenv, qam_stat_class,
160			    qam_stat_construct);
161			if ($result != NULL)
162				__dbj_fill_qam_stat(jenv, $result,
163				    (DB_QUEUE_STAT *)$1);
164			break;
165
166			/* That's all the database types we're aware of! */
167		default:
168			__dbj_throw(jenv, EINVAL, "Db.stat only implemented for"
169			    " BTREE, HASH, QUEUE and RECNO", NULL, DB2JDBENV);
170			break;
171		}
172
173		__os_ufree(db->env, $1);
174	}
175%}
176
177