Thread

  1. Binary large object processing problems

    Raivo Rebane <raivore55@gmail.com> — 2023-03-13T15:00:52Z

    Hi
    
    I am novice in pogres C API user and I want to store Binary Large Object
    into database from C language program.
    
    I am using following source :
    Oid nloid = lo_import(conn, FileFUllName.c_str());
    
    if (nloid == 0) {
    std::cerr << "Error importing large object: " << PQerrorMessage(conn) <<
    std::endl;
    return -1;
    }
    else {
    std::cout << "Large object imported successfully with fd " << nloid <<
    std::endl;
    }
    And I seadely get 0 from lo_import.
    I tried to create it previously an send oid to lo_impor_with_oid, but with
    error
    
    Can anybody help me find where is my mistake an what is working solution ?
    
    Regards,
    Raivo
    
  2. Re: Binary large object processing problems

    Christoph Moench-Tegeder <cmt@burggraben.net> — 2023-03-13T15:26:40Z

    ## Raivo Rebane (raivore55@gmail.com):
    
    > Can anybody help me find where is my mistake an what is working solution ?
    
    The documentation clearly states "All large object manipulation using
    these functions must take place within an SQL transaction block"
    https://www.postgresql.org/docs/current/lo-interfaces.html
    but I couldn't see anything of thank kind in your code.
    
    Regards,
    Christoph
    
    -- 
    Spare Space.
    
    
    
    
  3. Re: Binary large object processing problems

    Raivo Rebane <raivore55@gmail.com> — 2023-03-13T15:54:04Z

    Thank for answer, but I was also readed this manual and found there :
    35.3.2. Importing a Large Object
    
    To import an operating system file as a large object, call
    
    Oid lo_import(PGconn *conn, const char *filename);
    
    *filename* specifies the operating system name of the file to be imported
    as a large object. The return value is the OID that was assigned to the new
    large object, or InvalidOid (zero) on failure. Note that the file is read
    by the client interface library, not by the server; so it must exist in the
    client file system and be readable by the client application.
    This file what I want to import is readable, I just tested it. So I
    expected that lo_import doesn't work properly. It answers to my - invalid
    large-object descriptor: 0
    why ?
    
    I try now by creating, opening, writing and closing sequence or are there
    alternatives ?
    
    Regards
    Raivo
    
    
    
    On Mon, Mar 13, 2023 at 5:26 PM Christoph Moench-Tegeder <cmt@burggraben.net>
    wrote:
    
    > ## Raivo Rebane (raivore55@gmail.com):
    >
    > > Can anybody help me find where is my mistake an what is working solution
    > ?
    >
    > The documentation clearly states "All large object manipulation using
    > these functions must take place within an SQL transaction block"
    > https://www.postgresql.org/docs/current/lo-interfaces.html
    > but I couldn't see anything of thank kind in your code.
    >
    > Regards,
    > Christoph
    >
    > --
    > Spare Space.
    >
    
  4. Re: Binary large object processing problems

    Tom Lane <tgl@sss.pgh.pa.us> — 2023-03-13T16:18:27Z

    Raivo Rebane <raivore55@gmail.com> writes:
    > Thank for answer, but I was also readed this manual and found there :
    > 35.3.2. Importing a Large Object
    
    You need to read the start of that section, which says
    
        All large object manipulation using these functions
        <emphasis>must</emphasis> take place within an SQL transaction block,
    
    As Christoph said, you're responsible for supplying a BEGIN and COMMIT
    around the call.
    
    			regards, tom lane
    
    
    
    
  5. Re: Binary large object processing problems

    Raivo Rebane <raivore55@gmail.com> — 2023-03-13T19:11:00Z

    Ok, I will do that. ANd it works now in both way
    
    Regards
    Raivo
    
    On Mon, Mar 13, 2023 at 6:18 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:
    
    > Raivo Rebane <raivore55@gmail.com> writes:
    > > Thank for answer, but I was also readed this manual and found there :
    > > 35.3.2. Importing a Large Object
    >
    > You need to read the start of that section, which says
    >
    >     All large object manipulation using these functions
    >     <emphasis>must</emphasis> take place within an SQL transaction block,
    >
    > As Christoph said, you're responsible for supplying a BEGIN and COMMIT
    > around the call.
    >
    >                         regards, tom lane
    >