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); }