blob: 85fe3369328966b244b7fde95e8d4ca8268df671 [file]
#! /usr/bin/perl -w
#-------------------------------------------------------------------------
#
# process_foreign_keys.pl
#
# Usage: cat <input headers> | perl process_foreign_keys.pl
#
# Reads catalog header files, and spits out a json file containing
# information about any foreign keys, as declared in FOREIGN_KEY lines
# in the headers.
#
#
# Portions Copyright (c) 2016-Present VMware, Inc. or its affiliates.
# Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
# Portions Copyright (c) 1994, Regents of the University of California
#
#
# IDENTIFICATION
# src/backend/catalog/process_foreign_keys.pl
#
#-------------------------------------------------------------------------
use Text::ParseWords;
use strict;
use warnings;
my $catversion = 'unknown';
my $catalogname;
my %catalogs = ();
# Read all the header files from stdin (the caller is expected to cat
# and pipe them to us). For each FOREIGN_KEY declaration, add an entry
# in $catalogs hash table.
while (<>)
{
if (m/^#define CATALOG_VERSION_NO\s+(\d+)/) {
$catversion = $1;
}
if (m/^CATALOG\(([[:word:]]+)/) {
# This is the beginning of a new catalog. Reset our variables.
$catalogname = $1;
}
# E.g.
# FOREIGN_KEY(oprnamespace REFERENCES pg_namespace(oid))
if (m/^FOREIGN_KEY\(([[:word:]]+)\s+REFERENCES\s+([[:word:]]+)\s*\(([[:word:]]+)\)/) {
# This is the beginning of a new catalog. Reset our variables.
my %t = (fieldname => $1,
pktable => $2,
pkcol => $3 );
push(@{$catalogs{$catalogname}}, \%t);
}
}
# Spit out the Json file.
# common header
print "{\n";
print " \"__comment\" : \"Generated by process_foreign_keys.pl\",\n";
print " \"__info\" : { \"CATALOG_VERSION_NO\" : \"$catversion\" }";
# for each catalog table
for(sort keys %catalogs) {
my $catalogname = $_;
print ",\n";
print " \"$catalogname\" : {\n";
print " \"foreign_keys\" : [\n";
# for each foreign key declaration in the catalog table
my $firstfk = 1;
for my $t (@{$catalogs{$catalogname}}) {
my $fieldname = $t->{fieldname};
my $pktable = $t->{pktable};
my $pkcol = $t->{pkcol};
if (!$firstfk)
{
print ",\n";
}
$firstfk = 0;
print " [ [\"$fieldname\"], \"$pktable\", [\"$pkcol\"] ]";
}
print "\n";
print " ]\n";
print " }";
}
print "\n";
print "}\n";