Fix: Gestion du double et gestion des ordres mysql "UNIQUE INDEX" et "INDEX"

This commit is contained in:
Laurent Destailleur 2005-03-02 23:07:46 +00:00
parent 459ffbdc46
commit 4bf603c113
21 changed files with 90 additions and 51 deletions

View File

@ -111,7 +111,11 @@ foreach my $file (keys %filelist) {
print OUT "-- (c) 2005, Laurent Destailleur.\n"; print OUT "-- (c) 2005, Laurent Destailleur.\n";
print OUT "\n"; print OUT "\n";
# Output for create table and create index
sub output_create { sub output_create {
# If command ends with "xxx,);", we change to "xxx);"
$create_sql =~ s/,(\s*)\)/$1\)/m;
print OUT $create_sql; print OUT $create_sql;
if ($create_index) { if ($create_index) {
print OUT "\n"; print OUT "\n";
@ -119,7 +123,7 @@ foreach my $file (keys %filelist) {
} }
} }
# reset when moving from each "create table" to "insert" part of dump # Reset when moving from each "create table" to "insert" part of dump
sub reset_vars() { sub reset_vars() {
$create_sql=""; $create_sql="";
$create_index=""; $create_index="";
@ -142,13 +146,15 @@ foreach my $file (keys %filelist) {
next; next;
} }
if ($create_sql ne "") { # we are inside create table statement so lets process datatypes if ($create_sql ne "") { # we are inside create table statement so lets process datatypes
if (/\);/i) { # end of create table squence if (/\);/i) { # end of create table squence
$create_sql =~ s/,$//g; # strip last , inside create table $create_sql =~ s/,$//g; # strip last , inside create table
&output_create; &output_create;
&reset_vars(); &reset_vars();
next; next;
# LDR Added innodb # LDR Added innodb
} elsif (/(ISAM|innodb)/i) { # end of create table sequence }
elsif (/(ISAM|innodb)/i) { # end of create table sequence
s/\) *Type=(MyISAM|innodb);/);/i; s/\) *Type=(MyISAM|innodb);/);/i;
$create_sql =~ s/,$//g; # strip last , inside create table $create_sql =~ s/,$//g; # strip last , inside create table
$create_sql .= $_; $create_sql .= $_;
@ -157,16 +163,20 @@ foreach my $file (keys %filelist) {
next; next;
} }
# enum -> check
if (/(\w*)\s+enum\(((?:['"]\w+['"]\s*,)+['"]\w+['"])\)(.*)$/i) { # enum handling if (/(\w*)\s+enum\(((?:['"]\w+['"]\s*,)+['"]\w+['"])\)(.*)$/i) { # enum handling
$enum_column=$1; $enum_column=$1;
$enum_datafield{$enum_column} = $2; # 'abc','def', ... $enum_datafield{$enum_column}=$2; # 'abc','def', ...
my $suite=$3;
my $maxlength=0; my $maxlength=0;
foreach my $enum (split(',',$2)) { foreach my $enum (split(',',$enum_datafield{$enum_column})) {
$enum =~ s/[\"\']//g; $enum =~ s/[\"\']//g;
if ($maxlength<length($enum)) { $maxlength=length($enum); } if ($maxlength<length($enum)) { $maxlength=length($enum); }
} }
$_ = qq~ $1 CHAR($maxlength) CHECK ($1 IN ($2)) $3\n~; $enum_datafield{$enum_column} =~ s/\"/\'/g;
} elsif (/^[\s\t]*(\w*)\s*.*int.*auto_increment/i) { # int,auto_increment -> serial $_ = qq~ $enum_column CHAR($maxlength) CHECK ($enum_column IN ($enum_datafield{$enum_column})) $suite\n~;
# int, auto_increment -> serial
} elsif (/^[\s\t]*(\w*)\s*.*int.*auto_increment/i) {
$seq = qq~${table}_${1}_seq~; $seq = qq~${table}_${1}_seq~;
s/[\s\t]*([a-zA-Z_0-9]*)\s*.*int.*auto_increment[^,]*/ $1 SERIAL PRIMARY KEY/ig; s/[\s\t]*([a-zA-Z_0-9]*)\s*.*int.*auto_increment[^,]*/ $1 SERIAL PRIMARY KEY/ig;
# MYSQL: data_id mediumint(8) unsigned NOT NULL auto_increment, # MYSQL: data_id mediumint(8) unsigned NOT NULL auto_increment,
@ -185,6 +195,7 @@ foreach my $file (keys %filelist) {
} }
s/\w*int\(\d+\)/$out/g; s/\w*int\(\d+\)/$out/g;
} }
# tinyint -> smallint
elsif (/tinyint/i) { elsif (/tinyint/i) {
s/tinyint/smallint/g; s/tinyint/smallint/g;
} }
@ -218,19 +229,31 @@ foreach my $file (keys %filelist) {
# nuke size of timestamp # nuke size of timestamp
s/timestamp\([^)]*\)/timestamp/i; s/timestamp\([^)]*\)/timestamp/i;
# double -> float8 # double -> real
s/double\([^)]*\)/float8/i; s/^double/real/i;
s/(\s*)double/${1}real/i;
# FIX: unique for multipe columns (col1,col2) are unsupported! # Ignore "unique key(xx, yy)" (key on double fields not supported by postgres)
# Ignore "unique key(xx, yy)"
next if (/unique key\(\w+\s*,\s*\w+\)/i); next if (/unique key\(\w+\s*,\s*\w+\)/i);
if (/\bkey\b/i && !/^\s+primary key\s+/i) { if (/\bkey\b/i && !/^\s+primary key\s+/i) {
s/KEY(\s+)[^(]*(\s+)/$1 UNIQUE $2/i; # hack off name of the non-primary key s/KEY(\s+)[^(]*(\s+)/$1 UNIQUE $2/i; # hack off name of the non-primary key
} }
# if key(xxx) # unique index(field)
if (/key\((\w+)\)/i) { if (/unique index\s*(\w*)\s*\((\w+)\)/i) {
$create_index .= "CREATE INDEX ".($1?"$1":"idx_$2")." ON $table ($2);\n";
next;
}
# index(field)
if (/index\s*(\w*)\s*\((\w+)\)/i) {
$create_index .= "CREATE INDEX ".($1?"$1":"idx_$2")." ON $table ($2);\n";
next;
}
# key(xxx)
if (/key\s*\((\w+)\)/i) {
#$create_index .= "CREATE INDEX ${table}_$1 ON $table ($1);\n"; #$create_index .= "CREATE INDEX ${table}_$1 ON $table ($1);\n";
$create_index .= "CREATE INDEX idx_$1 ON $table ($1);\n"; $create_index .= "CREATE INDEX idx_$1 ON $table ($1);\n";
next; next;

View File

@ -55,7 +55,8 @@ create table llx_adherent
"fk_user_mod" integer NOT NULL, "fk_user_mod" integer NOT NULL,
"fk_user_valid" integer NOT NULL, "fk_user_valid" integer NOT NULL,
"datefin" timestamp, -- date de fin de validité de la cotisation "datefin" timestamp, -- date de fin de validité de la cotisation
"note" text, "note" text
"UNIQUE" INDEX(login)
); );
CREATE INDEX idx_login ON llx_adherent (login);

View File

@ -33,5 +33,6 @@ create table llx_adherent_options
optid SERIAL PRIMARY KEY, optid SERIAL PRIMARY KEY,
"tms" timestamp, "tms" timestamp,
"adhid" integer NOT NULL, -- id de l'adherent auquel correspond ces attributs optionnel "adhid" integer NOT NULL, -- id de l'adherent auquel correspond ces attributs optionnel
"UNIQUE" INDEX(adhid)
); );
CREATE INDEX idx_adhid ON llx_adherent_options (adhid);

View File

@ -26,6 +26,7 @@
create table llx_bank_class create table llx_bank_class
( (
"lineid" integer NOT NULL, "lineid" integer NOT NULL,
"fk_categ" integer NOT NULL, "fk_categ" integer NOT NULL
"INDEX"(lineid)
); );
CREATE INDEX idx_lineid ON llx_bank_class (lineid);

View File

@ -29,6 +29,7 @@ create table llx_bookmark4u_login
( (
rowid SERIAL PRIMARY KEY, rowid SERIAL PRIMARY KEY,
"fk_user" integer, "fk_user" integer,
"bk4u_uid" integer, "bk4u_uid" integer
"UNIQUE" INDEX(fk_user)
); );
CREATE INDEX idx_fk_user ON llx_bookmark4u_login (fk_user);

View File

@ -35,9 +35,10 @@ create table llx_c_departements
"tncc" integer, "tncc" integer,
"ncc" varchar(50), "ncc" varchar(50),
"nom" varchar(50), "nom" varchar(50),
"active" smallint DEFAULT 1 NOT NULL, "active" smallint DEFAULT 1 NOT NULL
key (fk_region)
); );
CREATE INDEX idx_fk_region ON llx_c_departements (fk_region);

View File

@ -49,6 +49,7 @@ create table llx_commande
"total_ttc" real default 0, "total_ttc" real default 0,
"note" text, "note" text,
"model_pdf" varchar(50), "model_pdf" varchar(50),
"facture" smallint default 0, "facture" smallint default 0
"UNIQUE" INDEX (ref)
); );
CREATE INDEX idx_ref ON llx_commande (ref);

View File

@ -50,6 +50,7 @@ create table llx_commande_fournisseur
"total_ht" real default 0, "total_ht" real default 0,
"total_ttc" real default 0, "total_ttc" real default 0,
"note" text, "note" text,
"model_pdf" varchar(50), "model_pdf" varchar(50)
"UNIQUE" INDEX (ref)
); );
CREATE INDEX idx_ref ON llx_commande_fournisseur (ref);

View File

@ -36,6 +36,7 @@ create table llx_const
"value" text, -- max 65535 caracteres "value" text, -- max 65535 caracteres
"type" varchar(6) CHECK (type IN ('yesno','texte','chaine')) , "type" varchar(6) CHECK (type IN ('yesno','texte','chaine')) ,
"visible" smallint DEFAULT 1 NOT NULL, "visible" smallint DEFAULT 1 NOT NULL,
"note" text, "note" text
"UNIQUE" INDEX(name)
); );
CREATE INDEX idx_name ON llx_const (name);

View File

@ -40,9 +40,9 @@ create table llx_expedition
"fk_expedition_methode" integer, "fk_expedition_methode" integer,
"fk_statut" smallint DEFAULT 0, "fk_statut" smallint DEFAULT 0,
"note" text, "note" text,
"model_pdf" varchar(50), "model_pdf" varchar(50)
"UNIQUE" INDEX (ref)
); );
CREATE INDEX idx_ref ON llx_expedition (ref);
CREATE INDEX idx_fk_expedition_methode ON llx_expedition (fk_expedition_methode); CREATE INDEX idx_fk_expedition_methode ON llx_expedition (fk_expedition_methode);
CREATE INDEX idx_fk_commande ON llx_expedition (fk_commande); CREATE INDEX idx_fk_commande ON llx_expedition (fk_commande);

View File

@ -48,7 +48,8 @@ create table llx_facture
"fk_cond_reglement" integer, -- condition de reglement (30 jours, fin de mois ...) "fk_cond_reglement" integer, -- condition de reglement (30 jours, fin de mois ...)
"fk_mode_reglement" integer, -- mode de reglement (Virement, Prélèvement) "fk_mode_reglement" integer, -- mode de reglement (Virement, Prélèvement)
"date_lim_reglement" date, -- date limite de reglement "date_lim_reglement" date, -- date limite de reglement
"note" text, "note" text
"UNIQUE" INDEX (facnumber),
"INDEX" fksoc (fk_soc)
); );
CREATE INDEX idx_facnumber ON llx_facture (facnumber);
CREATE INDEX fksoc ON llx_facture (fk_soc);

View File

@ -42,6 +42,7 @@ create table llx_facture_rec
"fk_user_author" integer, -- createur "fk_user_author" integer, -- createur
"fk_projet" integer, -- projet auquel est associé la facture "fk_projet" integer, -- projet auquel est associé la facture
"fk_cond_reglement" integer, -- condition de reglement "fk_cond_reglement" integer, -- condition de reglement
"note" text, "note" text
"INDEX" fksoc (fk_soc)
); );
CREATE INDEX fksoc ON llx_facture_rec (fk_soc);

View File

@ -38,6 +38,7 @@ create table llx_fichinter
"fk_user_valid" integer, -- valideur de la fiche "fk_user_valid" integer, -- valideur de la fiche
"fk_statut" smallint DEFAULT 0, "fk_statut" smallint DEFAULT 0,
"duree" real, "duree" real,
"note" text, "note" text
"UNIQUE" INDEX (ref)
); );
CREATE INDEX idx_ref ON llx_fichinter (ref);

View File

@ -30,7 +30,7 @@ create table llx_groupart
"osc_id" integer NOT NULL, "osc_id" integer NOT NULL,
"tms" timestamp, "tms" timestamp,
"nom" varchar(64), "nom" varchar(64),
"groupart" varchar(7) CHECK (groupart IN ("artiste","groupe")) NOT NULL, "groupart" varchar(7) CHECK (groupart IN ('artiste','groupe')) NOT NULL,
"description" text NOT NULL, "description" text NOT NULL,
"fk_user_author" integer "fk_user_author" integer
); );

View File

@ -29,8 +29,9 @@ create table llx_paiement_facture
rowid SERIAL PRIMARY KEY, rowid SERIAL PRIMARY KEY,
"fk_paiement" integer, "fk_paiement" integer,
"fk_facture" integer, "fk_facture" integer,
"amount" real DEFAULT 0, "amount" real DEFAULT 0
key (fk_paiement),
key (fk_facture)
); );
CREATE INDEX idx_fk_paiement ON llx_paiement_facture (fk_paiement);
CREATE INDEX idx_fk_facture ON llx_paiement_facture (fk_facture);

View File

@ -33,8 +33,8 @@ create table llx_product
"ref" varchar(15) UNIQUE, "ref" varchar(15) UNIQUE,
"label" varchar(255), "label" varchar(255),
"description" text, "description" text,
"price" double, "price" real,
"tva_tx" double DEFAULT 19.6, "tva_tx" real DEFAULT 19.6,
"fk_user_author" integer, "fk_user_author" integer,
"envente" smallint DEFAULT 1, "envente" smallint DEFAULT 1,
"nbvente" integer DEFAULT 0, "nbvente" integer DEFAULT 0,

View File

@ -30,8 +30,8 @@ create table llx_product_price
"tms" timestamp, "tms" timestamp,
"fk_product" integer NOT NULL, "fk_product" integer NOT NULL,
"date_price" timestamp, "date_price" timestamp,
"price" double, "price" real,
"tva_tx" double DEFAULT 19.6, "tva_tx" real DEFAULT 19.6,
"fk_user_author" integer, "fk_user_author" integer,
"envente" smallint DEFAULT 1 "envente" smallint DEFAULT 1
); );

View File

@ -37,6 +37,7 @@ create table llx_projet
"title" varchar(255), "title" varchar(255),
"fk_user_resp" integer, -- responsable du projet "fk_user_resp" integer, -- responsable du projet
"fk_user_creat" integer, -- createur du projet "fk_user_creat" integer, -- createur du projet
"note" text, "note" text
"UNIQUE" INDEX(ref)
); );
CREATE INDEX idx_ref ON llx_projet (ref);

View File

@ -46,6 +46,7 @@ create table llx_propal
"tva" real DEFAULT 0, "tva" real DEFAULT 0,
"total" real DEFAULT 0, "total" real DEFAULT 0,
"note" text, "note" text,
"model_pdf" varchar(50), "model_pdf" varchar(50)
"UNIQUE" INDEX (ref)
); );
CREATE INDEX idx_ref ON llx_propal (ref);

View File

@ -65,6 +65,7 @@ create table llx_societe
"fk_user_creat" integer, -- utilisateur qui a créé l'info "fk_user_creat" integer, -- utilisateur qui a créé l'info
"fk_user_modif" integer, -- utilisateur qui a modifié l'info "fk_user_modif" integer, -- utilisateur qui a modifié l'info
"remise_client" real DEFAULT 0, -- remise systématique pour le client "remise_client" real DEFAULT 0, -- remise systématique pour le client
"UNIQUE" INDEX(prefix_comm)
); );
CREATE INDEX idx_prefix_comm ON llx_societe (prefix_comm);

View File

@ -42,6 +42,7 @@ create table llx_user
"module_compta" smallint DEFAULT 1, "module_compta" smallint DEFAULT 1,
"fk_societe" integer DEFAULT 0, "fk_societe" integer DEFAULT 0,
"fk_socpeople" integer DEFAULT 0, "fk_socpeople" integer DEFAULT 0,
"note" text, "note" text
"UNIQUE" INDEX(login)
); );
CREATE INDEX idx_login ON llx_user (login);