Re: about monitoring the input stream - Mailing list pgsql-jdbc
From | Dave Cramer |
---|---|
Subject | Re: about monitoring the input stream |
Date | |
Msg-id | FD3CDF0A-01B6-4EF9-A508-B0109659E3D7@fastcrypt.com Whole thread Raw |
In response to | Re: about monitoring the input stream (Albert Cardona <acardona@ini.phys.ethz.ch>) |
List | pgsql-jdbc |
Hi Albert, Could you release your code with a freebsd like license. I'm afraid that we can't accept any GPL'd code. I'd greatly love to see your code included. Dave On 16-Sep-06, at 6:08 AM, Albert Cardona wrote: > > Mark, > > The relevant parts of the code for monitoring the PGStream are > attached below. > > This code is part of TrakEM2, an ImageJ/postgresql -based > application (GPL > applies) for managing an arbitrarily large set of images, segmented > profiles > and metadata in general, for the purpose of extracting 3D models and a > hierarchical structure of objects present in the sample represented > by the > images. See all details here: > http://www.ini.unizh.ch/~acardona/trakem2.html > > The code below belongs to the current svn snapshot, which won't be > available > until the end of this month. > > > /** Extract from private inner class Monitor. GPL applies, see the > TrakEM2-src.zip file, class ini.trakem2.persistence.DBLoader, at > http://www.ini.unizh.ch/~acardona/trakem2.html */ > > public Monitor(Connection con) { > connection = con; > LoggingInputStream lis = null; > try { > AbstractJdbc2Connection a2 = > (AbstractJdbc2Connection)connection; > Class c2 = > connection.getClass().getSuperclass().getSuperclass(); > java.lang.reflect.Field f_proto = > c2.getDeclaredField("protoConnection"); > f_proto.setAccessible(true); > // protoConnection is a ProtocolConnection > interface, > implemented in core.v3.ProtocolConnectionImpl ! > //ProtocolConnectionImpl pci = > (ProtocolConnectionImpl)m_proto.get(c2); // class is private to the > package, > can't cast! > Object pci = f_proto.get(a2); > // finally, get the PGStream > java.lang.reflect.Field f_pgstream = > pci.getClass().getDeclaredField("pgStream"); > f_pgstream.setAccessible(true); > PGStream pgstream = (PGStream)f_pgstream.get > (pci); > // now the InputStream > java.lang.reflect.Field f_i = > pgstream.getClass().getDeclaredField("pg_input"); > f_i.setAccessible(true); > InputStream stream = (InputStream)f_i.get > (pgstream); > lis = new LoggingInputStream(stream); > f_i.set(pgstream, lis); // TADA! Many > thanks to the > PGSQL JDBC mailing list for this last tip on not just monitoring > the PGStream > as I was doing, but on replacing the inputstream altogether with a > logging > copy! ("CountingInputStream", they called it). > > } catch (Exception e) { > new IJError(e); > } > this.lis = lis; > makeWindow(); > } > > /** ===================== */ > > /** The class below exists as ini.trakem2.io.LoggingInputStream in > TrakEM2. > The GPL applies, see the TrakEM2-src.zip downloadable at > http://www.ini.unizh.ch/~acardona/trakem2.html */ > > import java.io.BufferedInputStream; > import java.io.InputStream; > import java.io.IOException; > > > /** A class to monitor an input stream for speed and total byte > download. */ > public class LoggingInputStream extends BufferedInputStream { > > private long last; > private long n = 0; > private long accum_time = 0; > private long accum_bytes = 0; > > public LoggingInputStream(InputStream in) { > super(in); > last = System.currentTimeMillis(); > } > > public int read() throws IOException { > int m = super.read(); > n += m; > return m; > } > > public int read(byte[] b) throws IOException { > int m = super.read(b); > n += m; > return m; > } > > public int read(byte[] b, int off, int len) throws > IOException { > int m = super.read(b, off, len); > n += m; > return m; > } > > /** Put the accumulated count to zero. */ > public void resetInfo() { // to work perfect, this would > need a > synchronized clause, but no such perfection is needed, and there are > perfomance issues. > accum_bytes = n = 0; > last = System.currentTimeMillis(); > accum_time = 0; > } > > /** Returns info as > * [0] = current time in ms > * [1] = elapsed time in ms since last call to getInfo(long[]) > * [2] = n_bytes_read since last call to getInfo(long[]) > * [3] = accumulated time in ms since last call to resetInfo() > * [4] = accumulated bytes since last call to resetInfo() > * > * So current speed = info[2]/info[1] Kb/s > */ > public void getInfo(long[] info) { > long now = System.currentTimeMillis(); > accum_time += now - last; > accum_bytes += n; > info[0] = now; > info[1] = now - last; // elapsed time > info[2] = n; > info[3] = accum_time; // total time since last call to > resetInfo() > info[4] = accum_bytes; // total bytes since last > call to > resetInfo() > // reset cycle vars: > n = 0; > last = now; > } > } > > > -- > Albert Cardona > Molecular Cell Developmental Biology > University of California Los Angeles > Tel +1 310 2067376 > Programming: http://www.ini.unizh.ch/~acardona/trakem2.html > Research: http://www.mcdb.ucla.edu/Research/Hartenstein/ > Web design: http://www.pixelets.com > > > > ---------------------------(end of > broadcast)--------------------------- > TIP 3: Have you checked our extensive FAQ? > > http://www.postgresql.org/docs/faq >
pgsql-jdbc by date: