From 60939c9a48cd857ea47c3768d701d3cb92d8261e Mon Sep 17 00:00:00 2001 From: Pieter van den Hombergh Date: Thu, 22 Feb 2024 22:25:12 +0100 Subject: [PATCH 1/6] jdbc code --- topics/code/simplejdbc/application.properties | 21 +- topics/code/simplejdbc/demo.sh | 4 + topics/code/simplejdbc/pom.xml | 9 +- .../main/java/simplejdbc/DataSourceDemo.java | 10 +- .../src/main/java/simplejdbc/Factories.java | 61 ++ .../src/main/java/simplejdbc/Main.java | 1 + .../src/main/java/simplejdbc/PgConfig.java | 80 ++ .../src/main/java/simplejdbc/PgJDBCUtils.java | 87 +- .../src/main/java/simplejdbc/Student.java | 123 +-- .../src/main/java/simplejdbc/StudentDemo.java | 99 +- .../resources/sql/0_create_presidents.sql | 6 + .../main/resources/sql/1_presidents-full.sql | 992 ++++++++++++++++++ .../src/main/resources/sql/president_data.sql | 591 +++++++++++ .../main/resources/sql/president_schema.sql | 187 ++++ .../src/main/resources/sql/students.sql | 2 +- .../java/simplejdbc/DataSourceUseTest.java | 66 +- .../src/test/java/simplejdbc/InsertTest.java | 64 ++ .../test/java/simplejdbc/PgConfigTest.java | 72 ++ 18 files changed, 2230 insertions(+), 245 deletions(-) create mode 100644 topics/code/simplejdbc/demo.sh create mode 100644 topics/code/simplejdbc/src/main/java/simplejdbc/Factories.java create mode 100644 topics/code/simplejdbc/src/main/java/simplejdbc/PgConfig.java create mode 100644 topics/code/simplejdbc/src/main/resources/sql/0_create_presidents.sql create mode 100644 topics/code/simplejdbc/src/main/resources/sql/1_presidents-full.sql create mode 100644 topics/code/simplejdbc/src/main/resources/sql/president_data.sql create mode 100644 topics/code/simplejdbc/src/main/resources/sql/president_schema.sql create mode 100644 topics/code/simplejdbc/src/test/java/simplejdbc/InsertTest.java create mode 100644 topics/code/simplejdbc/src/test/java/simplejdbc/PgConfigTest.java diff --git a/topics/code/simplejdbc/application.properties b/topics/code/simplejdbc/application.properties index 8e99b27..6fa67c0 100644 --- a/topics/code/simplejdbc/application.properties +++ b/topics/code/simplejdbc/application.properties @@ -1,11 +1,24 @@ # You can add comments here. +# hosts and ports are plural +# to be able to connect to multiple hosts and ports +# which are probably used for pooling + + jdbc.pg.dev.dbname=dev -jdbc.pg.dev.username=exam +jdbc.pg.dev.user=exam jdbc.pg.dev.password=exam -jdbc.pg.dev.hostname=localhost +jdbc.pg.dev.hosts=localhost jdbc.pg.prod.dbname=prod -jdbc.pg.prod.username=appdbuser +jdbc.pg.prod.user=appdbuser jdbc.pg.prod.password=verySecretPassw00rd -jdbc.pg.prod.hostname=dbcluster +jdbc.pg.prod.hosts=cluster1,cluster2,cluster3,fallback1 +jdbc.pg.presidents.ports=5432,5433,5434 + + +jdbc.pg.presidents.dbname=presidents +jdbc.pg.presidents.user=exam +jdbc.pg.presidents.password=exam +jdbc.pg.presidents.hosts=localhost +jdbc.pg.presidents.ports=5433 diff --git a/topics/code/simplejdbc/demo.sh b/topics/code/simplejdbc/demo.sh new file mode 100644 index 0000000..751702a --- /dev/null +++ b/topics/code/simplejdbc/demo.sh @@ -0,0 +1,4 @@ + +CP=target/classes:/home/hom/.m2/repository/org/postgresql/postgresql/42.7.2/postgresql-42.7.2.jar:/home/hom/.m2/repository/nl/fontys/sebivenlo/csvobjectstream/1.1/csvobjectstream-1.1.jar + +java -cp ${CP} simplejdbc.StudentDemo diff --git a/topics/code/simplejdbc/pom.xml b/topics/code/simplejdbc/pom.xml index ec96b7e..a83d70e 100644 --- a/topics/code/simplejdbc/pom.xml +++ b/topics/code/simplejdbc/pom.xml @@ -13,7 +13,7 @@ jar UTF-8 - 11 + 17 simplejdbc.Main @@ -26,14 +26,7 @@ nl.fontys.sebivenlo csvobjectstream 1.1 - test jar - diff --git a/topics/code/simplejdbc/src/main/java/simplejdbc/DataSourceDemo.java b/topics/code/simplejdbc/src/main/java/simplejdbc/DataSourceDemo.java index 9c8fbc5..401fcd1 100644 --- a/topics/code/simplejdbc/src/main/java/simplejdbc/DataSourceDemo.java +++ b/topics/code/simplejdbc/src/main/java/simplejdbc/DataSourceDemo.java @@ -22,10 +22,12 @@ public DataSourceDemo( DataSource datasource, PrintStream out ) { // <2> void demo() throws SQLException { //<3> String query - = "select state.name as state,p.name as president,state.year_entered \n" - + " from president p " - + " join state state on(p.state_id_born=state.id)\n" - + " where state.name like 'N%'"; + = """ + select state.name as state,p.name as president,state.year_entered + from president p + join state state on(p.state_id_born=state.id) + where state.name like 'N%' + """; doQuery( query, System.out ); } diff --git a/topics/code/simplejdbc/src/main/java/simplejdbc/Factories.java b/topics/code/simplejdbc/src/main/java/simplejdbc/Factories.java new file mode 100644 index 0000000..f443c93 --- /dev/null +++ b/topics/code/simplejdbc/src/main/java/simplejdbc/Factories.java @@ -0,0 +1,61 @@ +package simplejdbc; + +import java.io.IOException; +import java.nio.file.Path; +import java.time.LocalDate; +import java.util.List; +import java.util.function.Function; +import java.util.function.Predicate; +import nl.fontys.sebivenlo.csvobjectstream.CSVObjectStream; + +/** + * + * @author Pieter van den Hombergh {@code } + */ +public class Factories { + + public static Student studentFromArray(Object[] in) { + + Integer snummer = (Integer) in[ 0 ]; + String firstname = (String) in[ 1 ]; + String lastname = (String) in[ 2 ]; + LocalDate dob = ( (java.sql.Date) in[ 3 ] ).toLocalDate(); + Integer cohort = (Integer) in[ 4 ]; + String email = (String) in[ 5 ]; + String gender = (String) in[ 6 ]; + String student_class = (String) in[ 7 ]; + Boolean active = (Boolean) in[ 8 ]; + return new Student( snummer, firstname, lastname, dob, cohort, email, gender, student_class, active ); + + } + + public static Object[] studentToArray(Student s) { + return new Object[]{ + s.snummer(), s.firstname(), s.lastname(), s.dob(), + s.cohort(), s.email(), s.gender(), s.student_class(), s.active() + }; + } + + public static Student studentFromStrings(String[] in) { + + Integer snummer = Integer.valueOf( in[ 0 ] ); + String firstname = (String) in[ 1 ]; + String lastname = (String) in[ 2 ]; + LocalDate dob = LocalDate.parse( in[ 3 ] ); + Integer cohort = Integer.valueOf( in[ 4 ] ); + String email = (String) in[ 5 ]; + String gender = (String) in[ 6 ]; + String student_class = (String) in[ 7 ]; + Boolean active = Boolean.valueOf( in[ 8 ] ); + return new Student( snummer, firstname, lastname, dob, cohort, email, gender, student_class, active ); + + } + + public static List studentsFromFile(String fileName) throws IOException { + Function fact = Factories::studentFromStrings; + Predicate filter = a -> a.length == 9 && a[ 0 ].matches( "\\d+" ); + return new CSVObjectStream( Path.of( fileName ), "," ) + .asList( fact, filter ); + } + +} diff --git a/topics/code/simplejdbc/src/main/java/simplejdbc/Main.java b/topics/code/simplejdbc/src/main/java/simplejdbc/Main.java index 421078b..cc793c4 100644 --- a/topics/code/simplejdbc/src/main/java/simplejdbc/Main.java +++ b/topics/code/simplejdbc/src/main/java/simplejdbc/Main.java @@ -12,6 +12,7 @@ public class Main { public static void main( String[] args ) throws SQLException { + DataSource source = getDataSource("jdbc.pg.presidents"); DataSourceDemo demo = new DataSourceDemo( source, System.out ); diff --git a/topics/code/simplejdbc/src/main/java/simplejdbc/PgConfig.java b/topics/code/simplejdbc/src/main/java/simplejdbc/PgConfig.java new file mode 100644 index 0000000..d0fe6ae --- /dev/null +++ b/topics/code/simplejdbc/src/main/java/simplejdbc/PgConfig.java @@ -0,0 +1,80 @@ +package simplejdbc; + +import java.util.Arrays; +import java.util.Map; +import java.util.Objects; +import java.util.Properties; +import static simplejdbc.PgJDBCUtils.properties; + +/** + * Simple configuration record, containing hosts, ports, database name, user and + * password. + * + * @author Pieter van den Hombergh {@code } + */ +public record PgConfig(String[] hosts, int[] ports, String dbname, String user, String password) { + + /** + * Ensure all required parameters are set. + * @param hosts hosts for the data source + * @param ports used + * @param dbname sic + * @param user username + * @param password sic + */ + public PgConfig { + Objects.requireNonNull( hosts ); + Objects.requireNonNull( ports ); + Objects.requireNonNull( dbname ); + Objects.requireNonNull( user ); + Objects.requireNonNull( password ); + } + + @Override + public String toString() { + return "PGConfiguration{" + + "\n\thosts = " + Arrays.toString( hosts ) + + "\n\tports = " + Arrays.toString( ports ) + + "\n\tdbname = " + dbname + + "\n\tuser = " + user + + "\n}"; + } + + /** + * Create the configuration from a well known properties file + * application.properties. + * + * @param prefix of the data source, e.g. jdbc.pg.dev. + * @return the configuration data as record + */ + public static PgConfig getConfigForPrefix(String prefix) { + Properties props = properties( "application.properties" ); + System.out.println( "prefix = " + prefix ); + final int substringstart = prefix.endsWith( "." ) ? prefix.length() : prefix.length() + 1; + Map.Entry[] entries = props.entrySet().stream() + .filter( e -> ( (String) e.getKey() ).startsWith( prefix ) ) + .map( e -> trimEntry( substringstart, e ) ) + .toArray( Map.Entry[]::new ); + + if ( entries.length == 0 ) { + throw new RuntimeException( "properties with prefix '" + prefix + "' not found" ); + } + Map map = Map.ofEntries( entries ); + var ports = Arrays.stream( map.getOrDefault( "ports", "5432" ).split( "\\s?,\\s?" ) ) + .mapToInt( Integer::valueOf ) + .toArray(); + var hosts = Arrays.stream( map.getOrDefault( "hosts", "localhost" ).split( "\\s?,\\s?" ) ) + .toArray( String[]::new ); + return new PgConfig( + hosts, + ports, + map.get( "dbname" ), + map.get( "user" ), + map.get( "password" ) + ); + } + + static Map.Entry trimEntry(int trimLength, Map.Entry e) { + return Map.entry( ( (String) e.getKey() ).substring( trimLength ), (String) e.getValue() ); + } +} diff --git a/topics/code/simplejdbc/src/main/java/simplejdbc/PgJDBCUtils.java b/topics/code/simplejdbc/src/main/java/simplejdbc/PgJDBCUtils.java index b63f907..16bf224 100644 --- a/topics/code/simplejdbc/src/main/java/simplejdbc/PgJDBCUtils.java +++ b/topics/code/simplejdbc/src/main/java/simplejdbc/PgJDBCUtils.java @@ -17,15 +17,15 @@ import org.postgresql.ds.PGSimpleDataSource; /** + * Some helpers for common tasks. * * @author hom */ public class PgJDBCUtils { - static void doQuery( Connection con, String query, - PrintStream out ) throws SQLException { - try ( Statement st = con.createStatement(); - ResultSet rs = st.executeQuery( query ) ) { + public static void doQuery(Connection con, String query, + PrintStream out) throws SQLException { + try ( Statement st = con.createStatement(); ResultSet rs = st.executeQuery( query ) ) { new ResultSetPrinter( rs ).printTable( out ); @@ -33,56 +33,61 @@ static void doQuery( Connection con, String query, } private static final Map datasourceByName = new HashMap<>(); + private static Logger LOG = Logger.getLogger( PgJDBCUtils.class.getName() ); - static DataSource getDataSource( final String sourceName ) { + public static DataSource getDataSource(final String sourceName) { - return datasourceByName.computeIfAbsent( sourceName, - ( s ) -> { - Properties props = properties( "application.properties" ); - - PGSimpleDataSource source = new PGSimpleDataSource(); + LOG.fine( () -> " get DataSource sourceName = " + sourceName ); + return datasourceByName.computeIfAbsent( sourceName, PgJDBCUtils::configureAndPing ); + } - String prefix = sourceName + "."; - String[] serverNames = { - props.getProperty( prefix + "dbhost" ) - }; - source.setServerNames( serverNames ); + /** + * Make sure that the data source is reachable. + * + * @param sourceName name of the resource + * @return a configureddatasource. + */ + static DataSource configureAndPing(String sourceName) { - String user = props.getProperty( prefix + "username" ); - source.setUser( user ); + PgConfig cfg = PgConfig.getConfigForPrefix( sourceName ); + PGSimpleDataSource source = new PGSimpleDataSource(); + source = configureSource( source, cfg ); + String databaseName = source.getDatabaseName(); + String pingQuery = "SELECT current_database(), now()::TIMESTAMP as now;"; + try ( Connection con = source.getConnection(); PreparedStatement pst = con.prepareStatement( pingQuery ); ) { + try ( ResultSet rs = pst.executeQuery(); ) { + if ( rs.next() ) { + Object db = rs.getObject( "current_database" ); + Object now = rs.getObject( "now" ); + LOG.info( () -> "connected to db %s, date/time is %s ".formatted( + db.toString(), now.toString() ) ); + } + } + } catch ( SQLException ex ) { + LOG.severe( () -> "cannot connect to " + databaseName + "with configuration " + cfg ); + } + return source; - source.setDatabaseName( props.getProperty( prefix + "dbname" ) ); - source.setPassword( props - .getProperty( prefix + "password" ) ); - String pingQuery = "SELECT current_database(), now()::TIMESTAMP as now;"; - try ( Connection con = source.getConnection(); - PreparedStatement pst = con.prepareStatement( pingQuery ); ) { - try ( ResultSet rs = pst.executeQuery(); ) { - if ( rs.next() ) { - Object db = rs.getObject( "current_database"); - Object now = rs.getObject( "now"); - System.out.println("connected to db "+ db.toString()+ ", date/time is " + now.toString() ); - } - } + } - } catch ( SQLException ex ) { - Logger.getLogger( PgJDBCUtils.class.getName() ).log( Level.SEVERE, null, ex ); - } - return source; - } - ); + private static PGSimpleDataSource configureSource(PGSimpleDataSource source, PgConfig cfg) { + source.setServerNames( cfg.hosts() ); + source.setPortNumbers( cfg.ports() ); + source.setUser( cfg.user() ); + source.setDatabaseName( cfg.dbname() ); + source.setPassword( cfg.password() ); + return source; } - static Properties properties( String propFileName ) { + static Properties properties(String propFileName) { Properties properties = new Properties(); try ( FileInputStream fis = new FileInputStream( propFileName ); ) { properties.load( fis ); } catch ( IOException ignored ) { - Logger.getLogger( PgJDBCUtils.class.getName() ).log( - Level.INFO, - "attempt to read from well file from known location '", - ignored ); + LOG.info( () + -> "attempt to read from well known file at well known location failed " + + ignored.getMessage() ); } return properties; } diff --git a/topics/code/simplejdbc/src/main/java/simplejdbc/Student.java b/topics/code/simplejdbc/src/main/java/simplejdbc/Student.java index 20e6066..1eb9061 100644 --- a/topics/code/simplejdbc/src/main/java/simplejdbc/Student.java +++ b/topics/code/simplejdbc/src/main/java/simplejdbc/Student.java @@ -8,116 +8,15 @@ * * @author Pieter van den Hombergh {@code pieter.van.den.hombergh@gmail.com} */ -public class Student implements Serializable { - - private Integer snummer; - private String firstname; - private String lastname; - private LocalDate dob; - private int cohort; - private String email; - private String gender; - private String student_class; - private boolean active; - - public Student( Integer snummer, String firstname, String lastname, LocalDate dob, int cohort, String email, String gender, String student_class, boolean active ) { - this.snummer = snummer; - this.lastname = lastname; - this.firstname = firstname; - this.dob = dob; - this.cohort = cohort; - this.email = email; - this.gender = gender; - this.student_class = student_class; - this.active = active; - } - - public Integer getSnummer() { - return snummer; - } - - public String getLastname() { - return lastname; - } - - public String getFirstname() { - return firstname; - } - - public LocalDate getDob() { - return dob; - } - - public int getCohort() { - return cohort; - } - - public String getEmail() { - return email; - } - - public String getGender() { - return gender; - } - - public String getStudent_class() { - return student_class; - } - - public boolean isActive() { - return active; - } - - @Override - public String toString() { - return "Student{" + "snummer=" + snummer + ", lastname=" + lastname + ", firstname=" + firstname + ", dob=" + dob + ", cohort=" + cohort + ", email=" + email + ", gender=" + gender + ", student_class=" + student_class + ", active=" + active + '}'; - } - - String csvRecord() { - return "" + snummer + "," + lastname + "," //+ tussenvoegsel + "," - + firstname + "," + dob + "," + cohort + "," + email + "," - + gender + "," + student_class; - - } - - static Student fromArray( String[] params ) { - if ( params.length < 9 ) { - return null; - } - return new Student( - Integer.parseInt( params[0].trim() ), - params[1].trim(), - params[2].trim(), - LocalDate.parse( params[3].trim() ), - Integer.parseInt( params[4].trim() ), - params[5].trim(), - params[6].trim(), - params[7].trim(), - Boolean.parseBoolean( params[8] ) - ); - } - - static Student fromArray( Object[] params ) { - if ( params.length < 9 ) { - return null; - } - Student result= - new Student( - (Integer) params[0], - (String) params[1], - (String) params[2], - (LocalDate) params[3], - (Integer) params[4], - (String) params[5], - (String) params[6], - (String) params[7], - (Boolean) params[8] ); - System.out.println( "result = " + result ); - return result; - } - - Object[] asArray() { - return new Object[]{ - snummer, firstname, lastname, dob, cohort, email, gender, student_class, active}; - } +public record Student( + Integer snummer, + String firstname, + String lastname, + LocalDate dob, + Integer cohort, + String email, + String gender, + String student_class, + Boolean active) + implements Serializable { } diff --git a/topics/code/simplejdbc/src/main/java/simplejdbc/StudentDemo.java b/topics/code/simplejdbc/src/main/java/simplejdbc/StudentDemo.java index 9020f3b..327efef 100644 --- a/topics/code/simplejdbc/src/main/java/simplejdbc/StudentDemo.java +++ b/topics/code/simplejdbc/src/main/java/simplejdbc/StudentDemo.java @@ -1,11 +1,15 @@ package simplejdbc; +import java.io.IOException; import java.io.PrintStream; import java.sql.Connection; +import java.sql.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.time.LocalDate; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -17,35 +21,98 @@ */ class StudentDemo { - final DataSource ds; - final PrintStream out; + private final DataSource ds; + private final PrintStream out; - public StudentDemo( DataSource ds, PrintStream out ) { + public StudentDemo(DataSource ds, PrintStream out) { this.ds = ds; this.out = out; } - List listAll() { + private static String query = "select * from students"; + + public List listAll() { var result = new ArrayList(); - String query = "select * from students"; - try ( Connection con = ds.getConnection(); - PreparedStatement pst = con.prepareStatement( query ); + try ( Connection con = ds.getConnection(); + PreparedStatement pst = con.prepareStatement( query ); ResultSet rs = pst.executeQuery(); ) { while ( rs.next() ) { - Object[] params = new Object[rs.getMetaData().getColumnCount()]; - for ( int i = 0; i < rs.getMetaData().getColumnCount(); i++ ) { - Object x=rs.getObject( 1 + i ); - System.out.println( "x = " + x ); - params[i] = rs.getObject( 1 + i ); - - } - result.add( Student.fromArray( params ) ); + Integer snummer = rs.getInt( 1 ); + String firstname = rs.getString( 2 ); + String lastname = rs.getString( 3 ); + LocalDate dob = rs.getDate( 4 ).toLocalDate(); + Integer cohort = rs.getInt( 5 ); + String email = rs.getString( 6 ); + String gender = rs.getString( 7 ); + String student_class = rs.getString( 8 ); + Boolean active = rs.getBoolean( 9 ); + + Student student = new Student( snummer, firstname, lastname, + dob, cohort, email, gender, student_class, active ); + result.add( student ); } } catch ( Throwable ex ) { Logger.getLogger( StudentDemo.class.getName() ).log( Level.SEVERE, null, ex ); } return result; -// throw new UnsupportedOperationException( "Not supported yet." ); //To change body of generated methods, choose Tools | Templates. } + private static final String insertSql = + """ + insert into students (student_id,firstname,lastname,dob,cohort,email,gender,student_grp,active) + values( ?, ?, ?, ?, ?, ?, ?, ?, ?) + """; + + public void insertStudents(List students) { + try ( Connection con = ds.getConnection(); PreparedStatement pst = con.prepareStatement( insertSql ); ) { + con.setAutoCommit( false ); + + for ( Student s : students ) { + pst.setInt( 1, s.snummer() ); + pst.setString( 2, s.firstname() ); + pst.setString( 3, s.lastname() ); + pst.setDate( 4, Date.valueOf( s.dob() ) ); + pst.setInt( 5, s.cohort() ); + pst.setString( 6, s.email() ); + pst.setString( 7, s.gender() ); + pst.setString( 8, s.student_class() ); + pst.setBoolean( 9, s.active() ); + pst.addBatch(); + } + + var eb = pst.executeBatch(); + System.out.println( "inserted " + eb.length ); + con.commit(); + } catch ( SQLException ex ) { + LOG.log( Level.SEVERE, null, ex ); + throw new RuntimeException( ex.getMessage(), ex ); + } + + } + private static final Logger LOG = Logger.getLogger( StudentDemo.class.getName() ); + + public static void main(String[] args) throws IOException { + var dataSource = PgJDBCUtils.getDataSource( "jdbc.pg.dev" ); + var demo = new StudentDemo( dataSource, System.out ); + + System.out.println( "getting all available students" ); + var myClass = demo.listAll(); + + myClass.stream().forEach( System.out::println ); + + if ( myClass.size() == 0 ) { + System.out.println( "Mh, none found. Where are they??" ); + + System.out.println( "new balls please" ); + List newStudents = Factories.studentsFromFile( "students.csv" ); + System.out.println( "new students" ); + newStudents.forEach( System.out::println); + demo.insertStudents( newStudents ); + + myClass = demo.listAll(); + + System.out.println( "there they are " ); + myClass.stream().forEach( System.out::println ); + } + } } diff --git a/topics/code/simplejdbc/src/main/resources/sql/0_create_presidents.sql b/topics/code/simplejdbc/src/main/resources/sql/0_create_presidents.sql new file mode 100644 index 0000000..2f7f7a2 --- /dev/null +++ b/topics/code/simplejdbc/src/main/resources/sql/0_create_presidents.sql @@ -0,0 +1,6 @@ + +DROP DATABASE IF EXISTS presidents; +CREATE DATABASE presidents owner exam; +CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; + + diff --git a/topics/code/simplejdbc/src/main/resources/sql/1_presidents-full.sql b/topics/code/simplejdbc/src/main/resources/sql/1_presidents-full.sql new file mode 100644 index 0000000..cf60027 --- /dev/null +++ b/topics/code/simplejdbc/src/main/resources/sql/1_presidents-full.sql @@ -0,0 +1,992 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 12.2 (Ubuntu 12.2-4) +-- Dumped by pg_dump version 12.2 (Ubuntu 12.2-4) +\c presidents +begin work; +set role exam; +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + + + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- Name: admin_vpres; Type: TABLE; Schema: public; Owner: exam +-- + +CREATE TABLE public.admin_vpres ( + admin_id integer NOT NULL, + vice_pres_name character varying(20) NOT NULL +); + + +ALTER TABLE public.admin_vpres OWNER TO exam; + +-- +-- Name: TABLE admin_vpres; Type: COMMENT; Schema: public; Owner: exam +-- + +COMMENT ON TABLE public.admin_vpres IS 'President and vice president'; + + +-- +-- Name: administration; Type: TABLE; Schema: public; Owner: exam +-- + +CREATE TABLE public.administration ( + id integer NOT NULL, + admin_nr integer NOT NULL, + pres_id integer NOT NULL, + year_inaugurated integer, + CONSTRAINT check_year_inaug CHECK (((year_inaugurated >= 1600) AND (year_inaugurated <= 2100))) +); + + +ALTER TABLE public.administration OWNER TO exam; + +-- +-- Name: TABLE administration; Type: COMMENT; Schema: public; Owner: exam +-- + +COMMENT ON TABLE public.administration IS 'Name of president, administration number and year of inauguration'; + + +-- +-- Name: administration_id_seq; Type: SEQUENCE; Schema: public; Owner: exam +-- + +CREATE SEQUENCE public.administration_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.administration_id_seq OWNER TO exam; + +-- +-- Name: administration_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: exam +-- + +ALTER SEQUENCE public.administration_id_seq OWNED BY public.administration.id; + + +-- +-- Name: election; Type: TABLE; Schema: public; Owner: exam +-- + +CREATE TABLE public.election ( + election_year integer NOT NULL, + candidate character varying(20) NOT NULL, + votes integer, + winner_loser_indic character(1), + CONSTRAINT check_election_year CHECK (((election_year >= 1600) AND (election_year <= 2100))), + CONSTRAINT check_votes CHECK ((votes > 0)), + CONSTRAINT check_winner_loser_indic CHECK (((winner_loser_indic = 'W'::bpchar) OR (winner_loser_indic = 'L'::bpchar))) +); + + +ALTER TABLE public.election OWNER TO exam; + +-- +-- Name: TABLE election; Type: COMMENT; Schema: public; Owner: exam +-- + +COMMENT ON TABLE public.election IS 'Election year, vote count (electoral vote, by delegate), won or lost'; + + +-- +-- Name: pres_hobby; Type: TABLE; Schema: public; Owner: exam +-- + +CREATE TABLE public.pres_hobby ( + pres_id integer NOT NULL, + hobby character varying(20) NOT NULL +); + + +ALTER TABLE public.pres_hobby OWNER TO exam; + +-- +-- Name: TABLE pres_hobby; Type: COMMENT; Schema: public; Owner: exam +-- + +COMMENT ON TABLE public.pres_hobby IS 'Hobby of the president'; + + +-- +-- Name: pres_marriage; Type: TABLE; Schema: public; Owner: exam +-- + +CREATE TABLE public.pres_marriage ( + pres_id integer NOT NULL, + spouse_name character varying(20) NOT NULL, + spouse_age smallint, + nr_children smallint, + marriage_year integer, + CONSTRAINT check_marriage_year CHECK (((marriage_year >= 1600) AND (marriage_year <= 2100))), + CONSTRAINT check_spouse_age CHECK ((spouse_age > 15)) +); + + +ALTER TABLE public.pres_marriage OWNER TO exam; + +-- +-- Name: TABLE pres_marriage; Type: COMMENT; Schema: public; Owner: exam +-- + +COMMENT ON TABLE public.pres_marriage IS 'Marriage, spouce name, year of marriage, age of man and wife, nr of children.'; + + +-- +-- Name: president; Type: TABLE; Schema: public; Owner: exam +-- + +CREATE TABLE public.president ( + id integer NOT NULL, + name character varying(20) NOT NULL, + birth_year integer, + years_served smallint, + death_age smallint, + party character varying(10), + state_id_born integer, + CONSTRAINT check_birth_year CHECK (((birth_year >= 1600) AND (birth_year <= 2100))), + CONSTRAINT check_death_age CHECK (((death_age > 20) OR (death_age IS NULL))) +); + + +ALTER TABLE public.president OWNER TO exam; + +-- +-- Name: TABLE president; Type: COMMENT; Schema: public; Owner: exam +-- + +COMMENT ON TABLE public.president IS 'President name, birth year etc.'; + + +-- +-- Name: president_id_seq; Type: SEQUENCE; Schema: public; Owner: exam +-- + +CREATE SEQUENCE public.president_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.president_id_seq OWNER TO exam; + +-- +-- Name: president_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: exam +-- + +ALTER SEQUENCE public.president_id_seq OWNED BY public.president.id; + + +-- +-- Name: state; Type: TABLE; Schema: public; Owner: exam +-- + +CREATE TABLE public.state ( + id integer NOT NULL, + name character varying(15) NOT NULL, + admin_id integer, + year_entered integer, + CONSTRAINT check_year_entered CHECK (((year_entered >= 1600) AND (year_entered <= 2100))) +); + + +ALTER TABLE public.state OWNER TO exam; + +-- +-- Name: TABLE state; Type: COMMENT; Schema: public; Owner: exam +-- + +COMMENT ON TABLE public.state IS 'States, added in year and under which president.'; + + +-- +-- Name: recent_presidents; Type: VIEW; Schema: public; Owner: exam +-- + +CREATE VIEW public.recent_presidents AS + SELECT p.id, + p.name, + p.birth_year, + p.years_served, + p.death_age, + p.party, + s.name AS state_name + FROM (public.president p + JOIN public.state s ON ((p.state_id_born = s.id))) + WHERE (p.birth_year > 1880); + + +ALTER TABLE public.recent_presidents OWNER TO exam; + +-- +-- Name: VIEW recent_presidents; Type: COMMENT; Schema: public; Owner: exam +-- + +COMMENT ON VIEW public.recent_presidents IS 'Presidents born since 1880.'; + + +-- +-- Name: state_id_seq; Type: SEQUENCE; Schema: public; Owner: exam +-- + +CREATE SEQUENCE public.state_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.state_id_seq OWNER TO exam; + +-- +-- Name: state_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: exam +-- + +ALTER SEQUENCE public.state_id_seq OWNED BY public.state.id; + + +-- +-- Name: administration id; Type: DEFAULT; Schema: public; Owner: exam +-- + +ALTER TABLE ONLY public.administration ALTER COLUMN id SET DEFAULT nextval('public.administration_id_seq'::regclass); + + +-- +-- Name: president id; Type: DEFAULT; Schema: public; Owner: exam +-- + +ALTER TABLE ONLY public.president ALTER COLUMN id SET DEFAULT nextval('public.president_id_seq'::regclass); + + +-- +-- Name: state id; Type: DEFAULT; Schema: public; Owner: exam +-- + +ALTER TABLE ONLY public.state ALTER COLUMN id SET DEFAULT nextval('public.state_id_seq'::regclass); + + +-- +-- Data for Name: admin_vpres; Type: TABLE DATA; Schema: public; Owner: exam +-- + +INSERT INTO public.admin_vpres VALUES (1, 'ADAMS J'); +INSERT INTO public.admin_vpres VALUES (2, 'ADAMS J'); +INSERT INTO public.admin_vpres VALUES (3, 'JEFFERSON T'); +INSERT INTO public.admin_vpres VALUES (4, 'BURR A'); +INSERT INTO public.admin_vpres VALUES (5, 'CLINTON G'); +INSERT INTO public.admin_vpres VALUES (6, 'CLINTON G'); +INSERT INTO public.admin_vpres VALUES (7, 'GERRRY E'); +INSERT INTO public.admin_vpres VALUES (8, 'TOMPKINS D'); +INSERT INTO public.admin_vpres VALUES (9, 'TOMPKINS D'); +INSERT INTO public.admin_vpres VALUES (10, 'CALHOUN J'); +INSERT INTO public.admin_vpres VALUES (11, 'CALHOUN J'); +INSERT INTO public.admin_vpres VALUES (12, 'VAN BUREN M'); +INSERT INTO public.admin_vpres VALUES (13, 'JOHNSON R M'); +INSERT INTO public.admin_vpres VALUES (14, 'TYLER J'); +INSERT INTO public.admin_vpres VALUES (16, 'DALLAS J M'); +INSERT INTO public.admin_vpres VALUES (17, 'FILLMORE M'); +INSERT INTO public.admin_vpres VALUES (19, 'DE VANE KING W R'); +INSERT INTO public.admin_vpres VALUES (20, 'BRECKINRIDGE J C'); +INSERT INTO public.admin_vpres VALUES (21, 'HAMLIN H'); +INSERT INTO public.admin_vpres VALUES (22, 'JOHNSON A'); +INSERT INTO public.admin_vpres VALUES (24, 'COLFAX S'); +INSERT INTO public.admin_vpres VALUES (25, 'WILSON H'); +INSERT INTO public.admin_vpres VALUES (26, 'WHEELER W'); +INSERT INTO public.admin_vpres VALUES (27, 'ARTHUR C A'); +INSERT INTO public.admin_vpres VALUES (29, 'HENDRICKS T A'); +INSERT INTO public.admin_vpres VALUES (30, 'MORTON L P'); +INSERT INTO public.admin_vpres VALUES (31, 'STEVENSON A E'); +INSERT INTO public.admin_vpres VALUES (32, 'HOBART G A'); +INSERT INTO public.admin_vpres VALUES (33, 'ROOSEVELT T'); +INSERT INTO public.admin_vpres VALUES (35, 'FAIRBANKS C W'); +INSERT INTO public.admin_vpres VALUES (36, 'SHERMAN J S'); +INSERT INTO public.admin_vpres VALUES (37, 'MARSHALL T R'); +INSERT INTO public.admin_vpres VALUES (38, 'MARSHALL T R'); +INSERT INTO public.admin_vpres VALUES (39, 'COOLIDGE C'); +INSERT INTO public.admin_vpres VALUES (41, 'DAWES C G'); +INSERT INTO public.admin_vpres VALUES (42, 'CURTIS C'); +INSERT INTO public.admin_vpres VALUES (43, 'GARNER J N'); +INSERT INTO public.admin_vpres VALUES (44, 'GARNER J N'); +INSERT INTO public.admin_vpres VALUES (45, 'WALLACE H A'); +INSERT INTO public.admin_vpres VALUES (46, 'TRUMAN H S'); +INSERT INTO public.admin_vpres VALUES (48, 'BARKLEY A W'); +INSERT INTO public.admin_vpres VALUES (49, 'NIXON R M'); +INSERT INTO public.admin_vpres VALUES (50, 'NIXON R M'); +INSERT INTO public.admin_vpres VALUES (51, 'JOHNSON L B'); +INSERT INTO public.admin_vpres VALUES (53, 'HUMPHREY H H'); +INSERT INTO public.admin_vpres VALUES (54, 'AGNEW S T'); +INSERT INTO public.admin_vpres VALUES (55, 'AGNEW S T'); +INSERT INTO public.admin_vpres VALUES (55, 'FORD G R'); +INSERT INTO public.admin_vpres VALUES (56, 'ROCKEFELLER N A'); +INSERT INTO public.admin_vpres VALUES (57, 'MONDALE W F'); +INSERT INTO public.admin_vpres VALUES (58, 'BUSH G H W'); +INSERT INTO public.admin_vpres VALUES (59, 'BUSH G H W'); +INSERT INTO public.admin_vpres VALUES (60, 'QUAYLE D'); +INSERT INTO public.admin_vpres VALUES (61, 'GORE A'); +INSERT INTO public.admin_vpres VALUES (62, 'GORE A'); +INSERT INTO public.admin_vpres VALUES (63, 'CHENEY D'); +INSERT INTO public.admin_vpres VALUES (64, 'CHENEY D'); +INSERT INTO public.admin_vpres VALUES (65, 'BIDEN J'); +INSERT INTO public.admin_vpres VALUES (66, 'BIDEN J'); +INSERT INTO public.admin_vpres VALUES (67, 'PENCE M R'); + + +-- +-- Data for Name: administration; Type: TABLE DATA; Schema: public; Owner: exam +-- + +INSERT INTO public.administration VALUES (0, 0, 1, 1789); +INSERT INTO public.administration VALUES (1, 1, 1, 1789); +INSERT INTO public.administration VALUES (2, 2, 1, 1793); +INSERT INTO public.administration VALUES (3, 3, 2, 1797); +INSERT INTO public.administration VALUES (4, 4, 3, 1801); +INSERT INTO public.administration VALUES (5, 5, 3, 1805); +INSERT INTO public.administration VALUES (6, 6, 4, 1809); +INSERT INTO public.administration VALUES (7, 7, 4, 1813); +INSERT INTO public.administration VALUES (8, 8, 5, 1817); +INSERT INTO public.administration VALUES (9, 9, 5, 1821); +INSERT INTO public.administration VALUES (10, 10, 6, 1825); +INSERT INTO public.administration VALUES (11, 11, 7, 1829); +INSERT INTO public.administration VALUES (12, 12, 7, 1833); +INSERT INTO public.administration VALUES (13, 13, 8, 1837); +INSERT INTO public.administration VALUES (14, 14, 9, 1841); +INSERT INTO public.administration VALUES (15, 14, 10, 1841); +INSERT INTO public.administration VALUES (16, 15, 11, 1845); +INSERT INTO public.administration VALUES (17, 16, 12, 1849); +INSERT INTO public.administration VALUES (18, 16, 13, 1850); +INSERT INTO public.administration VALUES (19, 17, 14, 1853); +INSERT INTO public.administration VALUES (20, 18, 15, 1857); +INSERT INTO public.administration VALUES (21, 19, 16, 1861); +INSERT INTO public.administration VALUES (22, 20, 16, 1865); +INSERT INTO public.administration VALUES (23, 20, 17, 1865); +INSERT INTO public.administration VALUES (24, 21, 18, 1869); +INSERT INTO public.administration VALUES (25, 22, 18, 1873); +INSERT INTO public.administration VALUES (26, 23, 19, 1877); +INSERT INTO public.administration VALUES (27, 24, 20, 1881); +INSERT INTO public.administration VALUES (28, 24, 21, 1881); +INSERT INTO public.administration VALUES (29, 25, 22, 1885); +INSERT INTO public.administration VALUES (30, 26, 23, 1889); +INSERT INTO public.administration VALUES (31, 27, 22, 1893); +INSERT INTO public.administration VALUES (32, 28, 24, 1897); +INSERT INTO public.administration VALUES (33, 29, 24, 1901); +INSERT INTO public.administration VALUES (34, 29, 25, 1901); +INSERT INTO public.administration VALUES (35, 30, 25, 1905); +INSERT INTO public.administration VALUES (36, 31, 26, 1909); +INSERT INTO public.administration VALUES (37, 32, 27, 1913); +INSERT INTO public.administration VALUES (38, 33, 27, 1917); +INSERT INTO public.administration VALUES (39, 34, 28, 1921); +INSERT INTO public.administration VALUES (40, 34, 29, 1923); +INSERT INTO public.administration VALUES (41, 35, 29, 1925); +INSERT INTO public.administration VALUES (42, 36, 30, 1929); +INSERT INTO public.administration VALUES (43, 37, 31, 1933); +INSERT INTO public.administration VALUES (44, 38, 31, 1937); +INSERT INTO public.administration VALUES (45, 39, 31, 1941); +INSERT INTO public.administration VALUES (46, 40, 31, 1945); +INSERT INTO public.administration VALUES (47, 40, 32, 1945); +INSERT INTO public.administration VALUES (48, 41, 32, 1949); +INSERT INTO public.administration VALUES (49, 42, 33, 1953); +INSERT INTO public.administration VALUES (50, 43, 33, 1957); +INSERT INTO public.administration VALUES (51, 44, 34, 1961); +INSERT INTO public.administration VALUES (52, 44, 35, 1963); +INSERT INTO public.administration VALUES (53, 45, 35, 1965); +INSERT INTO public.administration VALUES (54, 46, 36, 1969); +INSERT INTO public.administration VALUES (55, 47, 36, 1973); +INSERT INTO public.administration VALUES (56, 47, 37, 1974); +INSERT INTO public.administration VALUES (57, 48, 38, 1977); +INSERT INTO public.administration VALUES (58, 49, 40, 1981); +INSERT INTO public.administration VALUES (59, 50, 40, 1985); +INSERT INTO public.administration VALUES (60, 51, 39, 1989); +INSERT INTO public.administration VALUES (61, 52, 41, 1993); +INSERT INTO public.administration VALUES (62, 53, 41, 1997); +INSERT INTO public.administration VALUES (63, 54, 42, 2001); +INSERT INTO public.administration VALUES (64, 55, 42, 2005); +INSERT INTO public.administration VALUES (65, 56, 43, 2009); +INSERT INTO public.administration VALUES (66, 57, 43, 2013); +INSERT INTO public.administration VALUES (67, 58, 44, 2017); + + +-- +-- Data for Name: election; Type: TABLE DATA; Schema: public; Owner: exam +-- + +INSERT INTO public.election VALUES (1789, 'WASHINGTON G', 69, 'W'); +INSERT INTO public.election VALUES (1789, 'ADAMS J', 34, 'L'); +INSERT INTO public.election VALUES (1789, 'JAY J', 9, 'L'); +INSERT INTO public.election VALUES (1789, 'HARRISON R H', 6, 'L'); +INSERT INTO public.election VALUES (1789, 'RUTLEDGE J', 6, 'L'); +INSERT INTO public.election VALUES (1789, 'HANCOCK J', 4, 'L'); +INSERT INTO public.election VALUES (1789, 'CLINTON G', 3, 'L'); +INSERT INTO public.election VALUES (1789, 'HUNTINGTON S', 2, 'L'); +INSERT INTO public.election VALUES (1789, 'MILTON J', 2, 'L'); +INSERT INTO public.election VALUES (1789, 'ARMSTRONG', 1, 'L'); +INSERT INTO public.election VALUES (1789, 'LINCOLN B', 1, 'L'); +INSERT INTO public.election VALUES (1789, 'TOLFAIR I', 1, 'L'); +INSERT INTO public.election VALUES (1792, 'ADAMS J', 77, 'L'); +INSERT INTO public.election VALUES (1792, 'CLINTON G', 50, 'L'); +INSERT INTO public.election VALUES (1792, 'JEFFERSON T', 4, 'L'); +INSERT INTO public.election VALUES (1796, 'PINCKNEY T', 59, 'L'); +INSERT INTO public.election VALUES (1792, 'BURR A', 1, 'L'); +INSERT INTO public.election VALUES (1796, 'ADAMS J', 71, 'W'); +INSERT INTO public.election VALUES (1796, 'JEFFERSON T', 68, 'L'); +INSERT INTO public.election VALUES (1796, 'BURR A', 30, 'L'); +INSERT INTO public.election VALUES (1796, 'CLINTON G', 7, 'L'); +INSERT INTO public.election VALUES (1796, 'JAY J', 5, 'L'); +INSERT INTO public.election VALUES (1796, 'IREDELL J', 3, 'L'); +INSERT INTO public.election VALUES (1796, 'HENRY J', 2, 'L'); +INSERT INTO public.election VALUES (1796, 'JOHNSON S', 2, 'L'); +INSERT INTO public.election VALUES (1796, 'WASHINGTON G', 2, 'L'); +INSERT INTO public.election VALUES (1796, 'PINCKNEY C C', 1, 'L'); +INSERT INTO public.election VALUES (1792, 'WASHINGTON G', 132, 'W'); +INSERT INTO public.election VALUES (1796, 'ADAMS S', 15, 'L'); +INSERT INTO public.election VALUES (1796, 'ELLSWORTH O', 11, 'L'); +INSERT INTO public.election VALUES (1800, 'JEFFERSON T', 73, 'W'); +INSERT INTO public.election VALUES (1800, 'BURR A', 73, 'L'); +INSERT INTO public.election VALUES (1800, 'ADAMS J', 65, 'L'); +INSERT INTO public.election VALUES (1800, 'JAY J', 1, 'L'); +INSERT INTO public.election VALUES (1804, 'JEFFERSON T', 162, 'W'); +INSERT INTO public.election VALUES (1804, 'PINCKNEY C C', 14, 'L'); +INSERT INTO public.election VALUES (1800, 'PINCKNEY C C', 64, 'L'); +INSERT INTO public.election VALUES (1808, 'MADISON J', 122, 'W'); +INSERT INTO public.election VALUES (1808, 'PINCKNEY C C', 47, 'L'); +INSERT INTO public.election VALUES (1808, 'CLINTON G', 6, 'L'); +INSERT INTO public.election VALUES (1812, 'MADISON J', 128, 'W'); +INSERT INTO public.election VALUES (1812, 'CLINTON G', 89, 'L'); +INSERT INTO public.election VALUES (1816, 'MONROE J', 183, 'W'); +INSERT INTO public.election VALUES (1816, 'KING R', 34, 'L'); +INSERT INTO public.election VALUES (1820, 'MONROE J', 231, 'W'); +INSERT INTO public.election VALUES (1820, 'ADAMS J Q', 1, 'L'); +INSERT INTO public.election VALUES (1824, 'ADAMS J Q', 99, 'W'); +INSERT INTO public.election VALUES (1824, 'JACKSON A', 84, 'L'); +INSERT INTO public.election VALUES (1824, 'CRAWFORD W H', 41, 'L'); +INSERT INTO public.election VALUES (1824, 'CLAY H', 37, 'L'); +INSERT INTO public.election VALUES (1828, 'JACKSON A', 178, 'W'); +INSERT INTO public.election VALUES (1828, 'ADAMS J', 83, 'L'); +INSERT INTO public.election VALUES (1832, 'JACKSON A', 219, 'W'); +INSERT INTO public.election VALUES (1832, 'CLAY H', 49, 'L'); +INSERT INTO public.election VALUES (1832, 'FLOYD J', 11, 'L'); +INSERT INTO public.election VALUES (1832, 'WIRT W', 7, 'L'); +INSERT INTO public.election VALUES (1836, 'VAN BUREN M', 170, 'W'); +INSERT INTO public.election VALUES (1836, 'HARRISON W H', 73, 'L'); +INSERT INTO public.election VALUES (1836, 'WHITE H L', 26, 'L'); +INSERT INTO public.election VALUES (1836, 'WEBSTER D', 14, 'L'); +INSERT INTO public.election VALUES (1836, 'MANGUM W P', 11, 'L'); +INSERT INTO public.election VALUES (1840, 'HARRISON W H', 234, 'W'); +INSERT INTO public.election VALUES (1840, 'VAN BUREN M', 60, 'L'); +INSERT INTO public.election VALUES (1844, 'POLK J K', 170, 'W'); +INSERT INTO public.election VALUES (1844, 'CLAY H', 105, 'L'); +INSERT INTO public.election VALUES (1848, 'TAYLOR Z', 163, 'W'); +INSERT INTO public.election VALUES (1848, 'CASS L', 126, 'L'); +INSERT INTO public.election VALUES (1852, 'PIERCE F', 254, 'W'); +INSERT INTO public.election VALUES (1852, 'SCOTT W', 42, 'L'); +INSERT INTO public.election VALUES (1856, 'BUCHANAN J', 174, 'W'); +INSERT INTO public.election VALUES (1856, 'FREMONT J C', 114, 'L'); +INSERT INTO public.election VALUES (1856, 'FILLMORE M', 8, 'L'); +INSERT INTO public.election VALUES (1860, 'LINCOLN A', 180, 'W'); +INSERT INTO public.election VALUES (1860, 'BRECKINRIDGE J C', 72, 'L'); +INSERT INTO public.election VALUES (1860, 'BELL J', 39, 'L'); +INSERT INTO public.election VALUES (1860, 'DOUGLAS S', 12, 'L'); +INSERT INTO public.election VALUES (1864, 'LINCOLN A', 212, 'W'); +INSERT INTO public.election VALUES (1864, 'MCCLELLAN G B', 21, 'L'); +INSERT INTO public.election VALUES (1868, 'GRANT U S', 214, 'W'); +INSERT INTO public.election VALUES (1868, 'SEYMOUR H', 80, 'L'); +INSERT INTO public.election VALUES (1872, 'GRANT U S', 286, 'W'); +INSERT INTO public.election VALUES (1872, 'HENDRICKS T A', 42, 'L'); +INSERT INTO public.election VALUES (1872, 'BROWN B G', 18, 'L'); +INSERT INTO public.election VALUES (1872, 'JENKINS C J', 2, 'L'); +INSERT INTO public.election VALUES (1872, 'DAVIS D', 1, 'L'); +INSERT INTO public.election VALUES (1876, 'HAYES R B', 185, 'W'); +INSERT INTO public.election VALUES (1876, 'TILDEN R B', 184, 'L'); +INSERT INTO public.election VALUES (1880, 'GARFIELD J A', 214, 'W'); +INSERT INTO public.election VALUES (1880, 'HANCOCK W S', 155, 'L'); +INSERT INTO public.election VALUES (1884, 'CLEVELAND G', 219, 'W'); +INSERT INTO public.election VALUES (1884, 'BLAINE J G', 182, 'L'); +INSERT INTO public.election VALUES (1888, 'HARRISON B', 233, 'W'); +INSERT INTO public.election VALUES (1888, 'CLEVELAND G', 168, 'L'); +INSERT INTO public.election VALUES (1892, 'CLEVELAND G', 277, 'W'); +INSERT INTO public.election VALUES (1892, 'HARRISON B', 145, 'L'); +INSERT INTO public.election VALUES (1892, 'WEAVER J B', 22, 'L'); +INSERT INTO public.election VALUES (1896, 'MCKINLEY W', 271, 'W'); +INSERT INTO public.election VALUES (1896, 'BRYAN W J', 176, 'L'); +INSERT INTO public.election VALUES (1900, 'MCKINLEY W', 292, 'W'); +INSERT INTO public.election VALUES (1900, 'BRYAN W J', 155, 'L'); +INSERT INTO public.election VALUES (1904, 'ROOSEVELT T', 336, 'W'); +INSERT INTO public.election VALUES (1904, 'PARKER E B', 140, 'L'); +INSERT INTO public.election VALUES (1908, 'TAFT W H', 321, 'W'); +INSERT INTO public.election VALUES (1908, 'BRYAN W J', 162, 'L'); +INSERT INTO public.election VALUES (1912, 'WILSON W', 435, 'W'); +INSERT INTO public.election VALUES (1912, 'ROOSEVELT T', 88, 'L'); +INSERT INTO public.election VALUES (1912, 'TAFT W H', 8, 'L'); +INSERT INTO public.election VALUES (1916, 'WILSON W', 277, 'W'); +INSERT INTO public.election VALUES (1916, 'HUGHES C E', 254, 'L'); +INSERT INTO public.election VALUES (1920, 'HARDING W G', 404, 'W'); +INSERT INTO public.election VALUES (1920, 'COX W W', 127, 'L'); +INSERT INTO public.election VALUES (1924, 'COOLIDGE C', 382, 'W'); +INSERT INTO public.election VALUES (1924, 'DAVIS J W', 136, 'L'); +INSERT INTO public.election VALUES (1924, 'LA FOLLETTE R M', 13, 'L'); +INSERT INTO public.election VALUES (1928, 'HOOVER H C', 444, 'W'); +INSERT INTO public.election VALUES (1928, 'SMITH A E', 87, 'L'); +INSERT INTO public.election VALUES (1932, 'ROOSEVELT F D', 472, 'W'); +INSERT INTO public.election VALUES (1932, 'HOOVER H C', 49, 'L'); +INSERT INTO public.election VALUES (1936, 'ROOSEVELT F D', 523, 'W'); +INSERT INTO public.election VALUES (1936, 'LANDON A M', 8, 'L'); +INSERT INTO public.election VALUES (1940, 'ROOSEVELT F D', 449, 'W'); +INSERT INTO public.election VALUES (1940, 'WILKIE W L', 82, 'L'); +INSERT INTO public.election VALUES (1944, 'ROOSEVELT F D', 432, 'W'); +INSERT INTO public.election VALUES (1944, 'DEWEY T E', 99, 'L'); +INSERT INTO public.election VALUES (1948, 'TRUMAN H S', 303, 'W'); +INSERT INTO public.election VALUES (1948, 'DEWEY T E', 189, 'L'); +INSERT INTO public.election VALUES (1948, 'THURMOND J S', 39, 'L'); +INSERT INTO public.election VALUES (1952, 'EISENHOWER D D', 442, 'W'); +INSERT INTO public.election VALUES (1952, 'STEVENSON A E', 89, 'L'); +INSERT INTO public.election VALUES (1956, 'EISENHOWER D D', 457, 'W'); +INSERT INTO public.election VALUES (1956, 'STEVENSON A E', 73, 'L'); +INSERT INTO public.election VALUES (1956, 'JONES W B', 1, 'L'); +INSERT INTO public.election VALUES (1960, 'KENNEDY J F', 303, 'W'); +INSERT INTO public.election VALUES (1960, 'NIXON R M', 219, 'L'); +INSERT INTO public.election VALUES (1960, 'BYRD', 15, 'L'); +INSERT INTO public.election VALUES (1964, 'JOHNSON L B', 486, 'W'); +INSERT INTO public.election VALUES (1964, 'GOLDWATER B', 52, 'L'); +INSERT INTO public.election VALUES (1968, 'NIXON R M', 301, 'W'); +INSERT INTO public.election VALUES (1968, 'HUMPHREY H H', 191, 'L'); +INSERT INTO public.election VALUES (1968, 'WALLACE G C', 46, 'L'); +INSERT INTO public.election VALUES (1972, 'NIXON R M', 520, 'W'); +INSERT INTO public.election VALUES (1972, 'MCGOVERN G S', 17, 'L'); +INSERT INTO public.election VALUES (1972, 'HOSPERS J', 1, 'L'); +INSERT INTO public.election VALUES (1976, 'CARTER J M', 297, 'W'); +INSERT INTO public.election VALUES (1976, 'FORD G R', 240, 'L'); +INSERT INTO public.election VALUES (1980, 'CARTER J M', 49, 'L'); +INSERT INTO public.election VALUES (1980, 'REAGAN R', 489, 'W'); +INSERT INTO public.election VALUES (1988, 'BUSH G H W', 426, 'W'); +INSERT INTO public.election VALUES (1988, 'DUKAKIS M', 111, 'L'); +INSERT INTO public.election VALUES (1992, 'CLINTON W J', 370, 'W'); +INSERT INTO public.election VALUES (1992, 'BUSH G H W', 168, 'L'); +INSERT INTO public.election VALUES (1996, 'CLINTON W J', 379, 'W'); +INSERT INTO public.election VALUES (1996, 'DOLE B', 159, 'L'); +INSERT INTO public.election VALUES (2000, 'BUSH G W', 271, 'W'); +INSERT INTO public.election VALUES (2000, 'GORE A', 266, 'L'); +INSERT INTO public.election VALUES (2004, 'BUSH G W', 286, 'W'); +INSERT INTO public.election VALUES (2004, 'KERRY J', 251, 'L'); +INSERT INTO public.election VALUES (2008, 'OBAMA B', 365, 'W'); +INSERT INTO public.election VALUES (2008, 'MCCAIN J', 173, 'L'); +INSERT INTO public.election VALUES (2012, 'OBAMA B', 332, 'W'); +INSERT INTO public.election VALUES (2012, 'ROMNEY M', 206, 'L'); +INSERT INTO public.election VALUES (2016, 'TRUMP D J', 304, 'W'); +INSERT INTO public.election VALUES (2016, 'CLINTON H D R', 227, 'L'); + + +-- +-- Data for Name: pres_hobby; Type: TABLE DATA; Schema: public; Owner: exam +-- + +INSERT INTO public.pres_hobby VALUES (6, 'BILLIARDS'); +INSERT INTO public.pres_hobby VALUES (6, 'SWIMMING'); +INSERT INTO public.pres_hobby VALUES (21, 'FISHING'); +INSERT INTO public.pres_hobby VALUES (22, 'FISHING'); +INSERT INTO public.pres_hobby VALUES (29, 'FISHING'); +INSERT INTO public.pres_hobby VALUES (29, 'GOLF'); +INSERT INTO public.pres_hobby VALUES (29, 'INDIAN CLUBS'); +INSERT INTO public.pres_hobby VALUES (29, 'MECH. HORS'); +INSERT INTO public.pres_hobby VALUES (29, 'PITCHING HAY'); +INSERT INTO public.pres_hobby VALUES (33, 'BRIDGE'); +INSERT INTO public.pres_hobby VALUES (33, 'GOLF'); +INSERT INTO public.pres_hobby VALUES (33, 'HUNTING'); +INSERT INTO public.pres_hobby VALUES (33, 'PAINTING'); +INSERT INTO public.pres_hobby VALUES (33, 'FISHING'); +INSERT INTO public.pres_hobby VALUES (20, 'BILLIARDS'); +INSERT INTO public.pres_hobby VALUES (28, 'GOLF'); +INSERT INTO public.pres_hobby VALUES (28, 'POKER'); +INSERT INTO public.pres_hobby VALUES (28, 'RIDING'); +INSERT INTO public.pres_hobby VALUES (23, 'HUNTING'); +INSERT INTO public.pres_hobby VALUES (19, 'CROQUET'); +INSERT INTO public.pres_hobby VALUES (19, 'DRIVING'); +INSERT INTO public.pres_hobby VALUES (19, 'SHOOTING'); +INSERT INTO public.pres_hobby VALUES (30, 'FISHING'); +INSERT INTO public.pres_hobby VALUES (30, 'MEDICINE BALL'); +INSERT INTO public.pres_hobby VALUES (7, 'RIDING'); +INSERT INTO public.pres_hobby VALUES (3, 'FISHING'); +INSERT INTO public.pres_hobby VALUES (3, 'RIDING'); +INSERT INTO public.pres_hobby VALUES (35, 'RIDING'); +INSERT INTO public.pres_hobby VALUES (34, 'SAILING'); +INSERT INTO public.pres_hobby VALUES (34, 'SWIMMING'); +INSERT INTO public.pres_hobby VALUES (34, 'TOUCH FOOTBALL'); +INSERT INTO public.pres_hobby VALUES (16, 'WALKING'); +INSERT INTO public.pres_hobby VALUES (24, 'RIDING'); +INSERT INTO public.pres_hobby VALUES (24, 'SWIMMING'); +INSERT INTO public.pres_hobby VALUES (24, 'WALKING'); +INSERT INTO public.pres_hobby VALUES (36, 'GOLF'); +INSERT INTO public.pres_hobby VALUES (31, 'FISHING'); +INSERT INTO public.pres_hobby VALUES (31, 'SAILING'); +INSERT INTO public.pres_hobby VALUES (31, 'SWIMMING'); +INSERT INTO public.pres_hobby VALUES (25, 'BOXING'); +INSERT INTO public.pres_hobby VALUES (25, 'HUNTING'); +INSERT INTO public.pres_hobby VALUES (25, 'JUJITSU'); +INSERT INTO public.pres_hobby VALUES (25, 'RIDING'); +INSERT INTO public.pres_hobby VALUES (25, 'SHOOTING'); +INSERT INTO public.pres_hobby VALUES (25, 'TENNIS'); +INSERT INTO public.pres_hobby VALUES (25, 'WRESTLING'); +INSERT INTO public.pres_hobby VALUES (26, 'GOLF'); +INSERT INTO public.pres_hobby VALUES (26, 'RIDING'); +INSERT INTO public.pres_hobby VALUES (12, 'RIDING'); +INSERT INTO public.pres_hobby VALUES (32, 'FISHING'); +INSERT INTO public.pres_hobby VALUES (32, 'POKER'); +INSERT INTO public.pres_hobby VALUES (32, 'WALKING'); +INSERT INTO public.pres_hobby VALUES (8, 'RIDING'); +INSERT INTO public.pres_hobby VALUES (1, 'FISHING'); +INSERT INTO public.pres_hobby VALUES (1, 'RIDING'); +INSERT INTO public.pres_hobby VALUES (27, 'GOLF'); +INSERT INTO public.pres_hobby VALUES (27, 'RIDING'); +INSERT INTO public.pres_hobby VALUES (27, 'WALKING'); +INSERT INTO public.pres_hobby VALUES (6, 'WALKING'); +INSERT INTO public.pres_hobby VALUES (40, 'GOLF'); +INSERT INTO public.pres_hobby VALUES (43, 'COIKING'); +INSERT INTO public.pres_hobby VALUES (43, 'BASKETBALL'); +INSERT INTO public.pres_hobby VALUES (43, 'DANCING'); +INSERT INTO public.pres_hobby VALUES (41, 'PLAYING SAXOPHONE'); +INSERT INTO public.pres_hobby VALUES (42, 'FISHING'); +INSERT INTO public.pres_hobby VALUES (42, 'JOGGING'); +INSERT INTO public.pres_hobby VALUES (39, 'FISHING'); +INSERT INTO public.pres_hobby VALUES (44, 'GOLF'); + + +-- +-- Data for Name: pres_marriage; Type: TABLE DATA; Schema: public; Owner: exam +-- + +INSERT INTO public.pres_marriage VALUES (1, 'CUSTIS M D', 27, 0, 1759); +INSERT INTO public.pres_marriage VALUES (2, 'SMITH A', 19, 5, 1764); +INSERT INTO public.pres_marriage VALUES (3, 'SKELTON M W', 23, 6, 1772); +INSERT INTO public.pres_marriage VALUES (4, 'TODD D D P', 26, 0, 1794); +INSERT INTO public.pres_marriage VALUES (5, 'KORTRIGHT E', 17, 3, 1786); +INSERT INTO public.pres_marriage VALUES (6, 'JOHNSON L C', 22, 4, 1797); +INSERT INTO public.pres_marriage VALUES (7, 'ROBARDS R D', 26, 0, 1794); +INSERT INTO public.pres_marriage VALUES (8, 'HOOS H', 23, 4, 1807); +INSERT INTO public.pres_marriage VALUES (9, 'SYMMES A T', 20, 10, 1795); +INSERT INTO public.pres_marriage VALUES (10, 'CHRISTIAN L', 22, 8, 1813); +INSERT INTO public.pres_marriage VALUES (10, 'GARDINER J', 24, 7, 1844); +INSERT INTO public.pres_marriage VALUES (11, 'CHILDRESS S', 20, 0, 1824); +INSERT INTO public.pres_marriage VALUES (12, 'SMITH M M', 21, 6, 1810); +INSERT INTO public.pres_marriage VALUES (13, 'POWERS A', 27, 2, 1826); +INSERT INTO public.pres_marriage VALUES (13, 'MCINTOSH C C', 44, 0, 1858); +INSERT INTO public.pres_marriage VALUES (14, 'APPLETON J M', 28, 3, 1834); +INSERT INTO public.pres_marriage VALUES (16, 'TODD M', 23, 4, 1842); +INSERT INTO public.pres_marriage VALUES (17, 'MCCARDLE E', 16, 5, 1827); +INSERT INTO public.pres_marriage VALUES (18, 'DENT J B', 22, 4, 1848); +INSERT INTO public.pres_marriage VALUES (19, 'WEBB L W', 21, 8, 1852); +INSERT INTO public.pres_marriage VALUES (20, 'RUDOLPH L', 26, 7, 1858); +INSERT INTO public.pres_marriage VALUES (21, 'HERNDON E L', 22, 3, 1859); +INSERT INTO public.pres_marriage VALUES (22, 'FOLSON F', 21, 5, 1886); +INSERT INTO public.pres_marriage VALUES (23, 'SCOTT C L', 31, 2, 1853); +INSERT INTO public.pres_marriage VALUES (23, 'DIMMICK M S L', 37, 1, 1896); +INSERT INTO public.pres_marriage VALUES (24, 'SAXTON I', 23, 2, 1871); +INSERT INTO public.pres_marriage VALUES (25, 'LEE A H', 19, 1, 1880); +INSERT INTO public.pres_marriage VALUES (25, 'CARROW E K', 25, 5, 1886); +INSERT INTO public.pres_marriage VALUES (26, 'HERRON H', 25, 3, 1886); +INSERT INTO public.pres_marriage VALUES (27, 'AXSON E L', 25, 3, 1885); +INSERT INTO public.pres_marriage VALUES (27, 'GALT E B', 43, 0, 1915); +INSERT INTO public.pres_marriage VALUES (28, 'DE WOLFE F K', 30, 0, 1891); +INSERT INTO public.pres_marriage VALUES (29, 'GOODHUE G A', 26, 2, 1905); +INSERT INTO public.pres_marriage VALUES (30, 'HENRY L', 23, 2, 1899); +INSERT INTO public.pres_marriage VALUES (31, 'ROOSEVELT A E', 20, 6, 1905); +INSERT INTO public.pres_marriage VALUES (32, 'WALLACE E V', 34, 1, 1919); +INSERT INTO public.pres_marriage VALUES (33, 'DOUD G', 19, 2, 1916); +INSERT INTO public.pres_marriage VALUES (34, 'BOUVIER J L', 24, 3, 1953); +INSERT INTO public.pres_marriage VALUES (35, 'TAYLOR C A', 21, 2, 1934); +INSERT INTO public.pres_marriage VALUES (36, 'RYAN T C', 28, 2, 1940); +INSERT INTO public.pres_marriage VALUES (37, 'WARREN E B', 30, 4, 1948); +INSERT INTO public.pres_marriage VALUES (38, 'SMITH R', 18, 4, 1946); +INSERT INTO public.pres_marriage VALUES (40, 'WYMAN J', 25, 2, 1940); +INSERT INTO public.pres_marriage VALUES (40, 'DAVIS N', 28, 2, 1952); +INSERT INTO public.pres_marriage VALUES (39, 'PIERCE B', 20, 6, 1945); +INSERT INTO public.pres_marriage VALUES (42, 'WELCH L L', 31, 2, 1977); +INSERT INTO public.pres_marriage VALUES (43, 'ROBINSON M', 28, 2, 1992); +INSERT INTO public.pres_marriage VALUES (41, 'RODHAM H', 28, 1, 1975); +INSERT INTO public.pres_marriage VALUES (44, 'ZELNICKOVA I', 28, 3, 1977); +INSERT INTO public.pres_marriage VALUES (44, 'MAPLES M', 30, 1, 1993); +INSERT INTO public.pres_marriage VALUES (44, 'KNAUSS M', 34, 1, 2005); + + +-- +-- Data for Name: president; Type: TABLE DATA; Schema: public; Owner: exam +-- + +INSERT INTO public.president VALUES (1, 'WASHINGTON G', 1732, 7, 67, 'FEDERALIST', 35); +INSERT INTO public.president VALUES (2, 'ADAMS J', 1735, 4, 90, 'FEDERALIST', 38); +INSERT INTO public.president VALUES (3, 'JEFFERSON T', 1743, 8, 83, 'DEMO-REP', 35); +INSERT INTO public.president VALUES (4, 'MADISON J', 1751, 8, 85, 'DEMO-REP', 35); +INSERT INTO public.president VALUES (5, 'MONROE J', 1758, 8, 73, 'DEMO-REP', 35); +INSERT INTO public.president VALUES (6, 'ADAMS J Q', 1767, 4, 80, 'DEMO-REP', 38); +INSERT INTO public.president VALUES (7, 'JACKSON A', 1767, 8, 78, 'DEMOCRATIC', 40); +INSERT INTO public.president VALUES (8, 'VAN BUREN M', 1782, 4, 79, 'DEMOCRATIC', 46); +INSERT INTO public.president VALUES (9, 'HARRISON W H', 1773, 0, 68, 'WHIG', 35); +INSERT INTO public.president VALUES (10, 'TYLER J', 1790, 3, 71, 'WHIG', 35); +INSERT INTO public.president VALUES (11, 'POLK J K', 1795, 4, 53, 'DEMOCRATIC', 47); +INSERT INTO public.president VALUES (12, 'TAYLOR Z', 1784, 1, 65, 'WHIG', 35); +INSERT INTO public.president VALUES (13, 'FILLMORE M', 1800, 2, 74, 'WHIG', 46); +INSERT INTO public.president VALUES (14, 'PIERCE F', 1804, 4, 64, 'DEMOCRATIC', 44); +INSERT INTO public.president VALUES (15, 'BUCHANAN J', 1791, 4, 77, 'DEMOCRATIC', 37); +INSERT INTO public.president VALUES (16, 'LINCOLN A', 1809, 4, 56, 'REPUBLICAN', 49); +INSERT INTO public.president VALUES (17, 'JOHNSON A', 1808, 3, 66, 'DEMOCRATIC', 37); +INSERT INTO public.president VALUES (18, 'GRANT U S', 1822, 8, 63, 'REPUBLICAN', 1); +INSERT INTO public.president VALUES (19, 'HAYES R B', 1822, 4, 70, 'REPUBLICAN', 1); +INSERT INTO public.president VALUES (20, 'GARFIELD J A', 1831, 0, 49, 'REPUBLICAN', 1); +INSERT INTO public.president VALUES (21, 'ARTHUR C A', 1830, 3, 56, 'REPUBLICAN', 36); +INSERT INTO public.president VALUES (22, 'CLEVELAND G', 1837, 8, 71, 'DEMOCRATIC', 42); +INSERT INTO public.president VALUES (23, 'HARRISON B', 1833, 4, 67, 'REPUBLICAN', 1); +INSERT INTO public.president VALUES (24, 'MCKINLEY W', 1843, 4, 58, 'REPUBLICAN', 1); +INSERT INTO public.president VALUES (25, 'ROOSEVELT T', 1858, 7, 60, 'REPUBLICAN', 46); +INSERT INTO public.president VALUES (26, 'TAFT W H', 1857, 4, 72, 'REPUBLICAN', 1); +INSERT INTO public.president VALUES (27, 'WILSON W', 1856, 8, 67, 'DEMOCRATIC', 35); +INSERT INTO public.president VALUES (28, 'HARDING W G', 1865, 2, 57, 'REPUBLICAN', 1); +INSERT INTO public.president VALUES (29, 'COOLIDGE C', 1872, 5, 60, 'REPUBLICAN', 36); +INSERT INTO public.president VALUES (30, 'HOOVER H C', 1874, 4, 90, 'REPUBLICAN', 13); +INSERT INTO public.president VALUES (31, 'ROOSEVELT F D', 1882, 12, 63, 'DEMOCRATIC', 46); +INSERT INTO public.president VALUES (32, 'TRUMAN H S', 1884, 7, 88, 'DEMOCRATIC', 8); +INSERT INTO public.president VALUES (33, 'EISENHOWER D D', 1890, 8, 79, 'REPUBLICAN', 12); +INSERT INTO public.president VALUES (34, 'KENNEDY J F', 1917, 2, 46, 'DEMOCRATIC', 38); +INSERT INTO public.president VALUES (35, 'JOHNSON L B', 1908, 5, 65, 'DEMOCRATIC', 12); +INSERT INTO public.president VALUES (36, 'NIXON R M', 1913, 5, 81, 'REPUBLICAN', 15); +INSERT INTO public.president VALUES (37, 'FORD G R', 1913, 2, 93, 'REPUBLICAN', 21); +INSERT INTO public.president VALUES (38, 'CARTER J M', 1924, 4, NULL, 'DEMOCRATIC', 43); +INSERT INTO public.president VALUES (39, 'BUSH G H W', 1924, 4, NULL, 'REPUBLICAN', 38); +INSERT INTO public.president VALUES (40, 'REAGAN R', 1911, 8, 93, 'REPUBLICAN', 5); +INSERT INTO public.president VALUES (41, 'CLINTON W J', 1946, 8, NULL, 'DEMOCRATIC', 9); +INSERT INTO public.president VALUES (42, 'BUSH G W', 1946, 8, NULL, 'REPUBLICAN', 39); +INSERT INTO public.president VALUES (43, 'OBAMA B', 1961, 8, NULL, 'DEMOCRATIC', 34); +INSERT INTO public.president VALUES (44, 'TRUMP D J', 1946, 0, NULL, 'REPUBLICAN', 46); + + +-- +-- Data for Name: state; Type: TABLE DATA; Schema: public; Owner: exam +-- + +INSERT INTO public.state VALUES (1, 'OHIO', 4, 1803); +INSERT INTO public.state VALUES (2, 'LOUISIANNA', 6, 1812); +INSERT INTO public.state VALUES (3, 'INDIANA', 7, 1816); +INSERT INTO public.state VALUES (4, 'MISSISSIPI', 8, 1817); +INSERT INTO public.state VALUES (5, 'ILLINOIS', 8, 1818); +INSERT INTO public.state VALUES (6, 'ALABAMA', 8, 1819); +INSERT INTO public.state VALUES (7, 'MAINE', 8, 1820); +INSERT INTO public.state VALUES (8, 'MISSOURI', 9, 1821); +INSERT INTO public.state VALUES (9, 'ARKANSAS', 12, 1836); +INSERT INTO public.state VALUES (10, 'MICHIGAN', 12, 1837); +INSERT INTO public.state VALUES (11, 'FLORIDA', 15, 1845); +INSERT INTO public.state VALUES (12, 'TEXAS', 16, 1845); +INSERT INTO public.state VALUES (13, 'IOWA', 16, 1846); +INSERT INTO public.state VALUES (14, 'WISCONSIN', 16, 1848); +INSERT INTO public.state VALUES (15, 'CALIFORNIA', 18, 1850); +INSERT INTO public.state VALUES (16, 'MINNESOTA', 20, 1858); +INSERT INTO public.state VALUES (17, 'OREGON', 20, 1859); +INSERT INTO public.state VALUES (18, 'KANSAS', 20, 1861); +INSERT INTO public.state VALUES (19, 'WEST VIRGINIA', 21, 1863); +INSERT INTO public.state VALUES (20, 'NEVADA', 21, 1864); +INSERT INTO public.state VALUES (21, 'NEBRASKA', 22, 1867); +INSERT INTO public.state VALUES (22, 'COLORADO', 25, 1876); +INSERT INTO public.state VALUES (23, 'NORTH DAKOTA', 30, 1889); +INSERT INTO public.state VALUES (24, 'SOUTH DAKOTA', 30, 1889); +INSERT INTO public.state VALUES (25, 'MONTANA', 30, 1889); +INSERT INTO public.state VALUES (26, 'WASHINGTON', 30, 1889); +INSERT INTO public.state VALUES (27, 'IDAHO', 30, 1890); +INSERT INTO public.state VALUES (28, 'WYOMING', 30, 1890); +INSERT INTO public.state VALUES (29, 'UTAH', 31, 1896); +INSERT INTO public.state VALUES (30, 'OKLAEXAMA', 35, 1907); +INSERT INTO public.state VALUES (31, 'NEW MEXICO', 36, 1912); +INSERT INTO public.state VALUES (32, 'ARIZONA', 36, 1912); +INSERT INTO public.state VALUES (33, 'ALASKA', 50, 1959); +INSERT INTO public.state VALUES (34, 'HAWAII', 50, 1959); +INSERT INTO public.state VALUES (35, 'VIRGINIA', 0, 1776); +INSERT INTO public.state VALUES (36, 'VERMONT', 1, 1791); +INSERT INTO public.state VALUES (37, 'PENNSYLVANIA', 0, 1776); +INSERT INTO public.state VALUES (38, 'MASSACHUSETTS', 0, 1776); +INSERT INTO public.state VALUES (39, 'CONNECTICUT', 0, 1776); +INSERT INTO public.state VALUES (40, 'SOUTH CAROLINA', 0, 1776); +INSERT INTO public.state VALUES (41, 'MARYLAND', 0, 1776); +INSERT INTO public.state VALUES (42, 'NEW JERSEY', 0, 1776); +INSERT INTO public.state VALUES (43, 'GEORGIA', 0, 1776); +INSERT INTO public.state VALUES (44, 'NEW HAMPSHIRE', 0, 1776); +INSERT INTO public.state VALUES (45, 'DELAWARE', 0, 1776); +INSERT INTO public.state VALUES (46, 'NEW YORK', 0, 1776); +INSERT INTO public.state VALUES (47, 'NORTH CAROLINA', 0, 1776); +INSERT INTO public.state VALUES (48, 'RHODE ISLAND', 0, 1776); +INSERT INTO public.state VALUES (49, 'KENTUCKY', 1, 1792); +INSERT INTO public.state VALUES (50, 'TENNESSEE', 2, 1796); + + +-- +-- Name: administration_id_seq; Type: SEQUENCE SET; Schema: public; Owner: exam +-- + +SELECT pg_catalog.setval('public.administration_id_seq', 67, true); + + +-- +-- Name: president_id_seq; Type: SEQUENCE SET; Schema: public; Owner: exam +-- + +SELECT pg_catalog.setval('public.president_id_seq', 44, true); + + +-- +-- Name: state_id_seq; Type: SEQUENCE SET; Schema: public; Owner: exam +-- + +SELECT pg_catalog.setval('public.state_id_seq', 50, true); + + +-- +-- Name: administration prim_key_adm; Type: CONSTRAINT; Schema: public; Owner: exam +-- + +ALTER TABLE ONLY public.administration + ADD CONSTRAINT prim_key_adm PRIMARY KEY (id); + + +-- +-- Name: admin_vpres prim_key_admvp; Type: CONSTRAINT; Schema: public; Owner: exam +-- + +ALTER TABLE ONLY public.admin_vpres + ADD CONSTRAINT prim_key_admvp PRIMARY KEY (admin_id, vice_pres_name); + + +-- +-- Name: election prim_key_elec; Type: CONSTRAINT; Schema: public; Owner: exam +-- + +ALTER TABLE ONLY public.election + ADD CONSTRAINT prim_key_elec PRIMARY KEY (election_year, candidate); + + +-- +-- Name: pres_hobby prim_key_hobby; Type: CONSTRAINT; Schema: public; Owner: exam +-- + +ALTER TABLE ONLY public.pres_hobby + ADD CONSTRAINT prim_key_hobby PRIMARY KEY (pres_id, hobby); + + +-- +-- Name: president prim_key_pres; Type: CONSTRAINT; Schema: public; Owner: exam +-- + +ALTER TABLE ONLY public.president + ADD CONSTRAINT prim_key_pres PRIMARY KEY (id); + + +-- +-- Name: pres_marriage prim_key_presmar; Type: CONSTRAINT; Schema: public; Owner: exam +-- + +ALTER TABLE ONLY public.pres_marriage + ADD CONSTRAINT prim_key_presmar PRIMARY KEY (pres_id, spouse_name); + + +-- +-- Name: state prim_key_state; Type: CONSTRAINT; Schema: public; Owner: exam +-- + +ALTER TABLE ONLY public.state + ADD CONSTRAINT prim_key_state PRIMARY KEY (id); + + +-- +-- Name: iadmin; Type: INDEX; Schema: public; Owner: exam +-- + +CREATE INDEX iadmin ON public.administration USING btree (pres_id, year_inaugurated); + + +-- +-- Name: iadminnrpresid; Type: INDEX; Schema: public; Owner: exam +-- + +CREATE UNIQUE INDEX iadminnrpresid ON public.administration USING btree (admin_nr, pres_id); + + +-- +-- Name: ipres; Type: INDEX; Schema: public; Owner: exam +-- + +CREATE INDEX ipres ON public.president USING btree (party); + + +-- +-- Name: admin_vpres admin_vpres_fk1; Type: FK CONSTRAINT; Schema: public; Owner: exam +-- + +ALTER TABLE ONLY public.admin_vpres + ADD CONSTRAINT admin_vpres_fk1 FOREIGN KEY (admin_id) REFERENCES public.administration(id); + + +-- +-- Name: administration administration_fk1; Type: FK CONSTRAINT; Schema: public; Owner: exam +-- + +ALTER TABLE ONLY public.administration + ADD CONSTRAINT administration_fk1 FOREIGN KEY (pres_id) REFERENCES public.president(id); + + +-- +-- Name: pres_hobby pres_hobby_fk1; Type: FK CONSTRAINT; Schema: public; Owner: exam +-- + +ALTER TABLE ONLY public.pres_hobby + ADD CONSTRAINT pres_hobby_fk1 FOREIGN KEY (pres_id) REFERENCES public.president(id); + + +-- +-- Name: pres_marriage pres_marriage_fk1; Type: FK CONSTRAINT; Schema: public; Owner: exam +-- + +ALTER TABLE ONLY public.pres_marriage + ADD CONSTRAINT pres_marriage_fk1 FOREIGN KEY (pres_id) REFERENCES public.president(id); + + +-- +-- Name: president president_fk1; Type: FK CONSTRAINT; Schema: public; Owner: exam +-- + +ALTER TABLE ONLY public.president + ADD CONSTRAINT president_fk1 FOREIGN KEY (state_id_born) REFERENCES public.state(id); + + +-- +-- Name: state state_fk1; Type: FK CONSTRAINT; Schema: public; Owner: exam +-- + +ALTER TABLE ONLY public.state + ADD CONSTRAINT state_fk1 FOREIGN KEY (admin_id) REFERENCES public.administration(id); + + +-- +-- PostgreSQL database dump complete +-- + +commit; \ No newline at end of file diff --git a/topics/code/simplejdbc/src/main/resources/sql/president_data.sql b/topics/code/simplejdbc/src/main/resources/sql/president_data.sql new file mode 100644 index 0000000..c01cff9 --- /dev/null +++ b/topics/code/simplejdbc/src/main/resources/sql/president_data.sql @@ -0,0 +1,591 @@ +begin work; +TRUNCATE TABLE admin_vpres RESTART IDENTITY CASCADE; +TRUNCATE TABLE administration RESTART IDENTITY CASCADE; +TRUNCATE TABLE election RESTART IDENTITY CASCADE; +TRUNCATE TABLE pres_hobby RESTART IDENTITY CASCADE; +TRUNCATE TABLE pres_marriage RESTART IDENTITY CASCADE; +TRUNCATE TABLE president RESTART IDENTITY CASCADE; +TRUNCATE TABLE state RESTART IDENTITY CASCADE; + +-- +-- Data for Name: president; Type: TABLE DATA; Schema: public; Owner: - +-- + +ALTER TABLE president DISABLE TRIGGER ALL; + +INSERT INTO president VALUES (1, 'WASHINGTON G', 1732, 7, 67, 'FEDERALIST', 35); +INSERT INTO president VALUES (2, 'ADAMS J', 1735, 4, 90, 'FEDERALIST', 38); +INSERT INTO president VALUES (3, 'JEFFERSON T', 1743, 8, 83, 'DEMO-REP', 35); +INSERT INTO president VALUES (4, 'MADISON J', 1751, 8, 85, 'DEMO-REP', 35); +INSERT INTO president VALUES (5, 'MONROE J', 1758, 8, 73, 'DEMO-REP', 35); +INSERT INTO president VALUES (6, 'ADAMS J Q', 1767, 4, 80, 'DEMO-REP', 38); +INSERT INTO president VALUES (7, 'JACKSON A', 1767, 8, 78, 'DEMOCRATIC', 40); +INSERT INTO president VALUES (8, 'VAN BUREN M', 1782, 4, 79, 'DEMOCRATIC', 46); +INSERT INTO president VALUES (9, 'HARRISON W H', 1773, 0, 68, 'WHIG', 35); +INSERT INTO president VALUES (10, 'TYLER J', 1790, 3, 71, 'WHIG', 35); +INSERT INTO president VALUES (11, 'POLK J K', 1795, 4, 53, 'DEMOCRATIC', 47); +INSERT INTO president VALUES (12, 'TAYLOR Z', 1784, 1, 65, 'WHIG', 35); +INSERT INTO president VALUES (13, 'FILLMORE M', 1800, 2, 74, 'WHIG', 46); +INSERT INTO president VALUES (14, 'PIERCE F', 1804, 4, 64, 'DEMOCRATIC', 44); +INSERT INTO president VALUES (15, 'BUCHANAN J', 1791, 4, 77, 'DEMOCRATIC', 37); +INSERT INTO president VALUES (16, 'LINCOLN A', 1809, 4, 56, 'REPUBLICAN', 49); +INSERT INTO president VALUES (17, 'JOHNSON A', 1808, 3, 66, 'DEMOCRATIC', 37); +INSERT INTO president VALUES (18, 'GRANT U S', 1822, 8, 63, 'REPUBLICAN', 1); +INSERT INTO president VALUES (19, 'HAYES R B', 1822, 4, 70, 'REPUBLICAN', 1); +INSERT INTO president VALUES (20, 'GARFIELD J A', 1831, 0, 49, 'REPUBLICAN', 1); +INSERT INTO president VALUES (21, 'ARTHUR C A', 1830, 3, 56, 'REPUBLICAN', 36); +INSERT INTO president VALUES (22, 'CLEVELAND G', 1837, 8, 71, 'DEMOCRATIC', 42); +INSERT INTO president VALUES (23, 'HARRISON B', 1833, 4, 67, 'REPUBLICAN', 1); +INSERT INTO president VALUES (24, 'MCKINLEY W', 1843, 4, 58, 'REPUBLICAN', 1); +INSERT INTO president VALUES (25, 'ROOSEVELT T', 1858, 7, 60, 'REPUBLICAN', 46); +INSERT INTO president VALUES (26, 'TAFT W H', 1857, 4, 72, 'REPUBLICAN', 1); +INSERT INTO president VALUES (27, 'WILSON W', 1856, 8, 67, 'DEMOCRATIC', 35); +INSERT INTO president VALUES (28, 'HARDING W G', 1865, 2, 57, 'REPUBLICAN', 1); +INSERT INTO president VALUES (29, 'COOLIDGE C', 1872, 5, 60, 'REPUBLICAN', 36); +INSERT INTO president VALUES (30, 'HOOVER H C', 1874, 4, 90, 'REPUBLICAN', 13); +INSERT INTO president VALUES (31, 'ROOSEVELT F D', 1882, 12, 63, 'DEMOCRATIC', 46); +INSERT INTO president VALUES (32, 'TRUMAN H S', 1884, 7, 88, 'DEMOCRATIC', 8); +INSERT INTO president VALUES (33, 'EISENHOWER D D', 1890, 8, 79, 'REPUBLICAN', 12); +INSERT INTO president VALUES (34, 'KENNEDY J F', 1917, 2, 46, 'DEMOCRATIC', 38); +INSERT INTO president VALUES (35, 'JOHNSON L B', 1908, 5, 65, 'DEMOCRATIC', 12); +INSERT INTO president VALUES (36, 'NIXON R M', 1913, 5, 81, 'REPUBLICAN', 15); +INSERT INTO president VALUES (37, 'FORD G R', 1913, 2, 93, 'REPUBLICAN', 21); +INSERT INTO president VALUES (38, 'CARTER J M', 1924, 4, NULL, 'DEMOCRATIC', 43); +INSERT INTO president VALUES (39, 'BUSH G H W', 1924, 4, NULL, 'REPUBLICAN', 38); +INSERT INTO president VALUES (40, 'REAGAN R', 1911, 8, 93, 'REPUBLICAN', 5); +INSERT INTO president VALUES (41, 'CLINTON W J', 1946, 8, NULL, 'DEMOCRATIC', 9); +INSERT INTO president VALUES (42, 'BUSH G W', 1946, 8, NULL, 'REPUBLICAN', 39); +INSERT INTO president VALUES (43, 'OBAMA B', 1961, 8, NULL, 'DEMOCRATIC', 34); +INSERT INTO president VALUES (44, 'TRUMP D J', 1946, 0, NULL, 'REPUBLICAN', 46); + +SELECT SETVAL('president_id_seq', (SELECT MAX(id) FROM president), true); + +ALTER TABLE president ENABLE TRIGGER ALL; + + +-- +-- Data for Name: administration; Type: TABLE DATA; Schema: public; Owner: - +-- +ALTER TABLE administration DISABLE TRIGGER ALL; + +-- the first one is a placeholder to cope the issue around 1776. +INSERT INTO administration VALUES (0, 0, 1, 1789); +-- it has to be evaluated, whether this is an exceptable approach +INSERT INTO administration VALUES (1, 1, 1, 1789); +INSERT INTO administration VALUES (2, 2, 1, 1793); +INSERT INTO administration VALUES (3, 3, 2, 1797); +INSERT INTO administration VALUES (4, 4, 3, 1801); +INSERT INTO administration VALUES (5, 5, 3, 1805); +INSERT INTO administration VALUES (6, 6, 4, 1809); +INSERT INTO administration VALUES (7, 7, 4, 1813); +INSERT INTO administration VALUES (8, 8, 5, 1817); +INSERT INTO administration VALUES (9, 9, 5, 1821); +INSERT INTO administration VALUES (10, 10, 6, 1825); +INSERT INTO administration VALUES (11, 11, 7, 1829); +INSERT INTO administration VALUES (12, 12, 7, 1833); +INSERT INTO administration VALUES (13, 13, 8, 1837); +INSERT INTO administration VALUES (14, 14, 9, 1841); +INSERT INTO administration VALUES (15, 14, 10, 1841); +INSERT INTO administration VALUES (16, 15, 11, 1845); +INSERT INTO administration VALUES (17, 16, 12, 1849); +INSERT INTO administration VALUES (18, 16, 13, 1850); +INSERT INTO administration VALUES (19, 17, 14, 1853); +INSERT INTO administration VALUES (20, 18, 15, 1857); +INSERT INTO administration VALUES (21, 19, 16, 1861); +INSERT INTO administration VALUES (22, 20, 16, 1865); +INSERT INTO administration VALUES (23, 20, 17, 1865); +INSERT INTO administration VALUES (24, 21, 18, 1869); +INSERT INTO administration VALUES (25, 22, 18, 1873); +INSERT INTO administration VALUES (26, 23, 19, 1877); +INSERT INTO administration VALUES (27, 24, 20, 1881); +INSERT INTO administration VALUES (28, 24, 21, 1881); +INSERT INTO administration VALUES (29, 25, 22, 1885); +INSERT INTO administration VALUES (30, 26, 23, 1889); +INSERT INTO administration VALUES (31, 27, 22, 1893); +INSERT INTO administration VALUES (32, 28, 24, 1897); +INSERT INTO administration VALUES (33, 29, 24, 1901); +INSERT INTO administration VALUES (34, 29, 25, 1901); +INSERT INTO administration VALUES (35, 30, 25, 1905); +INSERT INTO administration VALUES (36, 31, 26, 1909); +INSERT INTO administration VALUES (37, 32, 27, 1913); +INSERT INTO administration VALUES (38, 33, 27, 1917); +INSERT INTO administration VALUES (39, 34, 28, 1921); +INSERT INTO administration VALUES (40, 34, 29, 1923); +INSERT INTO administration VALUES (41, 35, 29, 1925); +INSERT INTO administration VALUES (42, 36, 30, 1929); +INSERT INTO administration VALUES (43, 37, 31, 1933); +INSERT INTO administration VALUES (44, 38, 31, 1937); +INSERT INTO administration VALUES (45, 39, 31, 1941); +INSERT INTO administration VALUES (46, 40, 31, 1945); +INSERT INTO administration VALUES (47, 40, 32, 1945); +INSERT INTO administration VALUES (48, 41, 32, 1949); +INSERT INTO administration VALUES (49, 42, 33, 1953); +INSERT INTO administration VALUES (50, 43, 33, 1957); +INSERT INTO administration VALUES (51, 44, 34, 1961); +INSERT INTO administration VALUES (52, 44, 35, 1963); +INSERT INTO administration VALUES (53, 45, 35, 1965); +INSERT INTO administration VALUES (54, 46, 36, 1969); +INSERT INTO administration VALUES (55, 47, 36, 1973); +INSERT INTO administration VALUES (56, 47, 37, 1974); +INSERT INTO administration VALUES (57, 48, 38, 1977); +INSERT INTO administration VALUES (58, 49, 40, 1981); +INSERT INTO administration VALUES (59, 50, 40, 1985); +INSERT INTO administration VALUES (60, 51, 39, 1989); +INSERT INTO administration VALUES (61, 52, 41, 1993); +INSERT INTO administration VALUES (62, 53, 41, 1997); +INSERT INTO administration VALUES (63, 54, 42, 2001); +INSERT INTO administration VALUES (64, 55, 42, 2005); +INSERT INTO administration VALUES (65, 56, 43, 2009); +INSERT INTO administration VALUES (66, 57, 43, 2013); +INSERT INTO administration VALUES (67, 58, 44, 2017); + +SELECT SETVAL('administration_id_seq', (SELECT MAX(id) FROM administration), true); + +ALTER TABLE administration ENABLE TRIGGER ALL; + + + +-- +-- Data for Name: state; Type: TABLE DATA; Schema: public; Owner: - +-- + +ALTER TABLE state DISABLE TRIGGER ALL; + +INSERT INTO state VALUES (1, 'OHIO', 4, 1803); +INSERT INTO state VALUES (2, 'LOUISIANNA', 6, 1812); +INSERT INTO state VALUES (3, 'INDIANA', 7, 1816); +INSERT INTO state VALUES (4, 'MISSISSIPI', 8, 1817); +INSERT INTO state VALUES (5, 'ILLINOIS', 8, 1818); +INSERT INTO state VALUES (6, 'ALABAMA', 8, 1819); +INSERT INTO state VALUES (7, 'MAINE', 8, 1820); +INSERT INTO state VALUES (8, 'MISSOURI', 9, 1821); +INSERT INTO state VALUES (9, 'ARKANSAS', 12, 1836); +INSERT INTO state VALUES (10, 'MICHIGAN', 12, 1837); +INSERT INTO state VALUES (11, 'FLORIDA', 15, 1845); +INSERT INTO state VALUES (12, 'TEXAS', 16, 1845); +INSERT INTO state VALUES (13, 'IOWA', 16, 1846); +INSERT INTO state VALUES (14, 'WISCONSIN', 16, 1848); +INSERT INTO state VALUES (15, 'CALIFORNIA', 18, 1850); +INSERT INTO state VALUES (16, 'MINNESOTA', 20, 1858); +INSERT INTO state VALUES (17, 'OREGON', 20, 1859); +INSERT INTO state VALUES (18, 'KANSAS', 20, 1861); +INSERT INTO state VALUES (19, 'WEST VIRGINIA', 21, 1863); +INSERT INTO state VALUES (20, 'NEVADA', 21, 1864); +INSERT INTO state VALUES (21, 'NEBRASKA', 22, 1867); +INSERT INTO state VALUES (22, 'COLORADO', 25, 1876); +INSERT INTO state VALUES (23, 'NORTH DAKOTA', 30, 1889); +INSERT INTO state VALUES (24, 'SOUTH DAKOTA', 30, 1889); +INSERT INTO state VALUES (25, 'MONTANA', 30, 1889); +INSERT INTO state VALUES (26, 'WASHINGTON', 30, 1889); +INSERT INTO state VALUES (27, 'IDAHO', 30, 1890); +INSERT INTO state VALUES (28, 'WYOMING', 30, 1890); +INSERT INTO state VALUES (29, 'UTAH', 31, 1896); +INSERT INTO state VALUES (30, 'OKLAHOMA', 35, 1907); +INSERT INTO state VALUES (31, 'NEW MEXICO', 36, 1912); +INSERT INTO state VALUES (32, 'ARIZONA', 36, 1912); +INSERT INTO state VALUES (33, 'ALASKA', 50, 1959); +INSERT INTO state VALUES (34, 'HAWAII', 50, 1959); +INSERT INTO state VALUES (35, 'VIRGINIA', 0, 1776); +INSERT INTO state VALUES (36, 'VERMONT', 1, 1791); +INSERT INTO state VALUES (37, 'PENNSYLVANIA', 0, 1776); +INSERT INTO state VALUES (38, 'MASSACHUSETTS', 0, 1776); +INSERT INTO state VALUES (39, 'CONNECTICUT', 0, 1776); +INSERT INTO state VALUES (40, 'SOUTH CAROLINA', 0, 1776); +INSERT INTO state VALUES (41, 'MARYLAND', 0, 1776); +INSERT INTO state VALUES (42, 'NEW JERSEY', 0, 1776); +INSERT INTO state VALUES (43, 'GEORGIA', 0, 1776); +INSERT INTO state VALUES (44, 'NEW HAMPSHIRE', 0, 1776); +INSERT INTO state VALUES (45, 'DELAWARE', 0, 1776); +INSERT INTO state VALUES (46, 'NEW YORK', 0, 1776); +INSERT INTO state VALUES (47, 'NORTH CAROLINA', 0, 1776); +INSERT INTO state VALUES (48, 'RHODE ISLAND', 0, 1776); +INSERT INTO state VALUES (49, 'KENTUCKY', 1, 1792); +INSERT INTO state VALUES (50, 'TENNESSEE', 2, 1796); + +SELECT SETVAL('state_id_seq', (SELECT MAX(id) FROM state), true); + +ALTER TABLE state ENABLE TRIGGER ALL; + +-- +-- Data for Name: admin_vpres; Type: TABLE DATA; Schema: public; Owner: - +-- + +ALTER TABLE admin_vpres DISABLE TRIGGER ALL; + +INSERT INTO admin_vpres VALUES (1, 'ADAMS J'); +INSERT INTO admin_vpres VALUES (2, 'ADAMS J'); +INSERT INTO admin_vpres VALUES (3, 'JEFFERSON T'); +INSERT INTO admin_vpres VALUES (4, 'BURR A'); +INSERT INTO admin_vpres VALUES (5, 'CLINTON G'); +INSERT INTO admin_vpres VALUES (6, 'CLINTON G'); +INSERT INTO admin_vpres VALUES (7, 'GERRRY E'); +INSERT INTO admin_vpres VALUES (8, 'TOMPKINS D'); +INSERT INTO admin_vpres VALUES (9, 'TOMPKINS D'); +INSERT INTO admin_vpres VALUES (10, 'CALHOUN J'); +INSERT INTO admin_vpres VALUES (11, 'CALHOUN J'); +INSERT INTO admin_vpres VALUES (12, 'VAN BUREN M'); +INSERT INTO admin_vpres VALUES (13, 'JOHNSON R M'); +INSERT INTO admin_vpres VALUES (14, 'TYLER J'); +INSERT INTO admin_vpres VALUES (16, 'DALLAS J M'); +INSERT INTO admin_vpres VALUES (17, 'FILLMORE M'); +INSERT INTO admin_vpres VALUES (19, 'DE VANE KING W R'); +INSERT INTO admin_vpres VALUES (20, 'BRECKINRIDGE J C'); +INSERT INTO admin_vpres VALUES (21, 'HAMLIN H'); +INSERT INTO admin_vpres VALUES (22, 'JOHNSON A'); +INSERT INTO admin_vpres VALUES (24, 'COLFAX S'); +INSERT INTO admin_vpres VALUES (25, 'WILSON H'); +INSERT INTO admin_vpres VALUES (26, 'WHEELER W'); +INSERT INTO admin_vpres VALUES (27, 'ARTHUR C A'); +INSERT INTO admin_vpres VALUES (29, 'HENDRICKS T A'); +INSERT INTO admin_vpres VALUES (30, 'MORTON L P'); +INSERT INTO admin_vpres VALUES (31, 'STEVENSON A E'); +INSERT INTO admin_vpres VALUES (32, 'HOBART G A'); +INSERT INTO admin_vpres VALUES (33, 'ROOSEVELT T'); +INSERT INTO admin_vpres VALUES (35, 'FAIRBANKS C W'); +INSERT INTO admin_vpres VALUES (36, 'SHERMAN J S'); +INSERT INTO admin_vpres VALUES (37, 'MARSHALL T R'); +INSERT INTO admin_vpres VALUES (38, 'MARSHALL T R'); +INSERT INTO admin_vpres VALUES (39, 'COOLIDGE C'); +INSERT INTO admin_vpres VALUES (41, 'DAWES C G'); +INSERT INTO admin_vpres VALUES (42, 'CURTIS C'); +INSERT INTO admin_vpres VALUES (43, 'GARNER J N'); +INSERT INTO admin_vpres VALUES (44, 'GARNER J N'); +INSERT INTO admin_vpres VALUES (45, 'WALLACE H A'); +INSERT INTO admin_vpres VALUES (46, 'TRUMAN H S'); +INSERT INTO admin_vpres VALUES (48, 'BARKLEY A W'); +INSERT INTO admin_vpres VALUES (49, 'NIXON R M'); +INSERT INTO admin_vpres VALUES (50, 'NIXON R M'); +INSERT INTO admin_vpres VALUES (51, 'JOHNSON L B'); +INSERT INTO admin_vpres VALUES (53, 'HUMPHREY H H'); +INSERT INTO admin_vpres VALUES (54, 'AGNEW S T'); +INSERT INTO admin_vpres VALUES (55, 'AGNEW S T'); +INSERT INTO admin_vpres VALUES (55, 'FORD G R'); +INSERT INTO admin_vpres VALUES (56, 'ROCKEFELLER N A'); +INSERT INTO admin_vpres VALUES (57, 'MONDALE W F'); +INSERT INTO admin_vpres VALUES (58, 'BUSH G H W'); +INSERT INTO admin_vpres VALUES (59, 'BUSH G H W'); +INSERT INTO admin_vpres VALUES (60, 'QUAYLE D'); +INSERT INTO admin_vpres VALUES (61, 'GORE A'); +INSERT INTO admin_vpres VALUES (62, 'GORE A'); +INSERT INTO admin_vpres VALUES (63, 'CHENEY D'); +INSERT INTO admin_vpres VALUES (64, 'CHENEY D'); +INSERT INTO admin_vpres VALUES (65, 'BIDEN J'); +INSERT INTO admin_vpres VALUES (66, 'BIDEN J'); +INSERT INTO admin_vpres VALUES (67, 'PENCE M R'); + + +ALTER TABLE admin_vpres ENABLE TRIGGER ALL; + +-- +-- Data for Name: pres_hobby; Type: TABLE DATA; Schema: public; Owner: - +-- + +ALTER TABLE pres_hobby DISABLE TRIGGER ALL; + +INSERT INTO pres_hobby VALUES (6, 'BILLIARDS'); +INSERT INTO pres_hobby VALUES (6, 'SWIMMING'); +INSERT INTO pres_hobby VALUES (21, 'FISHING'); +INSERT INTO pres_hobby VALUES (22, 'FISHING'); +INSERT INTO pres_hobby VALUES (29, 'FISHING'); +INSERT INTO pres_hobby VALUES (29, 'GOLF'); +INSERT INTO pres_hobby VALUES (29, 'INDIAN CLUBS'); +INSERT INTO pres_hobby VALUES (29, 'MECH. HORS'); +INSERT INTO pres_hobby VALUES (29, 'PITCHING HAY'); +INSERT INTO pres_hobby VALUES (33, 'BRIDGE'); +INSERT INTO pres_hobby VALUES (33, 'GOLF'); +INSERT INTO pres_hobby VALUES (33, 'HUNTING'); +INSERT INTO pres_hobby VALUES (33, 'PAINTING'); +INSERT INTO pres_hobby VALUES (33, 'FISHING'); +INSERT INTO pres_hobby VALUES (20, 'BILLIARDS'); +INSERT INTO pres_hobby VALUES (28, 'GOLF'); +INSERT INTO pres_hobby VALUES (28, 'POKER'); +INSERT INTO pres_hobby VALUES (28, 'RIDING'); +INSERT INTO pres_hobby VALUES (23, 'HUNTING'); +INSERT INTO pres_hobby VALUES (19, 'CROQUET'); +INSERT INTO pres_hobby VALUES (19, 'DRIVING'); +INSERT INTO pres_hobby VALUES (19, 'SHOOTING'); +INSERT INTO pres_hobby VALUES (30, 'FISHING'); +INSERT INTO pres_hobby VALUES (30, 'MEDICINE BALL'); +INSERT INTO pres_hobby VALUES (7, 'RIDING'); +INSERT INTO pres_hobby VALUES (3, 'FISHING'); +INSERT INTO pres_hobby VALUES (3, 'RIDING'); +INSERT INTO pres_hobby VALUES (35, 'RIDING'); +INSERT INTO pres_hobby VALUES (34, 'SAILING'); +INSERT INTO pres_hobby VALUES (34, 'SWIMMING'); +INSERT INTO pres_hobby VALUES (34, 'TOUCH FOOTBALL'); +INSERT INTO pres_hobby VALUES (16, 'WALKING'); +INSERT INTO pres_hobby VALUES (24, 'RIDING'); +INSERT INTO pres_hobby VALUES (24, 'SWIMMING'); +INSERT INTO pres_hobby VALUES (24, 'WALKING'); +INSERT INTO pres_hobby VALUES (36, 'GOLF'); +INSERT INTO pres_hobby VALUES (31, 'FISHING'); +INSERT INTO pres_hobby VALUES (31, 'SAILING'); +INSERT INTO pres_hobby VALUES (31, 'SWIMMING'); +INSERT INTO pres_hobby VALUES (25, 'BOXING'); +INSERT INTO pres_hobby VALUES (25, 'HUNTING'); +INSERT INTO pres_hobby VALUES (25, 'JUJITSU'); +INSERT INTO pres_hobby VALUES (25, 'RIDING'); +INSERT INTO pres_hobby VALUES (25, 'SHOOTING'); +INSERT INTO pres_hobby VALUES (25, 'TENNIS'); +INSERT INTO pres_hobby VALUES (25, 'WRESTLING'); +INSERT INTO pres_hobby VALUES (26, 'GOLF'); +INSERT INTO pres_hobby VALUES (26, 'RIDING'); +INSERT INTO pres_hobby VALUES (12, 'RIDING'); +INSERT INTO pres_hobby VALUES (32, 'FISHING'); +INSERT INTO pres_hobby VALUES (32, 'POKER'); +INSERT INTO pres_hobby VALUES (32, 'WALKING'); +INSERT INTO pres_hobby VALUES (8, 'RIDING'); +INSERT INTO pres_hobby VALUES (1, 'FISHING'); +INSERT INTO pres_hobby VALUES (1, 'RIDING'); +INSERT INTO pres_hobby VALUES (27, 'GOLF'); +INSERT INTO pres_hobby VALUES (27, 'RIDING'); +INSERT INTO pres_hobby VALUES (27, 'WALKING'); +INSERT INTO pres_hobby VALUES (6, 'WALKING'); +INSERT INTO pres_hobby VALUES (40, 'GOLF'); +INSERT INTO pres_hobby VALUES (43, 'COIKING'); +INSERT INTO pres_hobby VALUES (43, 'BASKETBALL'); +INSERT INTO pres_hobby VALUES (43, 'DANCING'); +INSERT INTO pres_hobby VALUES (41, 'PLAYING SAXOPHONE'); +INSERT INTO pres_hobby VALUES (42, 'FISHING'); +INSERT INTO pres_hobby VALUES (42, 'JOGGING'); +INSERT INTO pres_hobby VALUES (39, 'FISHING'); +INSERT INTO pres_hobby VALUES (44, 'GOLF'); + + +ALTER TABLE pres_hobby ENABLE TRIGGER ALL; + +-- +-- Data for Name: pres_marriage; Type: TABLE DATA; Schema: public; Owner: - +-- + +ALTER TABLE pres_marriage DISABLE TRIGGER ALL; + +INSERT INTO pres_marriage VALUES (1, 'CUSTIS M D', 27, 0, 1759); +INSERT INTO pres_marriage VALUES (2, 'SMITH A', 19, 5,1764); +INSERT INTO pres_marriage VALUES (3, 'SKELTON M W', 23, 6, 1772); +INSERT INTO pres_marriage VALUES (4, 'TODD D D P', 26, 0, 1794); +INSERT INTO pres_marriage VALUES (5, 'KORTRIGHT E', 17, 3, 1786); +INSERT INTO pres_marriage VALUES (6, 'JOHNSON L C', 22, 4, 1797); +INSERT INTO pres_marriage VALUES (7, 'ROBARDS R D', 26, 0, 1794); +INSERT INTO pres_marriage VALUES (8, 'HOOS H', 23, 4, 1807); +INSERT INTO pres_marriage VALUES (9, 'SYMMES A T', 20, 10, 1795); +INSERT INTO pres_marriage VALUES (10, 'CHRISTIAN L', 22, 8, 1813); +INSERT INTO pres_marriage VALUES (10, 'GARDINER J', 24, 7, 1844); +INSERT INTO pres_marriage VALUES (11, 'CHILDRESS S', 20, 0, 1824); +INSERT INTO pres_marriage VALUES (12, 'SMITH M M', 21, 6, 1810); +INSERT INTO pres_marriage VALUES (13, 'POWERS A', 27, 2, 1826); +INSERT INTO pres_marriage VALUES (13, 'MCINTOSH C C', 44, 0, 1858); +INSERT INTO pres_marriage VALUES (14, 'APPLETON J M', 28, 3, 1834); +INSERT INTO pres_marriage VALUES (16, 'TODD M', 23, 4, 1842); +INSERT INTO pres_marriage VALUES (17, 'MCCARDLE E', 16, 5, 1827); +INSERT INTO pres_marriage VALUES (18, 'DENT J B', 22, 4, 1848); +INSERT INTO pres_marriage VALUES (19, 'WEBB L W', 21, 8, 1852); +INSERT INTO pres_marriage VALUES (20, 'RUDOLPH L', 26, 7, 1858); +INSERT INTO pres_marriage VALUES (21, 'HERNDON E L', 22, 3, 1859); +INSERT INTO pres_marriage VALUES (22, 'FOLSON F', 21, 5, 1886); +INSERT INTO pres_marriage VALUES (23, 'SCOTT C L', 31, 2, 1853); +INSERT INTO pres_marriage VALUES (23, 'DIMMICK M S L', 37, 1, 1896); +INSERT INTO pres_marriage VALUES (24, 'SAXTON I', 23, 2, 1871); +INSERT INTO pres_marriage VALUES (25, 'LEE A H', 19, 1, 1880); +INSERT INTO pres_marriage VALUES (25, 'CARROW E K', 25, 5, 1886); +INSERT INTO pres_marriage VALUES (26, 'HERRON H', 25, 3, 1886); +INSERT INTO pres_marriage VALUES (27, 'AXSON E L', 25, 3, 1885); +INSERT INTO pres_marriage VALUES (27, 'GALT E B', 43, 0, 1915); +INSERT INTO pres_marriage VALUES (28, 'DE WOLFE F K', 30, 0, 1891); +INSERT INTO pres_marriage VALUES (29, 'GOODHUE G A', 26, 2, 1905); +INSERT INTO pres_marriage VALUES (30, 'HENRY L', 23, 2, 1899); +INSERT INTO pres_marriage VALUES (31, 'ROOSEVELT A E', 20, 6, 1905); +INSERT INTO pres_marriage VALUES (32, 'WALLACE E V', 34, 1, 1919); +INSERT INTO pres_marriage VALUES (33, 'DOUD G', 19, 2, 1916); +INSERT INTO pres_marriage VALUES (34, 'BOUVIER J L', 24, 3, 1953); +INSERT INTO pres_marriage VALUES (35, 'TAYLOR C A', 21, 2, 1934); +INSERT INTO pres_marriage VALUES (36, 'RYAN T C', 28, 2, 1940); +INSERT INTO pres_marriage VALUES (37, 'WARREN E B', 30, 4, 1948); +INSERT INTO pres_marriage VALUES (38, 'SMITH R', 18, 4, 1946); +INSERT INTO pres_marriage VALUES (40, 'WYMAN J', 25, 2, 1940); +INSERT INTO pres_marriage VALUES (40, 'DAVIS N', 28, 2, 1952); +INSERT INTO pres_marriage VALUES (39, 'PIERCE B', 20, 6, 1945); +INSERT INTO pres_marriage VALUES (42, 'WELCH L L', 31, 2, 1977); +INSERT INTO pres_marriage VALUES (43, 'ROBINSON M', 28, 2, 1992); +INSERT INTO pres_marriage VALUES (41, 'RODHAM H', 28, 1, 1975); +INSERT INTO pres_marriage VALUES (44, 'ZELNICKOVA I', 28, 3, 1977); +INSERT INTO pres_marriage VALUES (44, 'MAPLES M', 30, 1, 1993); +INSERT INTO pres_marriage VALUES (44, 'KNAUSS M', 34, 1, 2005); + +ALTER TABLE pres_marriage ENABLE TRIGGER ALL; + +-- +-- Data for Name: election; Type: TABLE DATA; Schema: public; Owner: - +-- + +ALTER TABLE election DISABLE TRIGGER ALL; + +INSERT INTO election VALUES (1789, 'WASHINGTON G', 69, 'W'); +INSERT INTO election VALUES (1789, 'ADAMS J', 34, 'L'); +INSERT INTO election VALUES (1789, 'JAY J', 9, 'L'); +INSERT INTO election VALUES (1789, 'HARRISON R H', 6, 'L'); +INSERT INTO election VALUES (1789, 'RUTLEDGE J', 6, 'L'); +INSERT INTO election VALUES (1789, 'HANCOCK J', 4, 'L'); +INSERT INTO election VALUES (1789, 'CLINTON G', 3, 'L'); +INSERT INTO election VALUES (1789, 'HUNTINGTON S', 2, 'L'); +INSERT INTO election VALUES (1789, 'MILTON J', 2, 'L'); +INSERT INTO election VALUES (1789, 'ARMSTRONG', 1, 'L'); +INSERT INTO election VALUES (1789, 'LINCOLN B', 1, 'L'); +INSERT INTO election VALUES (1789, 'TOLFAIR I', 1, 'L'); +INSERT INTO election VALUES (1792, 'ADAMS J', 77, 'L'); +INSERT INTO election VALUES (1792, 'CLINTON G', 50, 'L'); +INSERT INTO election VALUES (1792, 'JEFFERSON T', 4, 'L'); +INSERT INTO election VALUES (1796, 'PINCKNEY T', 59, 'L'); +INSERT INTO election VALUES (1792, 'BURR A', 1, 'L'); +INSERT INTO election VALUES (1796, 'ADAMS J', 71, 'W'); +INSERT INTO election VALUES (1796, 'JEFFERSON T', 68, 'L'); +INSERT INTO election VALUES (1796, 'BURR A', 30, 'L'); +INSERT INTO election VALUES (1796, 'CLINTON G', 7, 'L'); +INSERT INTO election VALUES (1796, 'JAY J', 5, 'L'); +INSERT INTO election VALUES (1796, 'IREDELL J', 3, 'L'); +INSERT INTO election VALUES (1796, 'HENRY J', 2, 'L'); +INSERT INTO election VALUES (1796, 'JOHNSON S', 2, 'L'); +INSERT INTO election VALUES (1796, 'WASHINGTON G', 2, 'L'); +INSERT INTO election VALUES (1796, 'PINCKNEY C C', 1, 'L'); +INSERT INTO election VALUES (1792, 'WASHINGTON G', 132, 'W'); +INSERT INTO election VALUES (1796, 'ADAMS S', 15, 'L'); +INSERT INTO election VALUES (1796, 'ELLSWORTH O', 11, 'L'); +INSERT INTO election VALUES (1800, 'JEFFERSON T', 73, 'W'); +INSERT INTO election VALUES (1800, 'BURR A', 73, 'L'); +INSERT INTO election VALUES (1800, 'ADAMS J', 65, 'L'); +INSERT INTO election VALUES (1800, 'JAY J', 1, 'L'); +INSERT INTO election VALUES (1804, 'JEFFERSON T', 162, 'W'); +INSERT INTO election VALUES (1804, 'PINCKNEY C C', 14, 'L'); +INSERT INTO election VALUES (1800, 'PINCKNEY C C', 64, 'L'); +INSERT INTO election VALUES (1808, 'MADISON J', 122, 'W'); +INSERT INTO election VALUES (1808, 'PINCKNEY C C', 47, 'L'); +INSERT INTO election VALUES (1808, 'CLINTON G', 6, 'L'); +INSERT INTO election VALUES (1812, 'MADISON J', 128, 'W'); +INSERT INTO election VALUES (1812, 'CLINTON G', 89, 'L'); +INSERT INTO election VALUES (1816, 'MONROE J', 183, 'W'); +INSERT INTO election VALUES (1816, 'KING R', 34, 'L'); +INSERT INTO election VALUES (1820, 'MONROE J', 231, 'W'); +INSERT INTO election VALUES (1820, 'ADAMS J Q', 1, 'L'); +INSERT INTO election VALUES (1824, 'ADAMS J Q', 99, 'W'); +INSERT INTO election VALUES (1824, 'JACKSON A', 84, 'L'); +INSERT INTO election VALUES (1824, 'CRAWFORD W H', 41, 'L'); +INSERT INTO election VALUES (1824, 'CLAY H', 37, 'L'); +INSERT INTO election VALUES (1828, 'JACKSON A', 178, 'W'); +INSERT INTO election VALUES (1828, 'ADAMS J', 83, 'L'); +INSERT INTO election VALUES (1832, 'JACKSON A', 219, 'W'); +INSERT INTO election VALUES (1832, 'CLAY H', 49, 'L'); +INSERT INTO election VALUES (1832, 'FLOYD J', 11, 'L'); +INSERT INTO election VALUES (1832, 'WIRT W', 7, 'L'); +INSERT INTO election VALUES (1836, 'VAN BUREN M', 170, 'W'); +INSERT INTO election VALUES (1836, 'HARRISON W H', 73, 'L'); +INSERT INTO election VALUES (1836, 'WHITE H L', 26, 'L'); +INSERT INTO election VALUES (1836, 'WEBSTER D', 14, 'L'); +INSERT INTO election VALUES (1836, 'MANGUM W P', 11, 'L'); +INSERT INTO election VALUES (1840, 'HARRISON W H', 234, 'W'); +INSERT INTO election VALUES (1840, 'VAN BUREN M', 60, 'L'); +INSERT INTO election VALUES (1844, 'POLK J K', 170, 'W'); +INSERT INTO election VALUES (1844, 'CLAY H', 105, 'L'); +INSERT INTO election VALUES (1848, 'TAYLOR Z', 163, 'W'); +INSERT INTO election VALUES (1848, 'CASS L', 126, 'L'); +INSERT INTO election VALUES (1852, 'PIERCE F', 254, 'W'); +INSERT INTO election VALUES (1852, 'SCOTT W', 42, 'L'); +INSERT INTO election VALUES (1856, 'BUCHANAN J', 174, 'W'); +INSERT INTO election VALUES (1856, 'FREMONT J C', 114, 'L'); +INSERT INTO election VALUES (1856, 'FILLMORE M', 8, 'L'); +INSERT INTO election VALUES (1860, 'LINCOLN A', 180, 'W'); +INSERT INTO election VALUES (1860, 'BRECKINRIDGE J C', 72, 'L'); +INSERT INTO election VALUES (1860, 'BELL J', 39, 'L'); +INSERT INTO election VALUES (1860, 'DOUGLAS S', 12, 'L'); +INSERT INTO election VALUES (1864, 'LINCOLN A', 212, 'W'); +INSERT INTO election VALUES (1864, 'MCCLELLAN G B', 21, 'L'); +INSERT INTO election VALUES (1868, 'GRANT U S', 214, 'W'); +INSERT INTO election VALUES (1868, 'SEYMOUR H', 80, 'L'); +INSERT INTO election VALUES (1872, 'GRANT U S', 286, 'W'); +INSERT INTO election VALUES (1872, 'HENDRICKS T A', 42, 'L'); +INSERT INTO election VALUES (1872, 'BROWN B G', 18, 'L'); +INSERT INTO election VALUES (1872, 'JENKINS C J', 2, 'L'); +INSERT INTO election VALUES (1872, 'DAVIS D', 1, 'L'); +INSERT INTO election VALUES (1876, 'HAYES R B', 185, 'W'); +INSERT INTO election VALUES (1876, 'TILDEN R B', 184, 'L'); +INSERT INTO election VALUES (1880, 'GARFIELD J A', 214, 'W'); +INSERT INTO election VALUES (1880, 'HANCOCK W S', 155, 'L'); +INSERT INTO election VALUES (1884, 'CLEVELAND G', 219, 'W'); +INSERT INTO election VALUES (1884, 'BLAINE J G', 182, 'L'); +INSERT INTO election VALUES (1888, 'HARRISON B', 233, 'W'); +INSERT INTO election VALUES (1888, 'CLEVELAND G', 168, 'L'); +INSERT INTO election VALUES (1892, 'CLEVELAND G', 277, 'W'); +INSERT INTO election VALUES (1892, 'HARRISON B', 145, 'L'); +INSERT INTO election VALUES (1892, 'WEAVER J B', 22, 'L'); +INSERT INTO election VALUES (1896, 'MCKINLEY W', 271, 'W'); +INSERT INTO election VALUES (1896, 'BRYAN W J', 176, 'L'); +INSERT INTO election VALUES (1900, 'MCKINLEY W', 292, 'W'); +INSERT INTO election VALUES (1900, 'BRYAN W J', 155, 'L'); +INSERT INTO election VALUES (1904, 'ROOSEVELT T', 336, 'W'); +INSERT INTO election VALUES (1904, 'PARKER E B', 140, 'L'); +INSERT INTO election VALUES (1908, 'TAFT W H', 321, 'W'); +INSERT INTO election VALUES (1908, 'BRYAN W J', 162, 'L'); +INSERT INTO election VALUES (1912, 'WILSON W', 435, 'W'); +INSERT INTO election VALUES (1912, 'ROOSEVELT T', 88, 'L'); +INSERT INTO election VALUES (1912, 'TAFT W H', 8, 'L'); +INSERT INTO election VALUES (1916, 'WILSON W', 277, 'W'); +INSERT INTO election VALUES (1916, 'HUGHES C E', 254, 'L'); +INSERT INTO election VALUES (1920, 'HARDING W G', 404, 'W'); +INSERT INTO election VALUES (1920, 'COX W W', 127, 'L'); +INSERT INTO election VALUES (1924, 'COOLIDGE C', 382, 'W'); +INSERT INTO election VALUES (1924, 'DAVIS J W', 136, 'L'); +INSERT INTO election VALUES (1924, 'LA FOLLETTE R M', 13, 'L'); +INSERT INTO election VALUES (1928, 'HOOVER H C', 444, 'W'); +INSERT INTO election VALUES (1928, 'SMITH A E', 87, 'L'); +INSERT INTO election VALUES (1932, 'ROOSEVELT F D', 472, 'W'); +INSERT INTO election VALUES (1932, 'HOOVER H C', 49, 'L'); +INSERT INTO election VALUES (1936, 'ROOSEVELT F D', 523, 'W'); +INSERT INTO election VALUES (1936, 'LANDON A M', 8, 'L'); +INSERT INTO election VALUES (1940, 'ROOSEVELT F D', 449, 'W'); +INSERT INTO election VALUES (1940, 'WILKIE W L', 82, 'L'); +INSERT INTO election VALUES (1944, 'ROOSEVELT F D', 432, 'W'); +INSERT INTO election VALUES (1944, 'DEWEY T E', 99, 'L'); +INSERT INTO election VALUES (1948, 'TRUMAN H S', 303, 'W'); +INSERT INTO election VALUES (1948, 'DEWEY T E', 189, 'L'); +INSERT INTO election VALUES (1948, 'THURMOND J S', 39, 'L'); +INSERT INTO election VALUES (1952, 'EISENHOWER D D', 442, 'W'); +INSERT INTO election VALUES (1952, 'STEVENSON A E', 89, 'L'); +INSERT INTO election VALUES (1956, 'EISENHOWER D D', 457, 'W'); +INSERT INTO election VALUES (1956, 'STEVENSON A E', 73, 'L'); +INSERT INTO election VALUES (1956, 'JONES W B', 1, 'L'); +INSERT INTO election VALUES (1960, 'KENNEDY J F', 303, 'W'); +INSERT INTO election VALUES (1960, 'NIXON R M', 219, 'L'); +INSERT INTO election VALUES (1960, 'BYRD', 15, 'L'); +INSERT INTO election VALUES (1964, 'JOHNSON L B', 486, 'W'); +INSERT INTO election VALUES (1964, 'GOLDWATER B', 52, 'L'); +INSERT INTO election VALUES (1968, 'NIXON R M', 301, 'W'); +INSERT INTO election VALUES (1968, 'HUMPHREY H H', 191, 'L'); +INSERT INTO election VALUES (1968, 'WALLACE G C', 46, 'L'); +INSERT INTO election VALUES (1972, 'NIXON R M', 520, 'W'); +INSERT INTO election VALUES (1972, 'MCGOVERN G S', 17, 'L'); +INSERT INTO election VALUES (1972, 'HOSPERS J', 1, 'L'); +INSERT INTO election VALUES (1976, 'CARTER J M', 297, 'W'); +INSERT INTO election VALUES (1976, 'FORD G R', 240, 'L'); +INSERT INTO election VALUES (1980, 'CARTER J M', 49, 'L'); +INSERT INTO election VALUES (1980, 'REAGAN R', 489, 'W'); +INSERT INTO election VALUES (1988, 'BUSH G H W', 426, 'W'); +INSERT INTO election VALUES (1988, 'DUKAKIS M', 111, 'L'); +INSERT INTO election VALUES (1992, 'CLINTON W J', 370, 'W'); +INSERT INTO election VALUES (1992, 'BUSH G H W', 168, 'L'); +INSERT INTO election VALUES (1996, 'CLINTON W J', 379, 'W'); +INSERT INTO election VALUES (1996, 'DOLE B', 159, 'L'); +INSERT INTO election VALUES (2000, 'BUSH G W', 271, 'W'); +INSERT INTO election VALUES (2000, 'GORE A', 266, 'L'); +INSERT INTO election VALUES (2004, 'BUSH G W', 286, 'W'); +INSERT INTO election VALUES (2004, 'KERRY J', 251, 'L'); +INSERT INTO election VALUES (2008, 'OBAMA B', 365, 'W'); +INSERT INTO election VALUES (2008, 'MCCAIN J', 173, 'L'); +INSERT INTO election VALUES (2012, 'OBAMA B', 332, 'W'); +INSERT INTO election VALUES (2012, 'ROMNEY M', 206, 'L'); +INSERT INTO election VALUES (2016, 'TRUMP D J', 304, 'W'); +INSERT INTO election VALUES (2016, 'CLINTON H D R', 227, 'L'); + + + +ALTER TABLE election ENABLE TRIGGER ALL; + +commit; diff --git a/topics/code/simplejdbc/src/main/resources/sql/president_schema.sql b/topics/code/simplejdbc/src/main/resources/sql/president_schema.sql new file mode 100644 index 0000000..5a49da4 --- /dev/null +++ b/topics/code/simplejdbc/src/main/resources/sql/president_schema.sql @@ -0,0 +1,187 @@ +begin work; +-- +-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - +-- + +CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; +COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; + +-- to enable functions like crosstab +CREATE EXTENSION IF NOT EXISTS tablefunc; + +-- +-- Name: admin_vpres; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- + +CREATE TABLE admin_vpres ( + admin_id integer NOT NULL, + vice_pres_name character varying(20) NOT NULL +); +COMMENT ON TABLE admin_vpres IS 'President and vice president'; + +ALTER TABLE ONLY admin_vpres + ADD CONSTRAINT prim_key_admvp PRIMARY KEY (admin_id, vice_pres_name); + +-- +-- Name: administration; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- + +CREATE TABLE administration ( + id SERIAL, + admin_nr integer NOT NULL, + pres_id integer NOT NULL, + year_inaugurated integer, + CONSTRAINT check_year_inaug CHECK (((year_inaugurated >= 1600) AND (year_inaugurated <= 2100))) +); + +ALTER TABLE ONLY administration + ADD CONSTRAINT prim_key_adm PRIMARY KEY (id); + +COMMENT ON TABLE administration IS 'Name of president, administration number and year of inauguration'; + +CREATE UNIQUE INDEX iAdminNrpresid ON administration(admin_nr,pres_id); + + +-- +-- Name: election; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- +CREATE TABLE election ( + election_year integer NOT NULL, + candidate character varying(20) NOT NULL, + votes integer, + winner_loser_indic character(1), + CONSTRAINT check_election_year CHECK (((election_year >= 1600) AND (election_year <= 2100))), + CONSTRAINT check_votes CHECK ((votes > 0)), + CONSTRAINT check_winner_loser_indic CHECK (((winner_loser_indic = 'W'::bpchar) OR (winner_loser_indic = 'L'::bpchar))) +); + +COMMENT ON TABLE election IS 'Election year, vote count (electoral vote, by delegate), won or lost'; + +ALTER TABLE ONLY election + ADD CONSTRAINT prim_key_elec PRIMARY KEY (election_year, candidate); + +-- +-- Name: pres_hobby; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- + +CREATE TABLE pres_hobby ( + pres_id integer NOT NULL, + hobby character varying(20) NOT NULL +); + +COMMENT ON TABLE pres_hobby IS 'Hobby of the president'; + +ALTER TABLE ONLY pres_hobby + ADD CONSTRAINT prim_key_hobby PRIMARY KEY (pres_id, hobby); + + + +-- +-- Name: pres_marriage; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- +CREATE TABLE pres_marriage ( + pres_id integer NOT NULL, + spouse_name character varying(20) NOT NULL, + spouse_age smallint, + nr_children smallint, + marriage_year integer, + CONSTRAINT check_marriage_year CHECK (((marriage_year >= 1600) AND (marriage_year <= 2100))), + CONSTRAINT check_spouse_age CHECK ((spouse_age > 15)) +); + +COMMENT ON TABLE pres_marriage IS 'Marriage, spouce name, year of marriage, age of man and wife, nr of children.'; + +ALTER TABLE ONLY pres_marriage + ADD CONSTRAINT prim_key_presmar PRIMARY KEY (pres_id, spouse_name); + + +-- +-- Name: president; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- + +CREATE TABLE president ( + id SERIAL, + name character varying(20) NOT NULL , + birth_year integer, + years_served smallint, + death_age smallint, + party character varying(10), + state_id_born integer, + CONSTRAINT check_birth_year CHECK (((birth_year >= 1600) AND (birth_year <= 2100))), + CONSTRAINT check_death_age CHECK (((death_age > 20) OR (death_age IS NULL))) +); +COMMENT ON TABLE president IS 'President name, birth year etc.'; + +ALTER TABLE ONLY president + ADD CONSTRAINT prim_key_pres PRIMARY KEY (id); + + + +-- +-- Name: state; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- + +CREATE TABLE state ( + id SERIAL, + name character varying(15) NOT NULL , + admin_id integer, + year_entered integer, + CONSTRAINT check_year_entered CHECK (((year_entered >= 1600) AND (year_entered <= 2100))) +); + +COMMENT ON TABLE state IS 'States, added in year and under which president.'; + +ALTER TABLE ONLY state + ADD CONSTRAINT prim_key_state PRIMARY KEY (id); + + +-- +-- INDEX +-- +CREATE INDEX iadmin ON administration USING btree (pres_id, year_inaugurated); +CREATE INDEX ipres ON president USING btree (party); + + +-- +-- FOREIGN KEYS +-- + +ALTER TABLE ONLY admin_vpres + ADD CONSTRAINT admin_vpres_fk1 FOREIGN KEY (admin_id) REFERENCES administration(id); + +ALTER TABLE ONLY administration + ADD CONSTRAINT administration_fk1 FOREIGN KEY (pres_id) REFERENCES president(id); + +ALTER TABLE ONLY pres_hobby + ADD CONSTRAINT pres_hobby_fk1 FOREIGN KEY (pres_id) REFERENCES president(id); + +ALTER TABLE ONLY pres_marriage + ADD CONSTRAINT pres_marriage_fk1 FOREIGN KEY (pres_id) REFERENCES president(id); + +ALTER TABLE ONLY president + ADD CONSTRAINT president_fk1 FOREIGN KEY (state_id_born) REFERENCES state(id); + +ALTER TABLE ONLY state + ADD CONSTRAINT state_fk1 FOREIGN KEY (admin_id) REFERENCES administration(id); + + + CREATE VIEW recent_presidents AS + SELECT p.id, p.name, p.birth_year, p.years_served, p.death_age, p.party, s.name AS state_name + FROM president p + INNER JOIN state s + ON p.state_id_born = s.id + WHERE p.birth_year > 1880; + + COMMENT ON VIEW recent_presidents IS 'Presidents born since 1880.'; + + +-- +-- Name: public; Type: ACL; Schema: -; Owner: - +-- + +REVOKE ALL ON SCHEMA public FROM PUBLIC; +REVOKE ALL ON SCHEMA public FROM postgres; +GRANT ALL ON SCHEMA public TO postgres; +GRANT ALL ON SCHEMA public TO PUBLIC; + +commit; diff --git a/topics/code/simplejdbc/src/main/resources/sql/students.sql b/topics/code/simplejdbc/src/main/resources/sql/students.sql index 65b40c2..a2f5f29 100644 --- a/topics/code/simplejdbc/src/main/resources/sql/students.sql +++ b/topics/code/simplejdbc/src/main/resources/sql/students.sql @@ -2,7 +2,7 @@ begin work; drop table if exists students; CREATE TABLE students ( - student_id SERIAL PRIMARY KEY, + student_id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, firstname TEXT NOT NULL, lastname TEXT NOT NULL, dob DATE NOT NULL, diff --git a/topics/code/simplejdbc/src/test/java/simplejdbc/DataSourceUseTest.java b/topics/code/simplejdbc/src/test/java/simplejdbc/DataSourceUseTest.java index d12ad0f..6de86a8 100644 --- a/topics/code/simplejdbc/src/test/java/simplejdbc/DataSourceUseTest.java +++ b/topics/code/simplejdbc/src/test/java/simplejdbc/DataSourceUseTest.java @@ -1,23 +1,9 @@ package simplejdbc; import java.io.IOException; -import java.io.PrintStream; -import java.nio.file.Path; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.SQLException; -import java.util.Arrays; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.stream.Stream; -import javax.sql.DataSource; -import nl.fontys.sebivenlo.csvobjectstream.CSVObjectStream; -import static org.assertj.core.api.Java6Assertions.assertThat; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; /** @@ -26,52 +12,14 @@ */ @ExtendWith( MockitoExtension.class ) public class DataSourceUseTest { - - @Mock - PrintStream out; //@Disabled("Think TDD") + @DisplayName("Test that my data source is available for the demo") @Test - public void tInstertStudents() throws IOException { - - Stream studs = new CSVObjectStream( Path.of( "students.csv" ) ) - .stream( Student::fromArray, a -> a[0].matches( "\\d+" ) ); - String sql = "insert into students (student_id,firstname,lastname,dob,cohort,email,gender,student_grp,active)\n" - + "values( ?, ?, ?, ?, ?, ?, ?, ?, ?)"; - - DataSource ds = PgJDBCUtils.getDataSource( "jdbc.pg.fontys" ); - - try ( Connection con = ds.getConnection(); - PreparedStatement pst = con.prepareStatement( sql ); ) { - con.setAutoCommit( false ); - studs.forEach( s -> { - int col = 1; - for ( Object object : s.asArray() ) { - setObject( pst, col, object ); - } - } ); - - int[] executeBatch = pst.executeBatch(); - System.out.println( "executeBatch = " + Arrays.toString( executeBatch )); - con.commit(); - } catch ( SQLException ex ) { - Logger.getLogger( DataSourceUseTest.class.getName() ).log( Level.SEVERE, null, ex ); - } - - StudentDemo sd = new StudentDemo( ds, out ); - - List list = sd.listAll(); - assertThat( list ).hasSize( 100 ); - - fail( "tInstertStudents completed succesfully; you know what to do" ); - } - - void setObject( final PreparedStatement pst, int col, Object object ) { - try { - pst.setObject( col++, object ); - pst.addBatch(); - } catch ( SQLException ex ) { - Logger.getLogger( DataSourceUseTest.class.getName() ).log( Level.SEVERE, null, ex ); - } + public void t1GetDatasource() throws IOException { + + var ds = PgJDBCUtils.getDataSource( "jdbc.pg.dev" ); + +// fail( "tGetDataSource completed succesfully; you know what to do" ); } } diff --git a/topics/code/simplejdbc/src/test/java/simplejdbc/InsertTest.java b/topics/code/simplejdbc/src/test/java/simplejdbc/InsertTest.java new file mode 100644 index 0000000..5c66264 --- /dev/null +++ b/topics/code/simplejdbc/src/test/java/simplejdbc/InsertTest.java @@ -0,0 +1,64 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/UnitTests/JUnit5TestClass.java to edit this template + */ +package simplejdbc; + +//import static org.junit.jupiter.api.Assertions.*; +import java.io.IOException; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; +import static org.assertj.core.api.Assertions.*; +import org.assertj.core.api.ThrowableAssert.ThrowingCallable; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +/** + * + * @author Pieter van den Hombergh {@code } + */ +public class InsertTest { + + public InsertTest() { + } + + //@Disabled("think TDD") + @DisplayName("make sure we can insert a cohort full of students") + @Test + public void insertTest() { + var ds = PgJDBCUtils.getDataSource( "jdbc.pg.dev" ); + StudentDemo demo = new StudentDemo( ds, System.out ); + + ThrowingCallable code = () -> { + try ( Connection conn = ds.getConnection(); ) { + List students = Factories.studentsFromFile( "students.csv" ); + demo.insertStudents( students ); + var stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery( "select count(1) from students" ); + rs.next(); + int count = rs.getInt( 1 ); + System.out.println( "count = " + count ); + assertThat( count ).isGreaterThan( 1 ); + + } + }; + + assertThatCode( code ).doesNotThrowAnyException(); +// fail( "method insert reached end. You know what to do." ); + } + + @AfterEach + public void cleanup() throws SQLException, IOException { + System.out.println( "cleaning up afterwards "); + var ds = PgJDBCUtils.getDataSource( "jdbc.pg.dev" ); + try ( Connection conn = ds.getConnection(); ) { + conn.setAutoCommit( false); + conn.createStatement().execute( "truncate students" ); + conn.commit(); + } + } + +} diff --git a/topics/code/simplejdbc/src/test/java/simplejdbc/PgConfigTest.java b/topics/code/simplejdbc/src/test/java/simplejdbc/PgConfigTest.java new file mode 100644 index 0000000..1956fc1 --- /dev/null +++ b/topics/code/simplejdbc/src/test/java/simplejdbc/PgConfigTest.java @@ -0,0 +1,72 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/UnitTests/JUnit5TestClass.java to edit this template + */ +package simplejdbc; + +import org.junit.jupiter.api.Test; +//import static org.junit.jupiter.api.Assertions.*; +import static org.assertj.core.api.Assertions.*; +import org.junit.jupiter.api.DisplayName; +import org.assertj.core.api.ThrowableAssert.ThrowingCallable; +/** + * + * @author Pieter van den Hombergh {@code } + */ +public class PgConfigTest { + + public PgConfigTest() { + } +//@Disabled("think TDD") + + @Test + public void testConfig() { + + PgConfig cfg = PgConfig.getConfigForPrefix( "jdbc.pg.dev" ); + cfg = PgConfig.getConfigForPrefix( "jdbc.pg.dev" ); + + assertThat( cfg.dbname() ).isNotNull(); + assertThat( cfg.user() ).isNotNull(); + assertThat( cfg.ports() ).isNotNull(); + assertThat( cfg.password() ).isNotNull(); +// fail( "method method reached end. You know what to do." ); + } + + @Test + public void testConfigPres() { + + PgConfig cfg = PgConfig.getConfigForPrefix( "jdbc.pg.presidents" ); + cfg = PgConfig.getConfigForPrefix( "jdbc.pg.presidents" ); + + assertThat( cfg.dbname() ).isNotNull(); + assertThat( cfg.user() ).isNotNull(); + assertThat( cfg.ports() ).isNotNull(); + assertThat( cfg.password() ).isNotNull(); +// fail( "method method reached end. You know what to do." ); + } + + @Test + public void testConfigProd() { + + PgConfig cfg = PgConfig.getConfigForPrefix( "jdbc.pg.prod" ); + + assertThat( cfg.dbname() ).isNotNull(); + assertThat( cfg.user() ).isNotNull(); + assertThat( cfg.ports() ).isNotNull(); + assertThat( cfg.password() ).isNotNull(); +// fail( "method method reached end. You know what to do." ); + } + + + //@Disabled("think TDD") + @Test + @DisplayName("when a configuration parameter is not found, crash") + public void ifPrefixNotFoundCrash() { + + ThrowingCallable code =()->{ + PgConfig.getConfigForPrefix( "nix"); + }; + assertThatCode(code ).isExactlyInstanceOf( RuntimeException.class).hasMessageContaining( "not found"); +// fail( "method ifPrefixNotFoundCrash reached end. You know what to do." ); + } +} From b5e12d7f9e35c2ce4584a9bfc94d45fb24a968c0 Mon Sep 17 00:00:00 2001 From: Pieter van den Hombergh Date: Thu, 22 Feb 2024 22:26:13 +0100 Subject: [PATCH 2/6] stuff left over --- README.md | 3 ++- .../simplejdbc/src/main/java/simplejdbc/PgJDBCUtils.java | 1 - topics/logging.adoc | 6 +----- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index de45346..0c6f634 100644 --- a/README.md +++ b/README.md @@ -83,4 +83,5 @@ This file contains the configuration for `Hugo`, `asciidoctor` and `sebi-theme`. ### Package.json -This file contains the needed packages to be able to build the website. \ No newline at end of file +This file contains the needed packages to be able to build the website. + diff --git a/topics/code/simplejdbc/src/main/java/simplejdbc/PgJDBCUtils.java b/topics/code/simplejdbc/src/main/java/simplejdbc/PgJDBCUtils.java index 16bf224..a643311 100644 --- a/topics/code/simplejdbc/src/main/java/simplejdbc/PgJDBCUtils.java +++ b/topics/code/simplejdbc/src/main/java/simplejdbc/PgJDBCUtils.java @@ -11,7 +11,6 @@ import java.util.HashMap; import java.util.Map; import java.util.Properties; -import java.util.logging.Level; import java.util.logging.Logger; import javax.sql.DataSource; import org.postgresql.ds.PGSimpleDataSource; diff --git a/topics/logging.adoc b/topics/logging.adoc index a060bfb..a1395f2 100644 --- a/topics/logging.adoc +++ b/topics/logging.adoc @@ -16,13 +16,9 @@ public static void main( String[] args ) { <1> Create a specific logger for this class. <2> This log statement only does 'work' when the log level is set to FINE or higher (FINER, FINEST) -<<<<<<< Updated upstream <3> Note the use of positional parameters in the format string. It can be quite useful. See it as a free and random tip. -<4> This lambda has the shape of a supplier and is only evaluated or computed when the logging level is active. -======= -<3> This lambda has the shape of a supplier and is only evaluated or computed when the logging level is active. This +<4> The lambda has the shape of a supplier and is only evaluated or computed when the logging level is active. This make logging 'cheap' when the log level is not active. ->>>>>>> Stashed changes === Replace `soutv`` by using a log macro From f7a7f79f3cc6e9930f785e2658a76b7b8ae9cbd5 Mon Sep 17 00:00:00 2001 From: Pieter van den Hombergh Date: Fri, 22 Mar 2024 14:22:34 +0100 Subject: [PATCH 3/6] small improvements --- topics/jdbc.adoc | 121 +++++++++++++++++++++++------------------------ 1 file changed, 60 insertions(+), 61 deletions(-) diff --git a/topics/jdbc.adoc b/topics/jdbc.adoc index e6e404d..761ba08 100644 --- a/topics/jdbc.adoc +++ b/topics/jdbc.adoc @@ -25,65 +25,65 @@ You can see that the properties file supports two environments, **dev**elopment .Configuring a datasource. Put it in a utility class. [source,java] ---- - static DataSource getDataSource( final String sourceName ) { - // dataSourceByName is a map, serving as a cache. - return datasourceByName.computeIfAbsent( sourceName, - ( s ) -> { - Properties props = properties( "application.properties" ); - - PGSimpleDataSource source = new PGSimpleDataSource(); - - String prefix = sourceName + "."; //<1> - String[] serverNames = { - props.getProperty( prefix + "dbhost" ) - }; - source.setServerNames( serverNames ); - - String user = props.getProperty( prefix + "username" ); - source.setUser( user ); - - source.setDatabaseName( props.getProperty( prefix + "dbname" ) ); - source.setPassword( props - .getProperty( prefix + "password" ) ); - String pingQuery = """ - SELECT current_database(), now()::TIMESTAMP as now; - """ - try ( Connection con = source.getConnection(); - // ping the database for success. - PreparedStatement pst = con.prepareStatement( pingQuery ); ) { - try ( ResultSet rs = pst.executeQuery(); ) { - if ( rs.next() ) { - Object db = rs.getObject( "current_database"); - Object now = rs.getObject( "now"); - System.out.println( - "connected to db %s, date/time is %s" - .formatted( db.toString(), now.toString() ); - } - } - - } catch ( SQLException ex ) { - Logger.getLogger( PgJDBCUtils.class.getName() ) - .log( Level.SEVERE, null, ex ); +static DataSource getDataSource( final String sourceName ) { + // dataSourceByName is a map, serving as a cache. + return datasourceByName.computeIfAbsent( sourceName, + ( s ) -> { + Properties props = properties( "application.properties" ); + + PGSimpleDataSource source = new PGSimpleDataSource(); + + String prefix = sourceName + "."; //<1> + String[] serverNames = { + props.getProperty( prefix + "dbhost" ) + }; + source.setServerNames( serverNames ); + + String user = props.getProperty( prefix + "username" ); + source.setUser( user ); + + source.setDatabaseName( props.getProperty( prefix + "dbname" ) ); + source.setPassword( props + .getProperty( prefix + "password" ) ); + String pingQuery = """ + SELECT current_database(), now()::TIMESTAMP as now; + """ + try ( Connection con = source.getConnection(); + // ping the database for success. + PreparedStatement pst = con.prepareStatement( pingQuery ); ) { + try ( ResultSet rs = pst.executeQuery(); ) { + if ( rs.next() ) { + Object db = rs.getObject( "current_database"); + Object now = rs.getObject( "now"); + System.out.println( + "connected to db %s, date/time is %s" + .formatted( db.toString(), now.toString() ); + } } - return source; - } - ); // end of lambda. - } - - // read properties - static Properties properties( String propFileName ) { - Properties properties = new Properties(); - try ( - FileInputStream fis = new FileInputStream( propFileName ); ) { - properties.load( fis ); - } catch ( IOException ignored ) { - Logger.getLogger( PgJDBCUtils.class.getName() ).log( - Level.INFO, - "attempt to read file from well known location failed'", - ignored ); - } - return properties; - } + + } catch ( SQLException ex ) { + Logger.getLogger( PgJDBCUtils.class.getName() ) + .log( Level.SEVERE, null, ex ); + } + return source; + } + ); // end of lambda. +} + +// read properties +static Properties properties( String propFileName ) { + Properties properties = new Properties(); + try ( + FileInputStream fis = new FileInputStream( propFileName ); ) { + properties.load( fis ); + } catch ( IOException ignored ) { + Logger.getLogger( PgJDBCUtils.class.getName() ).log( + Level.INFO, + "attempt to read file from well known location failed'", + ignored ); + } + return properties; +} ---- <1> The sourceName is the key or namespace from where to pickup the connection details. Simple and effective. @@ -190,7 +190,7 @@ returning * -- <3> <1> Fields can be supplied in any order, including definition order. <2> You do not need the spaces before the commas, we added them for readability. <3> It is smart to *always* expect back what has been inserted by the database, including generated id and - other fields such as the database's notion of date or time. Even smarter, but a little more work //' + other fields such as the databases notion of date or time. Even smarter, but a little more work is to specify the columns instead of a `*`, so that the order in which you receive them is independent of database schema organization and _stable_. @@ -246,8 +246,7 @@ in an array and the rest can be packed into utility methods. The holy grail is to find a way to do all kind of queries against tables, and the only thing you need to know is the table name and what entities as Java objects can be expected to -be read from or written to the table. However, start simple first! At some point you'll find duplicated code and you'll find a way to optimize your code. Typically, you'll use Generics, Lambda's and streams and a bit of reflection at some point. We think it's good to first face the issue of code that is difficult to maintain and afterwards find a solution for that, instead of providing you with a very generic and maybe complex solution without knowing which underlying problems it solves. //' - +be read from or written to the table. However, start simple first! At some point you'll find duplicated code and you'll find a way to optimize your code. Typically, you will use Generics, Lambdas and streams and a bit of reflection at some point. We think it is good to first face the issue of code that is difficult to maintain and afterwards find a solution for that, instead of providing you with a very generic and maybe complex solution without knowing which underlying problems it solves. == Traditional preparing statements From b0f1df81a93e997503f8f748a57a83a3fdb9c84b Mon Sep 17 00:00:00 2001 From: Pieter van den Hombergh Date: Fri, 22 Mar 2024 14:24:46 +0100 Subject: [PATCH 4/6] small improvements --- .../src/main/java/simplejdbc/StudentDemo.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/topics/code/simplejdbc/src/main/java/simplejdbc/StudentDemo.java b/topics/code/simplejdbc/src/main/java/simplejdbc/StudentDemo.java index 327efef..5dc34a6 100644 --- a/topics/code/simplejdbc/src/main/java/simplejdbc/StudentDemo.java +++ b/topics/code/simplejdbc/src/main/java/simplejdbc/StudentDemo.java @@ -33,9 +33,13 @@ public StudentDemo(DataSource ds, PrintStream out) { public List listAll() { var result = new ArrayList(); +<<<<<<< Updated upstream try ( Connection con = ds.getConnection(); PreparedStatement pst = con.prepareStatement( query ); ResultSet rs = pst.executeQuery(); ) { +======= + try ( Connection con = ds.getConnection(); PreparedStatement pst = con.prepareStatement( query ); ResultSet rs = pst.executeQuery(); ) { +>>>>>>> Stashed changes while ( rs.next() ) { Integer snummer = rs.getInt( 1 ); String firstname = rs.getString( 2 ); @@ -47,8 +51,12 @@ public List listAll() { String student_class = rs.getString( 8 ); Boolean active = rs.getBoolean( 9 ); +<<<<<<< Updated upstream Student student = new Student( snummer, firstname, lastname, dob, cohort, email, gender, student_class, active ); +======= + Student student = new Student( snummer, firstname, lastname, dob, cohort, email, gender, student_class, active ); +>>>>>>> Stashed changes result.add( student ); } } catch ( Throwable ex ) { @@ -57,11 +65,18 @@ public List listAll() { return result; } +<<<<<<< Updated upstream private static final String insertSql = """ insert into students (student_id,firstname,lastname,dob,cohort,email,gender,student_grp,active) values( ?, ?, ?, ?, ?, ?, ?, ?, ?) """; +======= + private static final String insertSql = """ + insert into students (student_id,firstname,lastname,dob,cohort,email,gender,student_grp,active) + values( ?, ?, ?, ?, ?, ?, ?, ?, ?) + """; +>>>>>>> Stashed changes public void insertStudents(List students) { try ( Connection con = ds.getConnection(); PreparedStatement pst = con.prepareStatement( insertSql ); ) { From cf7039fd8f65da34d9972412b0899fea1d42c87f Mon Sep 17 00:00:00 2001 From: Pieter van den Hombergh Date: Sun, 31 Mar 2024 22:13:58 +0200 Subject: [PATCH 5/6] merged --- .../src/main/java/simplejdbc/StudentDemo.java | 23 +++---------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/topics/code/simplejdbc/src/main/java/simplejdbc/StudentDemo.java b/topics/code/simplejdbc/src/main/java/simplejdbc/StudentDemo.java index 5dc34a6..e3cbaf0 100644 --- a/topics/code/simplejdbc/src/main/java/simplejdbc/StudentDemo.java +++ b/topics/code/simplejdbc/src/main/java/simplejdbc/StudentDemo.java @@ -33,13 +33,8 @@ public StudentDemo(DataSource ds, PrintStream out) { public List listAll() { var result = new ArrayList(); -<<<<<<< Updated upstream - try ( Connection con = ds.getConnection(); - PreparedStatement pst = con.prepareStatement( query ); + try ( Connection con = ds.getConnection(); PreparedStatement pst = con.prepareStatement( query ); ResultSet rs = pst.executeQuery(); ) { -======= - try ( Connection con = ds.getConnection(); PreparedStatement pst = con.prepareStatement( query ); ResultSet rs = pst.executeQuery(); ) { ->>>>>>> Stashed changes while ( rs.next() ) { Integer snummer = rs.getInt( 1 ); String firstname = rs.getString( 2 ); @@ -51,12 +46,8 @@ public List listAll() { String student_class = rs.getString( 8 ); Boolean active = rs.getBoolean( 9 ); -<<<<<<< Updated upstream - Student student = new Student( snummer, firstname, lastname, + Student student = new Student( snummer, firstname, lastname, dob, cohort, email, gender, student_class, active ); -======= - Student student = new Student( snummer, firstname, lastname, dob, cohort, email, gender, student_class, active ); ->>>>>>> Stashed changes result.add( student ); } } catch ( Throwable ex ) { @@ -65,18 +56,10 @@ public List listAll() { return result; } -<<<<<<< Updated upstream - private static final String insertSql = - """ - insert into students (student_id,firstname,lastname,dob,cohort,email,gender,student_grp,active) - values( ?, ?, ?, ?, ?, ?, ?, ?, ?) - """; -======= private static final String insertSql = """ insert into students (student_id,firstname,lastname,dob,cohort,email,gender,student_grp,active) values( ?, ?, ?, ?, ?, ?, ?, ?, ?) """; ->>>>>>> Stashed changes public void insertStudents(List students) { try ( Connection con = ds.getConnection(); PreparedStatement pst = con.prepareStatement( insertSql ); ) { @@ -115,7 +98,7 @@ public static void main(String[] args) throws IOException { myClass.stream().forEach( System.out::println ); - if ( myClass.size() == 0 ) { + if ( myClass.isEmpty() ) { System.out.println( "Mh, none found. Where are they??" ); System.out.println( "new balls please" ); From 96085132785dcfe8266c64fef223c18191d03808 Mon Sep 17 00:00:00 2001 From: Pieter van den Hombergh Date: Mon, 1 Apr 2024 10:13:33 +0200 Subject: [PATCH 6/6] using warning --- topics/jdbc.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/topics/jdbc.adoc b/topics/jdbc.adoc index ffa9836..54db42e 100644 --- a/topics/jdbc.adoc +++ b/topics/jdbc.adoc @@ -12,7 +12,7 @@ to configure access to a resource, and also by the programming language. + In java the tradition is to use so called properties files, which, also traditionally, have a file extension `.properties`. It also helps to give such files well known names, so the program can refer to them by that name. -[WARM] +[WARNING] ==== Putting secrets like credentials in a properties file is not secure. It is just a way to separate configuration from code. You need to exclude the actual secrets from the code and from the project files that are under version control. The best way is