Обсуждение: Binary large object processing problems

Поиск
Список
Период
Сортировка

Binary large object processing problems

От
Raivo Rebane
Дата:
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

Re: Binary large object processing problems

От
Christoph Moench-Tegeder
Дата:
## 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.



Re: Binary large object processing problems

От
Raivo Rebane
Дата:
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.

Re: Binary large object processing problems

От
Tom Lane
Дата:
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



Re: Binary large object processing problems

От
Raivo Rebane
Дата:
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