mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-02-17 19:30:00 +08:00
Make the world safe for unsigned OIDs.
This commit is contained in:
parent
a70e74b060
commit
cfbcb6bb21
@ -1,26 +1,29 @@
|
|||||||
/*
|
/*
|
||||||
* PostgreSQL type definitions for managed LargeObjects.
|
* PostgreSQL type definitions for managed LargeObjects.
|
||||||
*
|
*
|
||||||
* $Id: lo.c,v 1.5 2000/11/20 20:36:55 tgl Exp $
|
* $Header: /cvsroot/pgsql/contrib/lo/lo.c,v 1.6 2000/11/21 21:51:58 tgl Exp $
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "postgres.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <postgres.h>
|
#include "utils/palloc.h"
|
||||||
#include <utils/palloc.h>
|
|
||||||
|
|
||||||
/* Required for largeobjects */
|
/* Required for largeobjects */
|
||||||
#include <libpq/libpq-fs.h>
|
#include "libpq/libpq-fs.h"
|
||||||
#include <libpq/be-fsstubs.h>
|
#include "libpq/be-fsstubs.h"
|
||||||
|
|
||||||
/* Required for SPI */
|
/* Required for SPI */
|
||||||
#include <executor/spi.h>
|
#include "executor/spi.h"
|
||||||
|
|
||||||
/* Required for triggers */
|
/* Required for triggers */
|
||||||
#include <commands/trigger.h>
|
#include "commands/trigger.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define atooid(x) ((Oid) strtoul((x), NULL, 10))
|
||||||
|
|
||||||
/* required for tolower() */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is the internal storage format for managed large objects
|
* This is the internal storage format for managed large objects
|
||||||
@ -40,7 +43,7 @@ Blob *lo(Oid oid); /* Return Blob based on oid */
|
|||||||
Datum lo_manage(PG_FUNCTION_ARGS); /* Trigger handler */
|
Datum lo_manage(PG_FUNCTION_ARGS); /* Trigger handler */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This creates a large object, and set's its OID to the value in the
|
* This creates a large object, and sets its OID to the value in the
|
||||||
* supplied string.
|
* supplied string.
|
||||||
*
|
*
|
||||||
* If the string is empty, then a new LargeObject is created, and its oid
|
* If the string is empty, then a new LargeObject is created, and its oid
|
||||||
@ -55,20 +58,13 @@ lo_in(char *str)
|
|||||||
|
|
||||||
if (strlen(str) > 0)
|
if (strlen(str) > 0)
|
||||||
{
|
{
|
||||||
|
count = sscanf(str, "%u", &oid);
|
||||||
count = sscanf(str, "%d", &oid);
|
|
||||||
|
|
||||||
if (count < 1)
|
if (count < 1)
|
||||||
{
|
|
||||||
elog(ERROR, "lo_in: error in parsing \"%s\"", str);
|
elog(ERROR, "lo_in: error in parsing \"%s\"", str);
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (oid < 0)
|
if (oid == InvalidOid)
|
||||||
{
|
|
||||||
elog(ERROR, "lo_in: illegal oid \"%s\"", str);
|
elog(ERROR, "lo_in: illegal oid \"%s\"", str);
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -79,10 +75,7 @@ lo_in(char *str)
|
|||||||
oid = DatumGetObjectId(DirectFunctionCall1(lo_creat,
|
oid = DatumGetObjectId(DirectFunctionCall1(lo_creat,
|
||||||
Int32GetDatum(INV_READ | INV_WRITE)));
|
Int32GetDatum(INV_READ | INV_WRITE)));
|
||||||
if (oid == InvalidOid)
|
if (oid == InvalidOid)
|
||||||
{
|
|
||||||
elog(ERROR, "lo_in: InvalidOid returned from lo_creat");
|
elog(ERROR, "lo_in: InvalidOid returned from lo_creat");
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (Blob *) palloc(sizeof(Blob));
|
result = (Blob *) palloc(sizeof(Blob));
|
||||||
@ -104,7 +97,7 @@ lo_out(Blob * addr)
|
|||||||
return (NULL);
|
return (NULL);
|
||||||
|
|
||||||
result = (char *) palloc(32);
|
result = (char *) palloc(32);
|
||||||
sprintf(result, "%d", *addr);
|
sprintf(result, "%u", *addr);
|
||||||
return (result);
|
return (result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -190,7 +183,7 @@ lo_manage(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
if ((orig != newv && (orig == NULL || newv == NULL)) || (orig != NULL && newv != NULL && strcmp(orig, newv)))
|
if ((orig != newv && (orig == NULL || newv == NULL)) || (orig != NULL && newv != NULL && strcmp(orig, newv)))
|
||||||
DirectFunctionCall1(lo_unlink,
|
DirectFunctionCall1(lo_unlink,
|
||||||
ObjectIdGetDatum((Oid) atoi(orig)));
|
ObjectIdGetDatum(atooid(orig)));
|
||||||
|
|
||||||
if (newv)
|
if (newv)
|
||||||
pfree(newv);
|
pfree(newv);
|
||||||
@ -211,7 +204,7 @@ lo_manage(PG_FUNCTION_ARGS)
|
|||||||
if (orig != NULL)
|
if (orig != NULL)
|
||||||
{
|
{
|
||||||
DirectFunctionCall1(lo_unlink,
|
DirectFunctionCall1(lo_unlink,
|
||||||
ObjectIdGetDatum((Oid) atoi(orig)));
|
ObjectIdGetDatum(atooid(orig)));
|
||||||
|
|
||||||
pfree(orig);
|
pfree(orig);
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
--
|
--
|
||||||
-- PostgreSQL code for LargeObjects
|
-- PostgreSQL code for LargeObjects
|
||||||
--
|
--
|
||||||
-- $Id: lo.sql.in,v 1.5 2000/11/20 20:36:55 tgl Exp $
|
-- $Id: lo.sql.in,v 1.6 2000/11/21 21:51:58 tgl Exp $
|
||||||
--
|
--
|
||||||
--
|
--
|
||||||
-- Create the data type
|
-- Create the data type
|
||||||
@ -33,6 +33,15 @@ create function lo_oid(lo)
|
|||||||
as 'MODULE_PATHNAME'
|
as 'MODULE_PATHNAME'
|
||||||
language 'c';
|
language 'c';
|
||||||
|
|
||||||
|
-- same function, named to allow it to be used as a type coercion, eg:
|
||||||
|
-- create table a (image lo);
|
||||||
|
-- select image::oid from a;
|
||||||
|
--
|
||||||
|
create function oid(lo)
|
||||||
|
returns oid
|
||||||
|
as 'MODULE_PATHNAME', 'lo_oid'
|
||||||
|
language 'c';
|
||||||
|
|
||||||
-- this allows us to convert an oid to a managed lo object
|
-- this allows us to convert an oid to a managed lo object
|
||||||
-- ie: insert into test values (lo_import('/fullpath/file')::lo);
|
-- ie: insert into test values (lo_import('/fullpath/file')::lo);
|
||||||
create function lo(oid)
|
create function lo(oid)
|
||||||
@ -44,13 +53,4 @@ create function lo(oid)
|
|||||||
create function lo_manage()
|
create function lo_manage()
|
||||||
returns opaque
|
returns opaque
|
||||||
as 'MODULE_PATHNAME'
|
as 'MODULE_PATHNAME'
|
||||||
language 'C';
|
language 'c';
|
||||||
|
|
||||||
-- This allows us to map lo to oid
|
|
||||||
--
|
|
||||||
-- eg:
|
|
||||||
-- create table a (image lo);
|
|
||||||
-- select image::oid from a;
|
|
||||||
--
|
|
||||||
create function oid(lo) returns oid as 'select lo_oid($1)' language 'sql';
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user