/** PGConnection encapsulates a connection to the backend.
 */.  It wraps around PGconn struct, which libpq uses for the same
purpose.  */

public class PGConnection extends Object
{

public  static final int CON_OK = 0;
public  static final int CON_BAD = 1;

private int PGconnRep;     // will be cast to (PGconn *) in C
private int getlineResult; // -1 = EOF, 0 = done, 1 = more
private boolean copyDone;  // Set at end of getline,
            // reset at endcopy

public PGConnection(String host, String port, String options,
          String tty, String dbName) throws PostgresException
 {
    this.connectDB(host, port, options, tty, dbName);

    if (this.status() != CON_OK)
      {
   String errString = this.errorMessage();
   this.finish();
   this.PGconnRep = 0;
   throw (new PostgresException(errString));
      }
}

protected void finalize()
  {
    if (PGconnRep != 0)
      this.finish();
  }

public synchronized PGResult exec(String query) throws PostgresException
  {
    int resultPtr = nativeExec(query);
    if (resultPtr != 0)
      return new PGResult(resultPtr);
    else
      {
   String errString = this.errorMessage();
   throw new PostgresException(errString);
      }
  }

public synchronized String getline()
  {
    if (!this.copyDone)
      {
   StringBuffer result = new StringBuffer(nativeGetline());
   while (this.getlineResult == 1)
     {
       result.append(nativeGetline());
     }
   if (this.getlineResult == -1)       // EOF
     this.copyDone = true;
   return new String(result);
      }
    else
      return null;
  }

 /**Native methods that are _only_ called from
    other methods of PGConnection*/

private synchronized native void connectDB(String host,
                  String port,
                  String options,
                  String tty, String dbName);
private synchronized native void finish();             // cleans up connection
private synchronized native int nativeExec(String query); // used by exec
private synchronized native  String nativeGetline();      // Used by getline
  /**Native methods that are called from other objects*/
public  synchronized native String db() ;
public  synchronized native String host();
public  synchronized native String options();
public  synchronized native String port();
public  synchronized native String tty();
public  synchronized native  void reset();
public  synchronized native  int status();
public  synchronized native  String errorMessage();
public  synchronized native  void untrace();
public  synchronized native  void trace(String filename);
public  synchronized native  int endcopy();
public  synchronized native  void putline(String string);

  static
  {
    System.loadLibrary("Jgres");
  }

}