/*
 *
 * $Id$
 *
 */

#include "../postgres.ch"

Function main()
    Local conn, res, aTemp, i, x,y, pFile
    Local cDb := 'test'
    Local cUser := 'user'
    Local cPass := 'pass'
    
    CLEAR SCREEN
  
    conn := PQsetdbLogin( 'localhost', "5432", NIL, NIL, cDb, cUser, cPass)
    ? PQdb(conn), PQuser(conn), PQpass(conn), PQhost(conn), PQport(conn), PQtty(conn), PQoptions(conn)
    ? PQClose(conn)
    
    conn := PQConnect(cDb, 'localhost', cuser, cpass, 5432)
    
    ? PQstatus(conn), PQerrormessage(conn)
    
    if PQstatus(conn) != CONNECTION_OK
        quit
    endif

    ? "Blocking: ", PQisnonblocking(conn), PQsetnonblocking(conn, .t.), PQisnonblocking(conn)
    
    pFile := PQcreatetrace( 'trace.log' )
    PQtrace( conn, pFile )
    
    ? "Verbose: ", PQsetErrorVerbosity(conn, 2)
    
    ? "Protocol: ", PQprotocolVersion(conn), ;
      " Server Version: ", PQserverVersion(conn), ;
      " Client Encoding: ", PQsetClientEncoding(conn, "ASCII"), ;
      "New encode: ", PQclientEncoding(conn)

    ? PQdb(conn), PQuser(conn), PQpass(conn), PQhost(conn), PQport(conn), PQtty(conn), PQoptions(conn)

    res := PQexec('drop table products')
    ? PQresultStatus(res), PQresultErrorMessage(res)
    PQclear(res)
   
    res := PQexec('create table products ( product_no numeric(10), name varchar(20), price numeric(10,2) )')
    ? PQresultStatus(res), PQresultErrorMessage(res)
    PQclear(res)
    
    res := PQexecParams(conn, 'insert into products(product_no, name, price) values ($1, $2, $3)', {'2', 'bread', '10.95'})    
    ? "Oid Row: ", PQoidValue(res), PQoidStatus(res)
    
    if PQresultStatus(res) != PGRES_COMMAND_OK
        ? PQresultStatus(res), PQresultErrorMessage(res)
    endif
    PQclear(res)
    
    res := PQexec(conn, 'select price, name, product_no as "produto" from products')
    
    if PQresultStatus(res) != PGRES_TUPLES_OK
        ? PQresultStatus(res), PQresultErrorMessage(res)
    endif

    ? "Binary: ", PQbinaryTuples(res)
    ? "Rows: ", PQntuples(res), "Cols: ", PQnfields(res)
    ? PQfname(res, 1), PQftable(res, 1), PQftype(res, 1), PQfnumber(res, "name"), PQfmod(res, 1), PQfsize(res, 1), PQgetisnull(res,1,1)
    
    aTemp := PQmetadata(res)
    
    for x := 1 to len(aTemp)
        ? "Linha 1: "
        for y := 1 to 6
            ?? aTemp[x,y], ", "
        next
    next
                
    ? PQFcount(res)
    
    ? PQlastrec(res)
    
    ? PQGetvalue(res,1, 2)

    ? PQclear(res)    
    
    ? "Large Objects, always should be in a transaction..."

    res := PQexec(conn, 'begin')
    PQclear(res)    

    ? (x := lo_Import( conn, 'test.prg' ))
    ? lo_Export( conn, x, 'test.new' )
    ? lo_Unlink( conn, x )

    res := PQexec(conn, 'commit')
    PQclear(res)    
    
    PQuntrace( conn )
    PQclosetrace( pFile )        
    PQClose(conn)
    return nil
    
