Hello,
this is patch v 0.4 to support transactions with BLOBs. All BLOBs are in one table. You need to make initdb. -- Sincerely Yours, Denis Perchine
This commit is contained in:
parent
d8e582e236
commit
cf5a950c10
@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Makefile for catalog
|
# Makefile for catalog
|
||||||
#
|
#
|
||||||
# $Header: /cvsroot/pgsql/src/backend/catalog/Makefile,v 1.25 2000/09/17 13:02:30 petere Exp $
|
# $Header: /cvsroot/pgsql/src/backend/catalog/Makefile,v 1.26 2000/10/08 03:18:53 momjian Exp $
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -11,7 +11,8 @@ top_builddir = ../../..
|
|||||||
include $(top_builddir)/src/Makefile.global
|
include $(top_builddir)/src/Makefile.global
|
||||||
|
|
||||||
OBJS = catalog.o heap.o index.o indexing.o aclchk.o \
|
OBJS = catalog.o heap.o index.o indexing.o aclchk.o \
|
||||||
pg_aggregate.o pg_operator.o pg_proc.o pg_type.o
|
pg_aggregate.o pg_largeobject.o pg_operator.o pg_proc.o \
|
||||||
|
pg_type.o
|
||||||
|
|
||||||
BKIFILES = global.bki template1.bki global.description template1.description
|
BKIFILES = global.bki template1.bki global.description template1.description
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.67 2000/07/14 22:17:41 tgl Exp $
|
* $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.68 2000/10/08 03:18:53 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -51,6 +51,8 @@ char *Name_pg_inherits_indices[Num_pg_inherits_indices] =
|
|||||||
{InheritsRelidSeqnoIndex};
|
{InheritsRelidSeqnoIndex};
|
||||||
char *Name_pg_language_indices[Num_pg_language_indices] =
|
char *Name_pg_language_indices[Num_pg_language_indices] =
|
||||||
{LanguageOidIndex, LanguageNameIndex};
|
{LanguageOidIndex, LanguageNameIndex};
|
||||||
|
char *Name_pg_largeobject_indices[Num_pg_largeobject_indices] =
|
||||||
|
{LargeobjectLOIdIndex, LargeobjectLOIdPNIndex};
|
||||||
char *Name_pg_listener_indices[Num_pg_listener_indices] =
|
char *Name_pg_listener_indices[Num_pg_listener_indices] =
|
||||||
{ListenerPidRelnameIndex};
|
{ListenerPidRelnameIndex};
|
||||||
char *Name_pg_opclass_indices[Num_pg_opclass_indices] =
|
char *Name_pg_opclass_indices[Num_pg_opclass_indices] =
|
||||||
|
138
src/backend/catalog/pg_largeobject.c
Normal file
138
src/backend/catalog/pg_largeobject.c
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
/*-------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* pg_largeobject.c
|
||||||
|
* routines to support manipulation of the pg_largeobject relation
|
||||||
|
*
|
||||||
|
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||||
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* IDENTIFICATION
|
||||||
|
* $Header: /cvsroot/pgsql/src/backend/catalog/pg_largeobject.c,v 1.1 2000/10/08 03:18:53 momjian Exp $
|
||||||
|
*
|
||||||
|
*-------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
#include "postgres.h"
|
||||||
|
|
||||||
|
#include "access/genam.h"
|
||||||
|
#include "access/heapam.h"
|
||||||
|
#include "access/itup.h"
|
||||||
|
#include "catalog/catname.h"
|
||||||
|
#include "catalog/indexing.h"
|
||||||
|
#include "catalog/pg_largeobject.h"
|
||||||
|
#include "miscadmin.h"
|
||||||
|
#include "parser/parse_func.h"
|
||||||
|
#include "utils/builtins.h"
|
||||||
|
#include "utils/syscache.h"
|
||||||
|
|
||||||
|
bytea *_byteain(const char *data, int32 size);
|
||||||
|
|
||||||
|
bytea *_byteain(const char *data, int32 size) {
|
||||||
|
bytea *result;
|
||||||
|
|
||||||
|
result = (bytea *)palloc(size + VARHDRSZ);
|
||||||
|
result->vl_len = size + VARHDRSZ;
|
||||||
|
if (size > 0)
|
||||||
|
memcpy(result->vl_dat, data, size);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Oid LargeobjectCreate(Oid loid) {
|
||||||
|
Oid retval;
|
||||||
|
Relation pg_largeobject;
|
||||||
|
HeapTuple ntup = (HeapTuple) palloc(sizeof(HeapTupleData));
|
||||||
|
Relation idescs[Num_pg_largeobject_indices];
|
||||||
|
Datum values[Natts_pg_largeobject];
|
||||||
|
char nulls[Natts_pg_largeobject];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i=0; i<Natts_pg_largeobject; i++) {
|
||||||
|
nulls[i] = ' ';
|
||||||
|
values[i] = (Datum)NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
values[i++] = ObjectIdGetDatum(loid);
|
||||||
|
values[i++] = Int32GetDatum(0);
|
||||||
|
values[i++] = (Datum) _byteain(NULL, 0);
|
||||||
|
|
||||||
|
pg_largeobject = heap_openr(LargeobjectRelationName, RowExclusiveLock);
|
||||||
|
ntup = heap_formtuple(pg_largeobject->rd_att, values, nulls);
|
||||||
|
retval = heap_insert(pg_largeobject, ntup);
|
||||||
|
|
||||||
|
if (!IsIgnoringSystemIndexes()) {
|
||||||
|
CatalogOpenIndices(Num_pg_largeobject_indices, Name_pg_largeobject_indices, idescs);
|
||||||
|
CatalogIndexInsert(idescs, Num_pg_largeobject_indices, pg_largeobject, ntup);
|
||||||
|
CatalogCloseIndices(Num_pg_largeobject_indices, idescs);
|
||||||
|
}
|
||||||
|
|
||||||
|
heap_close(pg_largeobject, RowExclusiveLock);
|
||||||
|
heap_freetuple(ntup);
|
||||||
|
|
||||||
|
CommandCounterIncrement();
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LargeobjectDrop(Oid loid) {
|
||||||
|
Relation pg_largeobject;
|
||||||
|
Relation pg_lo_id;
|
||||||
|
ScanKeyData skey;
|
||||||
|
IndexScanDesc sd = (IndexScanDesc) NULL;
|
||||||
|
RetrieveIndexResult indexRes;
|
||||||
|
int found = 0;
|
||||||
|
|
||||||
|
ScanKeyEntryInitialize(&skey,
|
||||||
|
(bits16) 0x0,
|
||||||
|
(AttrNumber) 1,
|
||||||
|
(RegProcedure) F_OIDEQ,
|
||||||
|
ObjectIdGetDatum(loid));
|
||||||
|
|
||||||
|
pg_largeobject = heap_openr(LargeobjectRelationName, RowShareLock);
|
||||||
|
pg_lo_id = index_openr(LargeobjectLOIdIndex);
|
||||||
|
|
||||||
|
sd = index_beginscan(pg_lo_id, false, 1, &skey);
|
||||||
|
|
||||||
|
while((indexRes = index_getnext(sd, ForwardScanDirection))) {
|
||||||
|
found++;
|
||||||
|
heap_delete(pg_largeobject, &indexRes->heap_iptr, NULL);
|
||||||
|
pfree(indexRes);
|
||||||
|
}
|
||||||
|
|
||||||
|
index_endscan(sd);
|
||||||
|
|
||||||
|
index_close(pg_lo_id);
|
||||||
|
heap_close(pg_largeobject, RowShareLock);
|
||||||
|
if (found == 0)
|
||||||
|
elog(ERROR, "LargeobjectDrop: large object %d not found", loid);
|
||||||
|
}
|
||||||
|
|
||||||
|
int LargeobjectFind(Oid loid) {
|
||||||
|
int retval = 0;
|
||||||
|
Relation pg_lo_id;
|
||||||
|
ScanKeyData skey;
|
||||||
|
IndexScanDesc sd = (IndexScanDesc) NULL;
|
||||||
|
RetrieveIndexResult indexRes;
|
||||||
|
|
||||||
|
ScanKeyEntryInitialize(&skey,
|
||||||
|
(bits16) 0x0,
|
||||||
|
(AttrNumber) 1,
|
||||||
|
(RegProcedure) F_OIDEQ,
|
||||||
|
ObjectIdGetDatum(loid));
|
||||||
|
|
||||||
|
pg_lo_id = index_openr(LargeobjectLOIdIndex);
|
||||||
|
|
||||||
|
sd = index_beginscan(pg_lo_id, false, 1, &skey);
|
||||||
|
|
||||||
|
if ((indexRes = index_getnext(sd, ForwardScanDirection))) {
|
||||||
|
retval = 1;
|
||||||
|
pfree(indexRes);
|
||||||
|
}
|
||||||
|
|
||||||
|
index_endscan(sd);
|
||||||
|
|
||||||
|
index_close(pg_lo_id);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/libpq/be-fsstubs.c,v 1.50 2000/07/17 03:04:54 tgl Exp $
|
* $Header: /cvsroot/pgsql/src/backend/libpq/be-fsstubs.c,v 1.51 2000/10/08 03:18:54 momjian Exp $
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
* This should be moved to a more appropriate place. It is here
|
* This should be moved to a more appropriate place. It is here
|
||||||
@ -267,7 +267,7 @@ lo_creat(PG_FUNCTION_ARGS)
|
|||||||
PG_RETURN_OID(InvalidOid);
|
PG_RETURN_OID(InvalidOid);
|
||||||
}
|
}
|
||||||
|
|
||||||
lobjId = RelationGetRelid(lobjDesc->heap_r);
|
lobjId = lobjDesc->id;
|
||||||
|
|
||||||
inv_close(lobjDesc);
|
inv_close(lobjDesc);
|
||||||
|
|
||||||
@ -512,8 +512,10 @@ lo_commit(bool isCommit)
|
|||||||
{
|
{
|
||||||
if (cookies[i] != NULL)
|
if (cookies[i] != NULL)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
if (isCommit)
|
if (isCommit)
|
||||||
inv_cleanindex(cookies[i]);
|
inv_cleanindex(cookies[i]);
|
||||||
|
*/
|
||||||
cookies[i] = NULL;
|
cookies[i] = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.74 2000/07/14 22:17:48 tgl Exp $
|
* $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.75 2000/10/08 03:18:54 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -261,15 +261,11 @@ inv_close(LargeObjectDesc *obj_desc)
|
|||||||
{
|
{
|
||||||
Assert(PointerIsValid(obj_desc));
|
Assert(PointerIsValid(obj_desc));
|
||||||
|
|
||||||
if (obj_desc->iscan != (IndexScanDesc) NULL)
|
if (obj_desc->flags & IFS_WRLOCK)
|
||||||
{
|
heap_close(obj_desc->heap_r, RowExclusiveLock);
|
||||||
index_endscan(obj_desc->iscan);
|
else if (obj_desc->flags & IFS_RDLOCK)
|
||||||
obj_desc->iscan = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
index_close(obj_desc->index_r);
|
|
||||||
heap_close(obj_desc->heap_r, AccessShareLock);
|
heap_close(obj_desc->heap_r, AccessShareLock);
|
||||||
|
index_close(obj_desc->index_r);
|
||||||
pfree(obj_desc);
|
pfree(obj_desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: catname.h,v 1.12 2000/01/26 05:57:56 momjian Exp $
|
* $Id: catname.h,v 1.13 2000/10/08 03:18:55 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -29,6 +29,7 @@
|
|||||||
#define InheritsRelationName "pg_inherits"
|
#define InheritsRelationName "pg_inherits"
|
||||||
#define InheritancePrecidenceListRelationName "pg_ipl"
|
#define InheritancePrecidenceListRelationName "pg_ipl"
|
||||||
#define LanguageRelationName "pg_language"
|
#define LanguageRelationName "pg_language"
|
||||||
|
#define LargeobjectRelationName "pg_largeobject"
|
||||||
#define ListenerRelationName "pg_listener"
|
#define ListenerRelationName "pg_listener"
|
||||||
#define LogRelationName "pg_log"
|
#define LogRelationName "pg_log"
|
||||||
#define OperatorClassRelationName "pg_opclass"
|
#define OperatorClassRelationName "pg_opclass"
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: indexing.h,v 1.40 2000/06/17 04:56:30 tgl Exp $
|
* $Id: indexing.h,v 1.41 2000/10/08 03:18:55 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -31,6 +31,7 @@
|
|||||||
#define Num_pg_index_indices 2
|
#define Num_pg_index_indices 2
|
||||||
#define Num_pg_inherits_indices 1
|
#define Num_pg_inherits_indices 1
|
||||||
#define Num_pg_language_indices 2
|
#define Num_pg_language_indices 2
|
||||||
|
#define Num_pg_largeobject_indices 2
|
||||||
#define Num_pg_listener_indices 1
|
#define Num_pg_listener_indices 1
|
||||||
#define Num_pg_opclass_indices 2
|
#define Num_pg_opclass_indices 2
|
||||||
#define Num_pg_operator_indices 2
|
#define Num_pg_operator_indices 2
|
||||||
@ -92,6 +93,7 @@ extern char *Name_pg_group_indices[];
|
|||||||
extern char *Name_pg_index_indices[];
|
extern char *Name_pg_index_indices[];
|
||||||
extern char *Name_pg_inherits_indices[];
|
extern char *Name_pg_inherits_indices[];
|
||||||
extern char *Name_pg_language_indices[];
|
extern char *Name_pg_language_indices[];
|
||||||
|
extern char *Name_pg_largeobject_indices[];
|
||||||
extern char *Name_pg_listener_indices[];
|
extern char *Name_pg_listener_indices[];
|
||||||
extern char *Name_pg_opclass_indices[];
|
extern char *Name_pg_opclass_indices[];
|
||||||
extern char *Name_pg_operator_indices[];
|
extern char *Name_pg_operator_indices[];
|
||||||
|
63
src/include/catalog/pg_largeobject.h
Normal file
63
src/include/catalog/pg_largeobject.h
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/*-------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* pg_largeobject.h
|
||||||
|
* definition of the system "largeobject" relation (pg_largeobject)
|
||||||
|
* along with the relation's initial contents.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||||
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
|
*
|
||||||
|
* $Id: pg_largeobject.h,v 1.1 2000/10/08 03:18:56 momjian Exp $
|
||||||
|
*
|
||||||
|
* NOTES
|
||||||
|
* the genbki.sh script reads this file and generates .bki
|
||||||
|
* information from the DATA() statements.
|
||||||
|
*
|
||||||
|
*-------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
#ifndef PG_LARGEOBJECT_H
|
||||||
|
#define PG_LARGEOBJECT_H
|
||||||
|
|
||||||
|
/* ----------------
|
||||||
|
* postgres.h contains the system type definintions and the
|
||||||
|
* CATALOG(), BOOTSTRAP and DATA() sugar words so this file
|
||||||
|
* can be read by both genbki.sh and the C compiler.
|
||||||
|
* ----------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* ----------------
|
||||||
|
* pg_largeobject definition. cpp turns this into
|
||||||
|
* typedef struct FormData_pg_largeobject. Large object id
|
||||||
|
* is stored in loid;
|
||||||
|
* ----------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
CATALOG(pg_largeobject)
|
||||||
|
{
|
||||||
|
Oid loid;
|
||||||
|
int4 pageno;
|
||||||
|
bytea data;
|
||||||
|
} FormData_pg_largeobject;
|
||||||
|
|
||||||
|
/* ----------------
|
||||||
|
* Form_pg_largeobject corresponds to a pointer to a tuple with
|
||||||
|
* the format of pg_largeobject relation.
|
||||||
|
* ----------------
|
||||||
|
*/
|
||||||
|
typedef FormData_pg_largeobject *Form_pg_largeobject;
|
||||||
|
|
||||||
|
/* ----------------
|
||||||
|
* compiler constants for pg_largeobject
|
||||||
|
* ----------------
|
||||||
|
*/
|
||||||
|
#define Natts_pg_largeobject 3
|
||||||
|
#define Anum_pg_largeobject_loid 1
|
||||||
|
#define Anum_pg_largeobject_pageno 2
|
||||||
|
#define Anum_pg_largeobject_data 3
|
||||||
|
|
||||||
|
Oid LargeobjectCreate(Oid loid);
|
||||||
|
void LargeobjectDrop(Oid loid);
|
||||||
|
int LargeobjectFind(Oid loid);
|
||||||
|
|
||||||
|
#endif /* PG_LARGEOBJECT_H */
|
@ -8,7 +8,7 @@
|
|||||||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: large_object.h,v 1.13 2000/01/26 05:58:33 momjian Exp $
|
* $Id: large_object.h,v 1.14 2000/10/08 03:18:57 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -22,17 +22,11 @@
|
|||||||
/*
|
/*
|
||||||
* This structure will eventually have lots more stuff associated with it.
|
* This structure will eventually have lots more stuff associated with it.
|
||||||
*/
|
*/
|
||||||
typedef struct LargeObjectDesc
|
typedef struct LargeObjectDesc {
|
||||||
{
|
Relation heap_r;
|
||||||
Relation heap_r; /* heap relation */
|
Relation index_r;
|
||||||
Relation index_r; /* index relation on seqno attribute */
|
|
||||||
IndexScanDesc iscan; /* index scan we're using */
|
|
||||||
TupleDesc hdesc; /* heap relation tuple desc */
|
|
||||||
TupleDesc idesc; /* index relation tuple desc */
|
|
||||||
uint32 lowbyte; /* low byte on the current page */
|
|
||||||
uint32 highbyte; /* high byte on the current page */
|
|
||||||
uint32 offset; /* current seek pointer */
|
uint32 offset; /* current seek pointer */
|
||||||
ItemPointerData htid; /* tid of current heap tuple */
|
Oid id;
|
||||||
|
|
||||||
#define IFS_RDLOCK (1 << 0)
|
#define IFS_RDLOCK (1 << 0)
|
||||||
#define IFS_WRLOCK (1 << 1)
|
#define IFS_WRLOCK (1 << 1)
|
||||||
@ -55,7 +49,4 @@ extern int inv_tell(LargeObjectDesc *obj_desc);
|
|||||||
extern int inv_read(LargeObjectDesc *obj_desc, char *buf, int nbytes);
|
extern int inv_read(LargeObjectDesc *obj_desc, char *buf, int nbytes);
|
||||||
extern int inv_write(LargeObjectDesc *obj_desc, char *buf, int nbytes);
|
extern int inv_write(LargeObjectDesc *obj_desc, char *buf, int nbytes);
|
||||||
|
|
||||||
/* added for buffer leak prevention [ PA ] */
|
|
||||||
extern void inv_cleanindex(LargeObjectDesc *obj_desc);
|
|
||||||
|
|
||||||
#endif /* LARGE_OBJECT_H */
|
#endif /* LARGE_OBJECT_H */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user