Skip to content
Snippets Groups Projects
Commit 3345da53 authored by Bruce Momjian's avatar Bruce Momjian
Browse files

Update my2pg.pl for release.

parent 83d4a1cb
Branches
Tags
No related merge requests found
...@@ -35,7 +35,8 @@ ...@@ -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 @@ ...@@ -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; ...@@ -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 '') { ...@@ -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'; ...@@ -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 (<>) { ...@@ -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 (<>) { ...@@ -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 <> ( ...@@ -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 <> ( ...@@ -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)) { ...@@ -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); ...@@ -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> ...@@ -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: ...@@ -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. ...@@ -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>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment