diff options
author | Marc G. Fournier <scrappy@hub.org> | 1996-08-24 20:49:41 +0000 |
---|---|---|
committer | Marc G. Fournier <scrappy@hub.org> | 1996-08-24 20:49:41 +0000 |
commit | 208a30f23db0926604a338eda4ed69b5c278d2e2 (patch) | |
tree | a6b31fe54d006b5402d5dc6a3ee21dd573442116 /src/backend/commands/copy.c | |
parent | 2adb6d703bd255f531fc8e33c9d6abd8d6236a0b (diff) | |
download | postgresql-208a30f23db0926604a338eda4ed69b5c278d2e2.tar.gz postgresql-208a30f23db0926604a338eda4ed69b5c278d2e2.zip |
The patch does several things:
It adds a WITH OIDS option to the copy command, which allows
dumping and loading of oids.
If a copy command tried to load in an oid that is greater than
its current system max oid, the system max oid is incremented. No
checking is done to see if other backends are running and have cached
oids.
pg_dump as its first step when using the -o (oid) option, will
copy in a dummy row to set the system max oid value so as rows are
loaded in, they are certain to be lower than the system oid.
pg_dump now creates indexes at the end to speed loading
Submitted by: Bruce Momjian <maillist@candle.pha.pa.us>
Diffstat (limited to 'src/backend/commands/copy.c')
-rw-r--r-- | src/backend/commands/copy.c | 52 |
1 files changed, 40 insertions, 12 deletions
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index e17100a0fb0..109f36f3e52 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -6,7 +6,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.3 1996/08/14 05:33:04 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.4 1996/08/24 20:48:14 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -22,11 +22,13 @@ #include "catalog/pg_index.h" #include "catalog/index.h" +#include "storage/bufmgr.h" #include "access/heapam.h" #include "access/htup.h" #include "access/itup.h" #include "access/relscan.h" #include "access/funcindex.h" +#include "access/transam.h" #include "access/tupdesc.h" #include "nodes/execnodes.h" #include "nodes/plannodes.h" @@ -50,8 +52,8 @@ static bool reading_from_input = false; /* non-export function prototypes */ -static void CopyTo(Relation rel, bool binary, FILE *fp, char *delim); -static void CopyFrom(Relation rel, bool binary, FILE *fp, char *delim); +static void CopyTo(Relation rel, bool binary, bool oids, FILE *fp, char *delim); +static void CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim); static Oid GetOutputFunction(Oid type); static Oid GetTypeElement(Oid type); static Oid GetInputFunction(Oid type); @@ -59,14 +61,14 @@ static Oid IsTypeByVal(Oid type); static void GetIndexRelations(Oid main_relation_oid, int *n_indices, Relation **index_rels); -static char *CopyReadAttribute(int attno, FILE *fp, bool *isnull, char *delim); +static char *CopyReadAttribute(FILE *fp, bool *isnull, char *delim); static void CopyAttributeOut(FILE *fp, char *string, char *delim); static int CountTuples(Relation relation); extern FILE *Pfout, *Pfin; void -DoCopy(char *relname, bool binary, bool from, bool pipe, char *filename, +DoCopy(char *relname, bool binary, bool oids, bool from, bool pipe, char *filename, char *delim) { FILE *fp; @@ -86,7 +88,7 @@ DoCopy(char *relname, bool binary, bool from, bool pipe, char *filename, if (fp == NULL) { elog(WARN, "COPY: file %s could not be open for reading", filename); } - CopyFrom(rel, binary, fp, delim); + CopyFrom(rel, binary, oids, fp, delim); }else { mode_t oumask = umask((mode_t) 0); @@ -102,7 +104,7 @@ DoCopy(char *relname, bool binary, bool from, bool pipe, char *filename, if (fp == NULL) { elog(WARN, "COPY: file %s could not be open for writing", filename); } - CopyTo(rel, binary, fp, delim); + CopyTo(rel, binary, oids, fp, delim); } if (!pipe) { fclose(fp); @@ -113,7 +115,7 @@ DoCopy(char *relname, bool binary, bool from, bool pipe, char *filename, } static void -CopyTo(Relation rel, bool binary, FILE *fp, char *delim) +CopyTo(Relation rel, bool binary, bool oids, FILE *fp, char *delim) { HeapTuple tuple; HeapScanDesc scandesc; @@ -159,6 +161,11 @@ CopyTo(Relation rel, bool binary, FILE *fp, char *delim) for (tuple = heap_getnext(scandesc, 0, NULL); tuple != NULL; tuple = heap_getnext(scandesc, 0, NULL)) { + + if (oids && !binary) { + fputs(oidout(tuple->t_oid),fp); + fputc(delim[0], fp); + } for (i = 0; i < attr_count; i++) { value = (Datum) @@ -197,6 +204,9 @@ CopyTo(Relation rel, bool binary, FILE *fp, char *delim) length = tuple->t_len - tuple->t_hoff; fwrite(&length, sizeof(int32), 1, fp); + if (oids) + fwrite((char *) &tuple->t_oid, sizeof(int32), 1, fp); + fwrite(&null_ct, sizeof(int32), 1, fp); if (null_ct > 0) { for (i = 0; i < attr_count; i++) { @@ -222,7 +232,7 @@ CopyTo(Relation rel, bool binary, FILE *fp, char *delim) } static void -CopyFrom(Relation rel, bool binary, FILE *fp, char *delim) +CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim) { HeapTuple tuple; IndexTuple ituple; @@ -260,7 +270,8 @@ CopyFrom(Relation rel, bool binary, FILE *fp, char *delim) int n_indices; InsertIndexResult indexRes; TupleDesc tupDesc; - + Oid loaded_oid; + tupDesc = RelationGetTupleDescriptor(rel); attr = tupDesc->attrs; attr_count = tupDesc->natts; @@ -374,8 +385,18 @@ CopyFrom(Relation rel, bool binary, FILE *fp, char *delim) while (!done) { if (!binary) { + if (oids) { + string = CopyReadAttribute(fp, &isnull, delim); + if (string == NULL) + done = 1; + else { + loaded_oid = oidin(string); + if (loaded_oid < BootstrapObjectIdData) + elog(WARN, "COPY TEXT: Invalid Oid"); + } + } for (i = 0; i < attr_count && !done; i++) { - string = CopyReadAttribute(i, fp, &isnull, delim); + string = CopyReadAttribute(fp, &isnull, delim); if (isnull) { values[i] = PointerGetDatum(NULL); nulls[i] = 'n'; @@ -401,6 +422,11 @@ CopyFrom(Relation rel, bool binary, FILE *fp, char *delim) if (feof(fp)) { done = 1; }else { + if (oids) { + fread(&loaded_oid, sizeof(int32), 1, fp); + if (loaded_oid < BootstrapObjectIdData) + elog(WARN, "COPY BINARY: Invalid Oid"); + } fread(&null_ct, sizeof(int32), 1, fp); if (null_ct > 0) { for (i = 0; i < null_ct; i++) { @@ -476,6 +502,8 @@ CopyFrom(Relation rel, bool binary, FILE *fp, char *delim) tupDesc = CreateTupleDesc(attr_count, attr); tuple = heap_formtuple(tupDesc, values, nulls); + if (oids) + tuple->t_oid = loaded_oid; heap_insert(rel, tuple); if (has_index) { @@ -699,7 +727,7 @@ inString(char c, char* s) */ static char * -CopyReadAttribute(int attno, FILE *fp, bool *isnull, char *delim) +CopyReadAttribute(FILE *fp, bool *isnull, char *delim) { static char attribute[EXT_ATTLEN]; char c; |