Beispiel #1
0
void DB2Mon::getSnapshot(JNIEnv* env, sqlma *ma_ptr, Snapshot& snap)
{
	int		rc = 0;  // return code
	sqlca	sqlca;
	sqluint32 outputFormat;

	// Determine the size of the snapshot
	db2GetSnapshotSizeData getSnapshotSizeParam;
	sqluint32 buffer_sz;  // estimated buffer size

	getSnapshotSizeParam.piSqlmaData = ma_ptr;
	getSnapshotSizeParam.poBufferSize = &buffer_sz;
	getSnapshotSizeParam.iVersion = SQLM_CURRENT_VERSION;
	getSnapshotSizeParam.iNodeNumber = m_aggAllNodes ? SQLM_ALL_NODES : SQLM_CURRENT_NODE;
	getSnapshotSizeParam.iSnapshotClass = SQLM_CLASS_DEFAULT;

	rc = db2GetSnapshotSize(db2Version810, &getSnapshotSizeParam, &sqlca);
	APICHECK(env, sqlca);

	// Allocate memory to a buffer to hold snapshot monitor data.
	// Add about 10k to make sure we avoid the reallocation below
	buffer_sz = buffer_sz + SNAPSHOT_BUFFER_UNIT_SZ;
	MemObj	ptrBuffer(buffer_sz);
	char * buffer_ptr = ptrBuffer.get();
	sqlm_collected collected;  // returned sqlm_collected structure
	memset(&collected, '\0', sizeof(struct sqlm_collected));

	db2GetSnapshotData getSnapshotParam;
	getSnapshotParam.piSqlmaData = ma_ptr;
	getSnapshotParam.poCollectedData = &collected;
	getSnapshotParam.iBufferSize = buffer_sz;
	getSnapshotParam.poBuffer = buffer_ptr;
	getSnapshotParam.iVersion = SQLM_CURRENT_VERSION;
	getSnapshotParam.iStoreResult = 0;
	getSnapshotParam.iNodeNumber = m_aggAllNodes ? SQLM_ALL_NODES : SQLM_CURRENT_NODE;
	getSnapshotParam.poOutputFormat = &outputFormat;
	getSnapshotParam.iSnapshotClass = SQLM_CLASS_DEFAULT;

	rc = db2GetSnapshot(db2Version810, &getSnapshotParam, &sqlca);
	APICHECK(env, sqlca);

	// If buffer was too small enlarge it and repeat until succeeded
	while (sqlca.sqlcode == 1606)
	{
		buffer_sz = buffer_sz + SNAPSHOT_BUFFER_UNIT_SZ;
		ptrBuffer.resize(buffer_sz);
		buffer_ptr = ptrBuffer.get();

		getSnapshotParam.iBufferSize = buffer_sz;
		getSnapshotParam.poBuffer = buffer_ptr;

		rc = db2GetSnapshot(db2Version810, &getSnapshotParam, &sqlca);
		APICHECK(env, sqlca);
	}

	// Fill the snapshot object from the memory buffer
	snap.initialize(env, buffer_ptr);
}