MODULE Addresses; IMPORT ESQL := EmbeddedSQL, Files, Out, In; TYPE Address = RECORD firstName, lastName, street: ARRAY 32 OF CHAR; town: ARRAY 20 OF CHAR; zipCode: INTEGER END ; VAR conn: ESQL.Connection; connStr: ARRAY 256 OF CHAR; stat: ESQL.Statement; PROCEDURE Open*; BEGIN conn := ESQL.OpenUI(connStr, connStr) END Open; PROCEDURE Execute*; VAR sqlString: ARRAY 256 OF CHAR; BEGIN In.Open; In.String(sqlString); IF In.Done THEN stat := conn.Prepare(sqlString); stat.Execute() END END Execute; PROCEDURE ListAll*; VAR adr: Address; BEGIN stat := conn.Prepare("SELECT * FROM Addresses INTO :adr"); stat.Execute(); WHILE stat.Fetch() DO Out.String(adr.firstName); Out.Char(" "); Out.String(adr.lastName); Out.String(", "); IF ~stat.IsNull("adr.street") THEN Out.String(adr.street) END ; Out.String(", "); Out.Int(adr.zipCode, 0); Out.Char(" "); Out.String(adr.town); Out.Ln END END ListAll; PROCEDURE ListByName*; (** ^ | "lastName" *) VAR adr: Address; name: ARRAY 32 OF CHAR; BEGIN In.Open; In.String(name); IF In.Done THEN stat := conn.Prepare("SELECT * FROM Addresses WHERE lastName = :name INTO :adr"); stat.Execute(); WHILE stat.Fetch() DO Out.String(adr.firstName); Out.Char(" "); Out.String(adr.lastName); Out.String(", "); IF ~stat.IsNull("adr.street") THEN Out.String(adr.street) END ; Out.String(", "); Out.Int(adr.zipCode, 0); Out.Char(" "); Out.String(adr.town); Out.Ln END END END ListByName; PROCEDURE Insert*; (** ^ | "firstName" "lastName" "street" "town" zipCode *) VAR adr: Address; BEGIN In.Open; stat := conn.Prepare("INSERT INTO Addresses values (:adr)"); REPEAT In.String(adr.firstName); In.String(adr.lastName); In.String(adr.street); In.String(adr.town); In.Int(adr.zipCode); IF adr.street = "NULL" THEN stat.SetNull("adr.street") END ; IF In.Done THEN stat.Execute() END UNTIL ~In.Done END Insert; BEGIN connStr := "" END Addresses.