Update my2pg.pl for release.

This commit is contained in:
Bruce Momjian 2001-11-21 02:43:30 +00:00
parent 83d4a1cbe4
commit 3345da53ad

View File

@ -35,7 +35,8 @@
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE. # SUCH DAMAGE.
# #
# $Id: my2pg.pl,v 1.4 2001/03/06 22:46:50 momjian Exp $ # $My2pg: my2pg.pl,v 1.21 2001/08/25 18:55:28 fonin Exp $
# $Id: my2pg.pl,v 1.5 2001/11/21 02:43:30 momjian Exp $
# TODO: # TODO:
# + Handle SETs # + Handle SETs
@ -46,8 +47,31 @@
# #
# $Log: my2pg.pl,v $ # $Log: my2pg.pl,v $
# Revision 1.4 2001/03/06 22:46:50 momjian # Revision 1.5 2001/11/21 02:43:30 momjian
# Update my2pg, new version. # Update my2pg.pl for release.
#
# Revision 1.21 2001/08/25 18:55:28 fonin
# Incorporated changes from Yunliang Yu <yu@math.duke.edu>:
# - By default table & column names are not quoted; use the new
# "-d" option if you want to,
# - Use conditional substitutions to speed up and preserve
# the data integrity.
# Fixes by Max:
# - timestamps conversion fix. Shouldn't break now matching binary data and
# strings.
#
# Revision 1.21 2001/07/23 03:04:39 yu
# Updates & fixes by Yunliang Yu <yu@math.duke.edu>
# . By default table & column names are not quoted; use the new
# "-d" option if you want to,
# . Use conditional substitutions to speed up and preserve
# the data integrity.
#
# Revision 1.20 2001/07/05 12:45:05 fonin
# Timestamp conversion enhancement from Joakim Lemström <jocke@bytewize.com>
#
# Revision 1.19 2001/05/07 19:36:38 fonin
# Fixed a bug in quoting PRIMARY KEYs, KEYs and UNIQUE indexes with more than 2 columns. Thanks to Jeff Waugh <jaw@ic.net>.
# #
# Revision 1.18 2001/03/06 22:25:40 fonin # Revision 1.18 2001/03/06 22:25:40 fonin
# Documentation up2dating. # Documentation up2dating.
@ -94,9 +118,10 @@ use Getopt::Std;
my %opts; # command line options my %opts; # command line options
my $chareg=''; # CHAR conversion regexps my $chareg=''; # CHAR conversion regexps
my $dq=''; # double quote
# parse command line # parse command line
getopts('nh',\%opts); getopts('nhd',\%opts);
# output syntax # output syntax
if($opts{h} ne '') { if($opts{h} ne '') {
@ -108,12 +133,15 @@ if($opts{h} ne '') {
if($opts{n} ne '') { if($opts{n} ne '') {
$chareg='\s*?(default\s*?\'\')*?\s*?not\s*?null'; $chareg='\s*?(default\s*?\'\')*?\s*?not\s*?null';
} }
# want double quotes
if($opts{d} ne '') {
$dq='"';
}
$|=1; $|=1;
print("------------------------------------------------------------------"); print("------------------------------------------------------------------");
print("\n-- My2Pg \$Revision: 1.4 $ \translated dump"); print("\n-- My2Pg \$Revision: 1.5 $ \translated dump");
print("\n--"); print("\n--");
print("\n------------------------------------------------------------------"); print("\n------------------------------------------------------------------");
@ -135,19 +163,28 @@ $libtypename.='/libtypes.so';
# push header to libtypes.c # push header to libtypes.c
open(LIBTYPES,">$libtypesource"); open(LIBTYPES,">$libtypesource");
print LIBTYPES "/******************************************************"; print LIBTYPES "/******************************************************";
print LIBTYPES "\n * My2Pg \$Revision: 1.4 $ \translated dump"; print LIBTYPES "\n * My2Pg \$Revision: 1.5 $ \translated dump";
print LIBTYPES "\n * User types definitions"; print LIBTYPES "\n * User types definitions";
print LIBTYPES "\n ******************************************************/"; print LIBTYPES "\n ******************************************************/";
print LIBTYPES "\n\n#include <postgres.h>\n"; print LIBTYPES "\n\n#include <postgres.h>\n";
print LIBTYPES "\n#define ADD_COMMA if(strcmp(result,\"\")!=0) strcat(result,\",\")\n"; print LIBTYPES "\n#define ADD_COMMA if(strcmp(result,\"\")!=0) strcat(result,\",\")\n";
# reading STDIN... # reading STDIN...
my $tabledef=0; # we are outside a table definition
while (<>) { while (<>) {
if(!$tabledef && /^CREATE TABLE \S+/i){
$tabledef=1;
}elsif($tabledef && /^\);/i){ # /^\w/i
$tabledef=0;
}
# Comments start with -- in SQL # Comments start with -- in SQL
if(!/insert into.*\(.*#.*\)/i) { if(/^#/) {# !/insert into.*\(.*#.*\)/i, in mysqldump output
s/#/--/; s/#/--/;
} }
if($tabledef){##################################
# Convert numeric types # Convert numeric types
s/tinyint\(\d+\)/INT2/i; s/tinyint\(\d+\)/INT2/i;
s/smallint\(\d+\)/INT2/i; s/smallint\(\d+\)/INT2/i;
@ -165,11 +202,18 @@ while (<>) {
s/\w*blob$chareg/text/i; s/\w*blob$chareg/text/i;
s/mediumtext$chareg/text/i; s/mediumtext$chareg/text/i;
s/tinytext$chareg/text/i; s/tinytext$chareg/text/i;
s/\stext\s+not\s+null/ TEXT DEFAULT '' NOT NULL/i;
s/(.*?char\(.*?\))$chareg/$1/i; s/(.*?char\(.*?\))$chareg/$1/i;
# Old and New are reserved words in Postgres
s/^(\s+)Old /${1}MyOld /;
s/^(\s+)New /${1}MyNew /;
# Convert DATE types # Convert DATE types
s/datetime/TIMESTAMP/; s/datetime/TIMESTAMP/;
s/timestamp\(\d+\)/TIMESTAMP/i; s/timestamp\(\d+\)/TIMESTAMP/i;
s/ date / DATE /i;
s/,(\d{4})(\d{2})(\d{2}),/,'$1-$2-$3 00:00:00',/g;
# small hack - convert "default" to uppercase, because below we # small hack - convert "default" to uppercase, because below we
# enclose all lowercase words in double quotes # enclose all lowercase words in double quotes
@ -184,17 +228,9 @@ while (<>) {
#s/(int.*?)DEFAULT\s*?'.*?'(.*?)AUTO_INCREMENT/$1$2DEFAULT nextval\('$tmpseq'\)/i; #s/(int.*?)DEFAULT\s*?'.*?'(.*?)AUTO_INCREMENT/$1$2DEFAULT nextval\('$tmpseq'\)/i;
} }
# Fix timestamps
s/0000-00-00/0001-01-01/g;
# may work wrong !!!
s/00000000000000/00010101000000/g;
s/(\d{8})(\d{6})/'$1 $2'/g;
#<Hackzone> ---------------------------------------------------
# convert UNSIGNED to CHECK constraints # convert UNSIGNED to CHECK constraints
if(/^\s+?([\w\d_]+).*?unsigned/i) { if(/^\s+?([\w\d_]+).*?unsigned/i) {
$check.=",\n CHECK (\"$1\">=0)"; $check.=",\n CHECK ($dq$1$dq>=0)";
} }
s/unsigned//i; s/unsigned//i;
@ -553,7 +589,7 @@ CREATE OPERATOR <> (
# ); # );
# CREATE INDEX offer_id ON bids (offer_id,user_id,the_time); # CREATE INDEX offer_id ON bids (offer_id,user_id,the_time);
# CREATE INDEX bid_value ON bids (bid_value); # CREATE INDEX bid_value ON bids (bid_value);
if (s/CREATE TABLE (.*) /CREATE TABLE "$1" /i) { if (s/CREATE TABLE (.*) /CREATE TABLE $dq$1$dq /i) {
if($oldtable ne $table_name) { if($oldtable ne $table_name) {
$oldtable=$table_name; $oldtable=$table_name;
$j=-1; $j=-1;
@ -581,30 +617,41 @@ CREATE OPERATOR <> (
# output CHECK constraints instead UNSIGNED modifiers # output CHECK constraints instead UNSIGNED modifiers
if(/PRIMARY KEY \((.*)\)/i) { if(/PRIMARY KEY \((.*)\)/i) {
my $tmpfld=$1; my $tmpfld=$1;
$tmpfld=~s/,/","/; $tmpfld=~s/,/","/g if $dq;
s/PRIMARY KEY (\(.*\))/PRIMARY KEY \("$tmpfld"\)/i; s/PRIMARY KEY (\(.*\))/PRIMARY KEY \($dq$tmpfld$dq\)/i;
s/(PRIMARY KEY \(.*\)).*/$1$check\n/i; s/(PRIMARY KEY \(.*\)).*/$1$check\n/i;
} }
if(/^\s*KEY ([\w\d_]+)\s*\((.*)\).*/i) { if(/^\s*KEY ([\w\d_]+)\s*\((.*)\).*/i) {
my $tmpfld=$2; my $tmpfld=$2; my $ky=$1;
$tmpfld=~s/\s*,\s*/","/; $tmpfld=~s/\s*,\s*/","/g if $dq;
$index{$table_name}[++$j]="CREATE INDEX $1_$table_name\_index ON \"$table_name\" (\"$tmpfld\");"; $index{$table_name}[++$j]="CREATE INDEX ${ky}_$table_name\_index ON $dq$table_name$dq ($dq$tmpfld$dq);";
} }
if(/^\s*UNIQUE ([\w\d_]+)\s*\((.*)\).*/i) { if(/^\s*UNIQUE ([\w\d_]+)\s*\((.*)\).*/i) {
my $tmpfld=$2; my $tmpfld=$2; my $ky=$1;
$tmpfld=~s/,/","/; $tmpfld=~s/,/","/g if $dq;
$index{$table_name}[++$j]="CREATE UNIQUE INDEX $1_$table_name\_index ON \"$table_name\" (\"$tmpfld\");"; $index{$table_name}[++$j]="CREATE UNIQUE INDEX ${ky}_$table_name\_index ON $dq$table_name$dq ($dq$tmpfld$dq);";
} }
s/^\s*UNIQUE (.+).*(\(.*\)).*\n//i; s/^\s*UNIQUE (.+).*(\(.*\)).*\n//i;
s/^\s*KEY (.+).*(\(.*\)).*\n//i; s/^\s*KEY (.+).*(\(.*\)).*\n//i;
if($dq && !/^\s*(PRIMARY KEY|UNIQUE |KEY |CREATE TABLE |\);)/i){
s/\s([A-Za-z_\d]+)\s/ $dq$+$dq /;
}
} ####if($tabledef)###############################
if(!s/INSERT INTO\s+?(.*?)\s+?/INSERT INTO "$1" /i) { if($dq && !s/INSERT INTO\s+?(.*?)\s+?/INSERT INTO $dq$1$dq /i) {
# Quote lowercase identifiers in double quotes # Quote lowercase identifiers in double quotes
while(!/^--/ && s/\s([A-Za-z_\d]+[a-z][A-Za-z_\d]*)\s/ "$+" /) {;} #while(!/^--/ && s/\s([A-Za-z_\d]+[a-z][A-Za-z_\d]*)\s/ $dq$+$dq /) {;}
} }
# Fix timestamps
s/'0000-00-00/'0001-01-01/g;
# may work wrong !!!
s/([,(])00000000000000([,)])/$1'00010101 000000'$2/g;
s/([,(])(\d{8})(\d{6})([,)])/$1'$2 $3'$4/g;
s/([,(])(\d{4})(\d{2})(\d{2})([,)])/$1'$2-$3-$4 00:00:00'$5/g;
#<Hackzone> ---------------------------------------------------
#</Hackzone> -------------------------------------------------- #</Hackzone> --------------------------------------------------
$dump.=$_; $dump.=$_;
} }
@ -638,7 +685,7 @@ while(my($table,$s)=each(%seq)) {
# setting SERIAL sequence values right # setting SERIAL sequence values right
if($primary{$table} ne '') { if($primary{$table} ne '') {
print "\nSELECT SETVAL('".$seq{$table}."',(select case when max(\"".$primary{$table}."\")>0 then max(\"".$primary{$table}."\")+1 else 1 end from \"$table\"));"; print "\nSELECT SETVAL('".$seq{$table}."',(select case when max($dq".$primary{$table}."$dq)>0 then max($dq".$primary{$table}."$dq)+1 else 1 end from $dq$table$dq));";
} }
} }
@ -647,7 +694,7 @@ close(LIBTYPES);
open(MAKE,">Makefile"); open(MAKE,">Makefile");
print MAKE "# print MAKE "#
# My2Pg \$Revision: 1.4 $ \translated dump # My2Pg \$Revision: 1.5 $ \translated dump
# Makefile # Makefile
# #
@ -699,14 +746,15 @@ Copyright (c) 2000 Valentine Danilchuk <valdan\@ziet.zhitomir.ua>
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. code source for license details.
SYNTAX: SYNTAX:
my2pg [-hn] my2pg [-hnd]
OPTIONS: OPTIONS:
h - this help h - this help
n - convert *CHAR NOT NULL DEFAULT '' types to *CHAR NULL n - convert *CHAR NOT NULL DEFAULT '' types to *CHAR NULL
d - double quotes around table and column names
EOF EOF
; ;
} }
@ -795,6 +843,10 @@ My2pg takes the following command-line options:
Convert *CHAR DEFAULT '' NOT NULL types to *CHAR NULL. Convert *CHAR DEFAULT '' NOT NULL types to *CHAR NULL.
Postgres can't load empty '' strings in NOT NULL fields. Postgres can't load empty '' strings in NOT NULL fields.
=item -d
Add double quotes around table and column names
=item -h =item -h
Show usage banner. Show usage banner.
@ -851,6 +903,12 @@ include path, you need to check it before compiling.
B<(c) 2000 Maxim V. Rudensky (fonin@ziet.zhitomir.ua)> B<(c) 2000 Maxim V. Rudensky (fonin@ziet.zhitomir.ua)>
B<(c) 2000 Valentine V. Danilchuk (valdan@ziet.zhitomir.ua)> B<(c) 2000 Valentine V. Danilchuk (valdan@ziet.zhitomir.ua)>
=head1 CREDITS
Jeff Waugh <jaw@ic.net>
Joakim Lemström <jocke@bytewize.com> || <buddyh19@hotmail.com>
Yunliang Yu <yu@math.duke.edu>
=head1 LICENSE =head1 LICENSE
B<BSD> B<BSD>