From d6b57ac053c4b633ee19e1225a396a9e3e0c6c4e Mon Sep 17 00:00:00 2001
From: Costin Leau <cleau@vmware.com>
Date: Thu, 26 Nov 2009 20:50:10 +0000
Subject: [PATCH] SPR-6447 + improve mysql script to prevent data from being
 added if it's already present

---
 src/main/resources/db/db_readme.txt        | 10 ++--
 src/main/resources/db/mysql/createDB.txt   |  3 --
 src/main/resources/db/mysql/dropDB.txt     |  1 -
 src/main/resources/db/mysql/initDB.txt     | 36 ++++++++-------
 src/main/resources/db/mysql/populateDB.txt | 53 ++++++++++++++++++++++
 src/main/resources/jdbc.properties         |  2 +-
 6 files changed, 77 insertions(+), 28 deletions(-)
 delete mode 100644 src/main/resources/db/mysql/createDB.txt
 delete mode 100644 src/main/resources/db/mysql/dropDB.txt
 create mode 100644 src/main/resources/db/mysql/populateDB.txt

diff --git a/src/main/resources/db/db_readme.txt b/src/main/resources/db/db_readme.txt
index 80deff0..55fbb62 100644
--- a/src/main/resources/db/db_readme.txt
+++ b/src/main/resources/db/db_readme.txt
@@ -7,9 +7,7 @@
 --------------------------------------------------------------------------------
 
 In its default configuration, Petclinic uses an in-memory database (HSQLDB) which
-gets populated at startup with data. Since there is no persistent support, once
-the application is destroyed, so is the database.
-If a persistent database configuration is chosen, make sure to change the datasource
-inside the relevant application-*.xml so that the schema and the data do not get 
-inserted each time the application is started. Additionally, update the jdbc.properties
-file to reflect your change.
\ No newline at end of file
+gets populated at startup with data. A similar setup is provided for Mysql in case
+a persistent database configuration is needed.
+Note that whenever the database type is changed, the jdbc.properties file needs to
+be updated.
\ No newline at end of file
diff --git a/src/main/resources/db/mysql/createDB.txt b/src/main/resources/db/mysql/createDB.txt
deleted file mode 100644
index 5b4b385..0000000
--- a/src/main/resources/db/mysql/createDB.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-CREATE DATABASE petclinic;
-
-GRANT ALL PRIVILEGES ON petclinic.* TO pc@localhost IDENTIFIED BY 'pc';
\ No newline at end of file
diff --git a/src/main/resources/db/mysql/dropDB.txt b/src/main/resources/db/mysql/dropDB.txt
deleted file mode 100644
index e1209da..0000000
--- a/src/main/resources/db/mysql/dropDB.txt
+++ /dev/null
@@ -1 +0,0 @@
-DROP DATABASE petclinic;
diff --git a/src/main/resources/db/mysql/initDB.txt b/src/main/resources/db/mysql/initDB.txt
index 0007ee3..b90d184 100644
--- a/src/main/resources/db/mysql/initDB.txt
+++ b/src/main/resources/db/mysql/initDB.txt
@@ -1,32 +1,36 @@
+CREATE DATABASE IF NOT EXISTS petclinic;
+GRANT ALL PRIVILEGES ON petclinic.* TO pc@localhost IDENTIFIED BY 'pc';
+
 USE petclinic;
 
-CREATE TABLE vets (
+CREATE TABLE IF NOT EXISTS vets (
   id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
   first_name VARCHAR(30),
   last_name VARCHAR(30),
   INDEX(last_name)
 ) engine=InnoDB;
 
-CREATE TABLE specialties (
+CREATE TABLE IF NOT EXISTS specialties (
   id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
   name VARCHAR(80),
   INDEX(name)
 ) engine=InnoDB;
 
-CREATE TABLE vet_specialties (
+CREATE TABLE IF NOT EXISTS vet_specialties (
   vet_id INT(4) UNSIGNED NOT NULL,
-  specialty_id INT(4) UNSIGNED NOT NULL
+  specialty_id INT(4) UNSIGNED NOT NULL,
+  FOREIGN KEY (vet_id) REFERENCES vets(id),
+  FOREIGN KEY (specialty_id) REFERENCES specialties(id),
+  UNIQUE (vet_id,specialty_id)
 ) engine=InnoDB;
-ALTER TABLE vet_specialties ADD CONSTRAINT fk_vet_specialties_vets FOREIGN KEY (vet_id) REFERENCES vets(id);
-ALTER TABLE vet_specialties ADD CONSTRAINT fk_vet_specialties_specialties FOREIGN KEY (specialty_id) REFERENCES specialties(id);
 
-CREATE TABLE types (
+CREATE TABLE IF NOT EXISTS types (
   id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
   name VARCHAR(80),
   INDEX(name)
 ) engine=InnoDB;
 
-CREATE TABLE owners (
+CREATE TABLE IF NOT EXISTS owners (
   id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
   first_name VARCHAR(30),
   last_name VARCHAR(30),
@@ -36,23 +40,21 @@ CREATE TABLE owners (
   INDEX(last_name)
 ) engine=InnoDB;
 
-CREATE TABLE pets (
+CREATE TABLE IF NOT EXISTS pets (
   id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
   name VARCHAR(30),
   birth_date DATE,
   type_id INT(4) UNSIGNED NOT NULL,
   owner_id INT(4) UNSIGNED NOT NULL,
-  INDEX(name)
+  INDEX(name),
+  FOREIGN KEY (owner_id) REFERENCES owners(id),
+  FOREIGN KEY (type_id) REFERENCES types(id)
 ) engine=InnoDB;
-ALTER TABLE pets ADD CONSTRAINT fk_pets_owners FOREIGN KEY (owner_id) REFERENCES owners(id);
-ALTER TABLE pets ADD CONSTRAINT fk_pets_types FOREIGN KEY (type_id) REFERENCES types(id);
-CREATE INDEX pets_name ON pets(name);
 
-CREATE TABLE visits (
+CREATE TABLE IF NOT EXISTS visits (
   id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
   pet_id INT(4) UNSIGNED NOT NULL,
   visit_date DATE,
   description VARCHAR(255),
-  INDEX(pet_id)
-) engine=InnoDB;
-ALTER TABLE visits ADD CONSTRAINT fk_visits_pets FOREIGN KEY (pet_id) REFERENCES pets(id);
+  FOREIGN KEY (pet_id) REFERENCES pets(id)
+) engine=InnoDB;
\ No newline at end of file
diff --git a/src/main/resources/db/mysql/populateDB.txt b/src/main/resources/db/mysql/populateDB.txt
new file mode 100644
index 0000000..0a1cc9c
--- /dev/null
+++ b/src/main/resources/db/mysql/populateDB.txt
@@ -0,0 +1,53 @@
+INSERT IGNORE INTO vets VALUES (1, 'James', 'Carter');
+INSERT IGNORE INTO vets VALUES (2, 'Helen', 'Leary');
+INSERT IGNORE INTO vets VALUES (3, 'Linda', 'Douglas');
+INSERT IGNORE INTO vets VALUES (4, 'Rafael', 'Ortega');
+INSERT IGNORE INTO vets VALUES (5, 'Henry', 'Stevens');
+INSERT IGNORE INTO vets VALUES (6, 'Sharon', 'Jenkins');
+
+INSERT IGNORE INTO specialties VALUES (1, 'radiology');
+INSERT IGNORE INTO specialties VALUES (2, 'surgery');
+INSERT IGNORE INTO specialties VALUES (3, 'dentistry');
+
+INSERT IGNORE INTO vet_specialties VALUES (2, 1);
+INSERT IGNORE INTO vet_specialties VALUES (3, 2);
+INSERT IGNORE INTO vet_specialties VALUES (3, 3);
+INSERT IGNORE INTO vet_specialties VALUES (4, 2);
+INSERT IGNORE INTO vet_specialties VALUES (5, 1);
+
+INSERT IGNORE INTO types VALUES (1, 'cat');
+INSERT IGNORE INTO types VALUES (2, 'dog');
+INSERT IGNORE INTO types VALUES (3, 'lizard');
+INSERT IGNORE INTO types VALUES (4, 'snake');
+INSERT IGNORE INTO types VALUES (5, 'bird');
+INSERT IGNORE INTO types VALUES (6, 'hamster');
+
+INSERT IGNORE INTO owners VALUES (1, 'George', 'Franklin', '110 W. Liberty St.', 'Madison', '6085551023');
+INSERT IGNORE INTO owners VALUES (2, 'Betty', 'Davis', '638 Cardinal Ave.', 'Sun Prairie', '6085551749');
+INSERT IGNORE INTO owners VALUES (3, 'Eduardo', 'Rodriquez', '2693 Commerce St.', 'McFarland', '6085558763');
+INSERT IGNORE INTO owners VALUES (4, 'Harold', 'Davis', '563 Friendly St.', 'Windsor', '6085553198');
+INSERT IGNORE INTO owners VALUES (5, 'Peter', 'McTavish', '2387 S. Fair Way', 'Madison', '6085552765');
+INSERT IGNORE INTO owners VALUES (6, 'Jean', 'Coleman', '105 N. Lake St.', 'Monona', '6085552654');
+INSERT IGNORE INTO owners VALUES (7, 'Jeff', 'Black', '1450 Oak Blvd.', 'Monona', '6085555387');
+INSERT IGNORE INTO owners VALUES (8, 'Maria', 'Escobito', '345 Maple St.', 'Madison', '6085557683');
+INSERT IGNORE INTO owners VALUES (9, 'David', 'Schroeder', '2749 Blackhawk Trail', 'Madison', '6085559435');
+INSERT IGNORE INTO owners VALUES (10, 'Carlos', 'Estaban', '2335 Independence La.', 'Waunakee', '6085555487');
+
+INSERT IGNORE INTO pets VALUES (1, 'Leo', '2000-09-07', 1, 1);
+INSERT IGNORE INTO pets VALUES (2, 'Basil', '2002-08-06', 6, 2);
+INSERT IGNORE INTO pets VALUES (3, 'Rosy', '2001-04-17', 2, 3);
+INSERT IGNORE INTO pets VALUES (4, 'Jewel', '2000-03-07', 2, 3);
+INSERT IGNORE INTO pets VALUES (5, 'Iggy', '2000-11-30', 3, 4);
+INSERT IGNORE INTO pets VALUES (6, 'George', '2000-01-20', 4, 5);
+INSERT IGNORE INTO pets VALUES (7, 'Samantha', '1995-09-04', 1, 6);
+INSERT IGNORE INTO pets VALUES (8, 'Max', '1995-09-04', 1, 6);
+INSERT IGNORE INTO pets VALUES (9, 'Lucky', '1999-08-06', 5, 7);
+INSERT IGNORE INTO pets VALUES (10, 'Mulligan', '1997-02-24', 2, 8);
+INSERT IGNORE INTO pets VALUES (11, 'Freddy', '2000-03-09', 5, 9);
+INSERT IGNORE INTO pets VALUES (12, 'Lucky', '2000-06-24', 2, 10);
+INSERT IGNORE INTO pets VALUES (13, 'Sly', '2002-06-08', 1, 10);
+
+INSERT IGNORE INTO visits VALUES (1, 7, '1996-03-04', 'rabies shot');
+INSERT IGNORE INTO visits VALUES (2, 8, '1996-03-04', 'rabies shot');
+INSERT IGNORE INTO visits VALUES (3, 8, '1996-06-04', 'neutered');
+INSERT IGNORE INTO visits VALUES (4, 7, '1996-09-04', 'spayed');
diff --git a/src/main/resources/jdbc.properties b/src/main/resources/jdbc.properties
index 802ff63..82cd2ea 100644
--- a/src/main/resources/jdbc.properties
+++ b/src/main/resources/jdbc.properties
@@ -45,7 +45,7 @@ jpa.database=HSQL
 #jdbc.password=
 
 # Properties that control the population of schema and data for a new data source
-#jdbc.schemaLocation=classpath:db/mysql/initDB.txt
+#jdbc.initLocation=classpath:db/mysql/initDB.txt
 #jdbc.dataLocation=classpath:db/mysql/populateDB.txt
 
 # Property that determines which Hibernate dialect to use
-- 
GitLab