Re: A PGLIB lo_export function for Win32

From: "Eric G(dot) Miller" <egm2(at)jps(dot)net>
To: PG-General <pgsql-general(at)postgresql(dot)org>
Subject: Re: A PGLIB lo_export function for Win32
Date: 2001-07-06 02:20:29
Message-ID: 20010705192029.C22929@calico.local
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Thu, Jul 05, 2001 at 02:20:18PM -0700, Scott Holmes wrote:
> Well, I'm making progress in my attempt to incorporate large objects in my NT
> application. At this point I can export an object but the resulting file is
> corrupt. The object within the database is not corrupt. I have checked by
> using the normal lo_export function. Following is the section of code used to
> create the file. I have removed the error checks for readability here. The
> normal C function calls open(), write(), and close() as well as the single
> call to lo_export() produce the corrupted file, the commented out Win32
> calls cause a memory fault.

open(), write() and close() are not standard C. Maybe you'd prefer to
use fopen(), fwrite() and fclose()?

> res = PQexec(conn, "begin");
> PQclear(res);
>
> lobj_fd = lo_open(conn, lobjId, INV_READ);
>
> /* lo_export(conn, lobjId, filename); */
>
> fd = open(filename, OF_CREATE | OF_WRITE, 0666);
^^^^^^^^^^^^^^^^^^^^
What are these symbols? Are they windows'isms?
O_CREAT | O_TRUNC | O_WRONLY

But maybe, 'fopen (filename, "wb");' would be more portable? Make
sure to use "wb" on Windows which does sh*t behind your back if you
don't and you really want a binary file.

> /* fd = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_DELETE
> | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
> FILE_ATTRIBUTE_NORMAL, NULL); */
>
> while ((nbytes = lo_read(conn, lobj_fd, buf, BUFSIZE)) > 0)
> {
> tmp = write(fd, buf, nbytes);

Generally, this shouldn't fail for regular files, but why capture
the bytes written if you aren't going to do something with it?

>
> /* tmp =WriteFile(fd, buf, nbytes, BUFSIZE, NULL); */
>
> }
>
> /* (void) lo_close(conn, lobj_fd); */
>
> (void) close(fd);
> (void) CloseHandle(fd);

What are these (void) casts for? And what's the difference between
close(fd) and CloseHandle(fd) ? Looks like you're closing the same
file twice. That should generate an error.

> res = PQexec(conn, "end");
> PQclear(res);
> PQfinish(conn);

--
Eric G. Miller <egm2(at)jps(dot)net>

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Eric Chacon 2001-07-06 02:44:05 Function Won't Compile
Previous Message Joshua Jore 2001-07-06 01:16:23 Re: OpenBSD Trusted Path Execution (TPE) compatibility?