|
35 | 35 | # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
36 | 36 | # SUCH DAMAGE.
|
37 | 37 | #
|
38 |
| -# $Id: my2pg.pl,v 1.4 2001/03/06 22:46:50 momjian Exp $ |
| 38 | +# $My2pg: my2pg.pl,v 1.21 2001/08/25 18:55:28 fonin Exp $ |
| 39 | +# $Id: my2pg.pl,v 1.5 2001/11/21 02:43:30 momjian Exp $ |
39 | 40 |
|
40 | 41 | # TODO:
|
41 | 42 | # + Handle SETs
|
|
46 | 47 |
|
47 | 48 | #
|
48 | 49 | # $Log: my2pg.pl,v $
|
49 |
| -# Revision 1.4 2001/03/06 22:46:50 momjian |
50 |
| -# Update my2pg, new version. |
| 50 | +# Revision 1.5 2001/11/21 02:43:30 momjian |
| 51 | +# Update my2pg.pl for release. |
| 52 | +# |
| 53 | +# Revision 1.21 2001/08/25 18:55:28 fonin |
| 54 | +# Incorporated changes from Yunliang Yu <yu@math.duke.edu>: |
| 55 | +# - By default table & column names are not quoted; use the new |
| 56 | +# "-d" option if you want to, |
| 57 | +# - Use conditional substitutions to speed up and preserve |
| 58 | +# the data integrity. |
| 59 | +# Fixes by Max: |
| 60 | +# - timestamps conversion fix. Shouldn't break now matching binary data and |
| 61 | +# strings. |
| 62 | +# |
| 63 | +# Revision 1.21 2001/07/23 03:04:39 yu |
| 64 | +# Updates & fixes by Yunliang Yu <yu@math.duke.edu> |
| 65 | +# . By default table & column names are not quoted; use the new |
| 66 | +# "-d" option if you want to, |
| 67 | +# . Use conditional substitutions to speed up and preserve |
| 68 | +# the data integrity. |
| 69 | +# |
| 70 | +# Revision 1.20 2001/07/05 12:45:05 fonin |
| 71 | +# Timestamp conversion enhancement from Joakim Lemström <jocke@bytewize.com> |
| 72 | +# |
| 73 | +# Revision 1.19 2001/05/07 19:36:38 fonin |
| 74 | +# Fixed a bug in quoting PRIMARY KEYs, KEYs and UNIQUE indexes with more than 2 columns. Thanks to Jeff Waugh <jaw@ic.net>. |
51 | 75 | #
|
52 | 76 | # Revision 1.18 2001/03/06 22:25:40 fonin
|
53 | 77 | # Documentation up2dating.
|
|
94 | 118 |
|
95 | 119 | my%opts;# command line options
|
96 | 120 | my$chareg='';# CHAR conversion regexps
|
| 121 | +my$dq='';# double quote |
97 | 122 |
|
98 | 123 | # parse command line
|
99 |
| -getopts('nh',\%opts); |
| 124 | +getopts('nhd',\%opts); |
100 | 125 |
|
101 | 126 | # output syntax
|
102 | 127 | if($opts{h}ne'') {
|
|
108 | 133 | if($opts{n}ne'') {
|
109 | 134 | $chareg='\s*?(default\s*?\'\')*?\s*?not\s*?null';
|
110 | 135 | }
|
111 |
| - |
| 136 | +# want double quotes |
| 137 | +if($opts{d}ne'') { |
| 138 | +$dq='"'; |
| 139 | +} |
112 | 140 |
|
113 | 141 | $|=1;
|
114 | 142 |
|
115 | 143 | print("------------------------------------------------------------------");
|
116 |
| -print("\n-- My2Pg\$Revision: 1.4 $\translated dump"); |
| 144 | +print("\n-- My2Pg\$Revision: 1.5 $\translated dump"); |
117 | 145 | print("\n--");
|
118 | 146 | print("\n------------------------------------------------------------------");
|
119 | 147 |
|
|
135 | 163 | # push header to libtypes.c
|
136 | 164 | open(LIBTYPES,">$libtypesource");
|
137 | 165 | print LIBTYPES"/******************************************************";
|
138 |
| -print LIBTYPES"\n * My2Pg\$Revision: 1.4 $\translated dump"; |
| 166 | +print LIBTYPES"\n * My2Pg\$Revision: 1.5 $\translated dump"; |
139 | 167 | print LIBTYPES"\n * User types definitions";
|
140 | 168 | print LIBTYPES"\n ******************************************************/";
|
141 | 169 | print LIBTYPES"\n\n#include <postgres.h>\n";
|
142 | 170 | print LIBTYPES"\n#define ADD_COMMA if(strcmp(result,\"\")!=0) strcat(result,\",\")\n";
|
143 | 171 |
|
144 | 172 | # reading STDIN...
|
| 173 | +my$tabledef=0;# we are outside a table definition |
145 | 174 | while (<>) {
|
146 | 175 |
|
| 176 | +if(!$tabledef &&/^CREATE TABLE\S+/i){ |
| 177 | +$tabledef=1; |
| 178 | +}elsif($tabledef &&/^\);/i){# /^\w/i |
| 179 | +$tabledef=0; |
| 180 | +} |
| 181 | + |
147 | 182 | # Comments start with -- in SQL
|
148 |
| -if(!/insert into.*\(.*#.*\)/i) { |
| 183 | +if(/^#/) {#!/insert into.*\(.*#.*\)/i, in mysqldump output |
149 | 184 | s/#/--/;
|
150 | 185 | }
|
| 186 | + |
| 187 | +if($tabledef){################################## |
151 | 188 | # Convert numeric types
|
152 | 189 | s/tinyint\(\d+\)/INT2/i;
|
153 | 190 | s/smallint\(\d+\)/INT2/i;
|
|
165 | 202 | s/\w*blob$chareg/text/i;
|
166 | 203 | s/mediumtext$chareg/text/i;
|
167 | 204 | s/tinytext$chareg/text/i;
|
| 205 | +s/\stext\s+not\s+null/ TEXT DEFAULT '' NOT NULL/i; |
168 | 206 | s/(.*?char\(.*?\))$chareg/$1/i;
|
169 | 207 |
|
| 208 | +# Old and New are reserved words in Postgres |
| 209 | +s/^(\s+)Old/${1}MyOld/; |
| 210 | +s/^(\s+)New/${1}MyNew/; |
| 211 | + |
170 | 212 | # Convert DATE types
|
171 | 213 | s/datetime/TIMESTAMP/;
|
172 | 214 | s/timestamp\(\d+\)/TIMESTAMP/i;
|
| 215 | +s/ date/ DATE/i; |
| 216 | +s/,(\d{4})(\d{2})(\d{2}),/,'$1-$2-$3 00:00:00',/g; |
173 | 217 |
|
174 | 218 | # small hack - convert "default" to uppercase, because below we
|
175 | 219 | # enclose all lowercase words in double quotes
|
|
184 | 228 | #s/(int.*?)DEFAULT\s*?'.*?'(.*?)AUTO_INCREMENT/$1$2DEFAULT nextval\('$tmpseq'\)/i;
|
185 | 229 | }
|
186 | 230 |
|
187 |
| -# Fix timestamps |
188 |
| -s/0000-00-00/0001-01-01/g; |
189 |
| -# may work wrong !!! |
190 |
| -s/00000000000000/00010101000000/g; |
191 |
| -s/(\d{8})(\d{6})/'$1$2'/g; |
192 |
| - |
193 |
| -#<Hackzone> --------------------------------------------------- |
194 |
| - |
195 | 231 | # convert UNSIGNED to CHECK constraints
|
196 | 232 | if(/^\s+?([\w\d_]+).*?unsigned/i) {
|
197 |
| -$check.=",\n CHECK (\"$1\">=0)"; |
| 233 | +$check.=",\n CHECK ($dq$1$dq>=0)"; |
198 | 234 | }
|
199 | 235 | s/unsigned//i;
|
200 | 236 |
|
|
553 | 589 | # );
|
554 | 590 | # CREATE INDEX offer_id ON bids (offer_id,user_id,the_time);
|
555 | 591 | # CREATE INDEX bid_value ON bids (bid_value);
|
556 |
| -if (s/CREATE TABLE (.*)/CREATE TABLE"$1"/i) { |
| 592 | +if (s/CREATE TABLE (.*)/CREATE TABLE$dq$1$dq/i) { |
557 | 593 | if($oldtablene$table_name) {
|
558 | 594 | $oldtable=$table_name;
|
559 | 595 | $j=-1;
|
|
581 | 617 | # output CHECK constraints instead UNSIGNED modifiers
|
582 | 618 | if(/PRIMARY KEY\((.*)\)/i) {
|
583 | 619 | my$tmpfld=$1;
|
584 |
| -$tmpfld=~s/,/","/; |
585 |
| -s/PRIMARY KEY (\(.*\))/PRIMARY KEY\("$tmpfld"\)/i; |
| 620 | +$tmpfld=~s/,/","/gif$dq; |
| 621 | +s/PRIMARY KEY (\(.*\))/PRIMARY KEY\($dq$tmpfld$dq\)/i; |
586 | 622 | s/(PRIMARY KEY\(.*\)).*/$1$check\n/i;
|
587 | 623 | }
|
588 | 624 |
|
589 | 625 | if(/^\s*KEY ([\w\d_]+)\s*\((.*)\).*/i) {
|
590 |
| -my$tmpfld=$2; |
591 |
| -$tmpfld=~s/\s*,\s*/","/; |
592 |
| -$index{$table_name}[++$j]="CREATE INDEX $1_$table_name\_index ON\"$table_name\" (\"$tmpfld\");"; |
| 626 | +my$tmpfld=$2;my$ky=$1; |
| 627 | +$tmpfld=~s/\s*,\s*/","/gif$dq; |
| 628 | +$index{$table_name}[++$j]="CREATE INDEX${ky}_$table_name\_index ON$dq$table_name$dq ($dq$tmpfld$dq);"; |
593 | 629 | }
|
594 | 630 | if(/^\s*UNIQUE ([\w\d_]+)\s*\((.*)\).*/i) {
|
595 |
| -my$tmpfld=$2; |
596 |
| -$tmpfld=~s/,/","/; |
597 |
| -$index{$table_name}[++$j]="CREATE UNIQUE INDEX $1_$table_name\_index ON\"$table_name\" (\"$tmpfld\");"; |
| 631 | +my$tmpfld=$2;my$ky=$1; |
| 632 | +$tmpfld=~s/,/","/gif$dq; |
| 633 | +$index{$table_name}[++$j]="CREATE UNIQUE INDEX${ky}_$table_name\_index ON$dq$table_name$dq ($dq$tmpfld$dq);"; |
598 | 634 | }
|
599 | 635 | s/^\s*UNIQUE (.+).*(\(.*\)).*\n//i;
|
600 | 636 | s/^\s*KEY (.+).*(\(.*\)).*\n//i;
|
| 637 | + |
| 638 | +if($dq && !/^\s*(PRIMARY KEY|UNIQUE |KEY |CREATE TABLE |\);)/i){ |
| 639 | +s/\s([A-Za-z_\d]+)\s/$dq$+$dq/; |
| 640 | + } |
| 641 | + }####if($tabledef)############################### |
601 | 642 |
|
602 |
| -if(!s/INSERT INTO\s+?(.*?)\s+?/INSERT INTO"$1"/i) { |
| 643 | +if($dq &&!s/INSERT INTO\s+?(.*?)\s+?/INSERT INTO$dq$1$dq/i) { |
603 | 644 | # Quote lowercase identifiers in double quotes
|
604 |
| -while(!/^--/ &&s/\s([A-Za-z_\d]+[a-z][A-Za-z_\d]*)\s/"$+"/) {;} |
| 645 | +#while(!/^--/ && s/\s([A-Za-z_\d]+[a-z][A-Za-z_\d]*)\s/$dq$+$dq /) {;} |
605 | 646 | }
|
606 | 647 |
|
607 |
| - |
| 648 | +# Fix timestamps |
| 649 | +s/'0000-00-00/'0001-01-01/g; |
| 650 | +# may work wrong !!! |
| 651 | +s/([,(])00000000000000([,)])/$1'00010101 000000'$2/g; |
| 652 | +s/([,(])(\d{8})(\d{6})([,)])/$1'$2$3'$4/g; |
| 653 | +s/([,(])(\d{4})(\d{2})(\d{2})([,)])/$1'$2-$3-$4 00:00:00'$5/g; |
| 654 | +#<Hackzone> --------------------------------------------------- |
608 | 655 | #</Hackzone> --------------------------------------------------
|
609 | 656 | $dump.=$_;
|
610 | 657 | }
|
|
638 | 685 |
|
639 | 686 | # setting SERIAL sequence values right
|
640 | 687 | if($primary{$table}ne'') {
|
641 |
| -print"\nSELECT SETVAL('".$seq{$table}."',(select case when max(\"".$primary{$table}."\")>0 then max(\"".$primary{$table}."\")+1 else 1 end from\"$table\"));"; |
| 688 | +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));"; |
642 | 689 | }
|
643 | 690 | }
|
644 | 691 |
|
|
647 | 694 |
|
648 | 695 | open(MAKE,">Makefile");
|
649 | 696 | print MAKE"#
|
650 |
| -# My2Pg\$Revision: 1.4 $\translated dump |
| 697 | +# My2Pg\$Revision: 1.5 $\translated dump |
651 | 698 | # Makefile
|
652 | 699 | #
|
653 | 700 |
|
|
699 | 746 | This program is distributed in the hope that it will be useful,
|
700 | 747 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
701 | 748 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
702 |
| -GNU General Public Licenseformore details. |
| 749 | +code sourceforlicense details. |
703 | 750 |
|
704 | 751 | SYNTAX:
|
705 |
| - my2pg [-hn] |
| 752 | + my2pg [-hnd] |
706 | 753 |
|
707 | 754 | OPTIONS:
|
708 | 755 | h- this help
|
709 | 756 | n- convert *CHAR NOT NULL DEFAULT '' types to *CHAR NULL
|
| 757 | + d - double quotes around table and column names |
710 | 758 | EOF
|
711 | 759 | ;
|
712 | 760 | }
|
@@ -795,6 +843,10 @@ =head1 COMMAND-LINE OPTIONS
|
795 | 843 | Convert *CHAR DEFAULT '' NOT NULL types to *CHAR NULL.
|
796 | 844 | Postgres can't load empty '' strings in NOT NULL fields.
|
797 | 845 |
|
| 846 | +=item-d |
| 847 | +
|
| 848 | +Add double quotes around table and column names |
| 849 | +
|
798 | 850 | =item-h
|
799 | 851 |
|
800 | 852 | Show usage banner.
|
@@ -851,6 +903,12 @@ =head1 AUTHORS
|
851 | 903 | B<(c) 2000 Maxim V. Rudensky (fonin@ziet.zhitomir.ua)>
|
852 | 904 | B<(c) 2000 Valentine V. Danilchuk (valdan@ziet.zhitomir.ua)>
|
853 | 905 |
|
| 906 | +=head1CREDITS |
| 907 | +
|
| 908 | +Jeff Waugh <jaw@ic.net> |
| 909 | +Joakim Lemström <jocke@bytewize.com> || <buddyh19@hotmail.com> |
| 910 | +Yunliang Yu <yu@math.duke.edu> |
| 911 | +
|
854 | 912 | =head1LICENSE
|
855 | 913 |
|
856 | 914 | B<BSD>
|
|