MODULE Addresses;
IMPORT SQL, Files, Out, In;
VAR
conn: SQL.Connection;
connStr: ARRAY 256 OF CHAR;
PROCEDURE Open*;
VAR s: ARRAY 256 OF CHAR;
BEGIN
conn := SQL.OpenUI(connStr, s)
END Open;
PROCEDURE CreateTable*;
VAR stat: SQL.Statement;
BEGIN
stat := SQL.PrepareStatement(conn, "CREATE TABLE Friends (firstName TEXT(32),
lastName TEXT(32), street TEXT(32), town TEXT(32), zipCode LONG)");
SQL.Execute(stat);
SQL.Commit(conn)
END CreateTable;
PROCEDURE InsertMyAddress*;
VAR stat: SQL.Statement;
BEGIN
stat := SQL.PrepareStatement(conn, "INSERT INTO Friends VALUES ('Christoph', 'Steindl',
'Freistaedterstrasse 315', 'Linz', 4040)");
SQL.Execute(stat);
SQL.Commit(conn)
END InsertMyAddress;
PROCEDURE PutField* (VAR field: SQL.Field);
VAR r: Files.Rider; ch: CHAR; f: SQL.Field;
BEGIN
IF field.len = SQL.NullData THEN Out.String("NULL")
ELSE
f := field;
WITH f: SQL.IntField DO Out.Int(f.i, 0)
| f: SQL.StringField DO Out.String(f.str)
| f: SQL.RealField DO
CASE field.type.sqlType OF
SQL.SQLFloat, SQL.SQLDouble: Out.LongReal(f.r, 0)
| SQL.SQLReal: Out.Real(SHORT(f.r), 16)
END
| f: SQL.DateField DO Out.Int(f.year, 4); Out.Char("-"); Out.Int(f.month, 2);
Out.Char("-"); Out.Int(f.day, 2)
| f: SQL.TimeField DO Out.Int(f.hour, 2); Out.Char(":"); Out.Int(f.minute, 2);
Out.Char(":"); Out.Int(f.second, 2)
| f: SQL.TimeStampField DO Out.Int(f.year, 4); Out.Char("-"); Out.Int(f.month, 2);
Out.Char("-"); Out.Int(f.day, 2); Out.Char(" "); Out.Int(f.hour, 2);
Out.Char(":"); Out.Int(f.minute, 2); Out.Char(":"); Out.Int(f.second, 2);
Out.Char(".");
Out.Int(f.fraction, 0)
| f: SQL.BooleanField DO
IF f.b THEN Out.String("TRUE") ELSE Out.String("FALSE") END
| f: SQL.FileField DO
Out.String("Length of data: "); Out.Int(Files.Length(f.f), 0);
IF field.type.sqlType = SQL.SQLLVarChar THEN
Files.Set(r, f.f, 0); Files.Read(r, ch);
WHILE ~r.eof DO Out.Char(ch); Files.Read(r, ch) END
END
ELSE (* SQL.BinaryField *)
END
END
END PutField;
PROCEDURE ListAll*;
VAR stat: SQL.Statement; field: SQL.Field;
BEGIN
stat := SQL.PrepareStatement(conn, "SELECT * FROM Friends");
SQL.Execute(stat);
IF (stat.ret = SQL.Success) & (stat.results # NIL) THEN
Out.Ln; SQL.FirstField(stat.results, field);
WHILE field # NIL DO
Out.String(field.name); Out.Char(" ");
SQL.NextField(field)
END ;
REPEAT
SQL.Fetch(stat);
IF stat.ret = SQL.Success THEN
Out.Ln;
SQL.FirstField(stat.results, field);
WHILE field # NIL DO
PutField(field); Out.Char(" ");
SQL.NextField(field)
END
END
UNTIL stat.ret # SQL.Success
END ;
END ListAll;
PROCEDURE ListAddress*; (** ^ | "lastName" *)
VAR name: ARRAY 32 OF CHAR; stat: SQL.Statement; field: SQL.Field;
types: ARRAY 1 OF SQL.ParamDesc;
BEGIN
In.Open; In.String(name);
stat := SQL.PrepareStatement(conn, "SELECT * FROM Friends WHERE lastName = ?");
types[0].type.sqlType := SQL.OberonChar;
types[0].mapType.sqlType := SQL.OberonChar;
types[0].inOut := SQL.InParam; types[0].name := "name";
types[0].mapType.prec := 31;
SQL.BindParameters(stat, types, 1);
SQL.FindField(stat.params, "name", field);
COPY(name, field(SQL.StringField).str);
SQL.Execute(stat);
IF (stat.ret = SQL.Success) & (stat.results # NIL) THEN
Out.Ln; SQL.FirstField(stat.results, field);
WHILE field # NIL DO
Out.String(field.name); Out.Char(" ");
SQL.NextField(field)
END ;
REPEAT
SQL.Fetch(stat);
IF stat.ret = SQL.Success THEN
Out.Ln;
SQL.FirstField(stat.results, field);
WHILE field # NIL DO
PutField(field); Out.Char(" ");
SQL.NextField(field)
END
END
UNTIL stat.ret # SQL.Success
END
END ListAddress;
PROCEDURE Insert*; (** ^ | "firstName" "lastName" "street" "town" zipCode *)
VAR firstName, lastName, street, town: ARRAY 32 OF CHAR; zipCode: LONGINT;
stat: SQL.Statement; field: SQL.Field; types: ARRAY 5 OF SQL.ParamDesc;
type, mapType: SQL.Type;
BEGIN
In.Open; In.String(firstName); In.String(lastName); In.String(street);
In.String(town); In.LongInt(zipCode);
stat := SQL.PrepareStatement(conn, "INSERT INTO Friends VALUES (?, ?, ?, ?, ?)");
type.sqlType := SQL.OberonChar; type.prec := 32; type.scale := 0;
IF ~SQL.Map(conn, type, mapType) THEN HALT(69) END ;
types[0].type := type; types[0].mapType := mapType; types[0].inOut := SQL.InParam;
types[1] := types[0]; types[2] := types[0]; types[3] := types[0];
types[0].name := "firstName"; types[1].name := "lastName";
types[2].name := "street"; types[3].name := "town";
type.sqlType := SQL.OberonLongInt; type.prec := 0; type.scale := 0;
IF ~SQL.Map(conn, type, mapType) THEN HALT(69) END ;
types[4].type := type; types[4].mapType := mapType; types[4].inOut := SQL.InParam;
types[4].name := "zipCode";
SQL.BindParameters(stat, types, 5);
SQL.FindField(stat.params, "firstName", field);
COPY(firstName, field(SQL.StringField).str);
SQL.FindField(stat.params, "lastName", field);
COPY(lastName, field(SQL.StringField).str);
SQL.FindField(stat.params, "street", field);
COPY(street, field(SQL.StringField).str);
SQL.FindField(stat.params, "town", field);
COPY(town, field(SQL.StringField).str);
SQL.FindField(stat.params, "zipCode", field);
field(SQL.IntField).i := zipCode;
SQL.Execute(stat);
SQL.Commit(conn)
END Insert;
BEGIN
connStr := ""
END Addresses.