Обсуждение: Binary large object processing problems
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;
}
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
## 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.
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.
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
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