MODULE SqlObxTab;
(**

   project   = "BlackBox"
   organization   = "www.oberon.ch"
   contributors   = "Oberon microsystems"
   version   = "System/Rsrc/About"
   copyright   = "System/Rsrc/About"
   license   = "Docu/BB-License"
   changes   = ""
   issues   = ""

**)

   IMPORT Dialog, Ports, Views, TextModels, TextViews, TextRulers, TextMappers, SqlDB;

      
   
   CONST
      protocol = "SqlOdbc3";
      id = ""; password = "";
      datasource = "Test Database";
      
      colWidth = 30 * Ports.mm;
      minCol = 4;
      
      
   VAR
      name*: ARRAY 64 OF CHAR;
      
   PROCEDURE NewRuler (tabs: INTEGER): TextRulers.Ruler;

      VAR p: TextRulers.Prop; i, w: INTEGER;
   BEGIN
      NEW(p);
      IF tabs > LEN(p.tabs.tab) THEN tabs := LEN(p.tabs.tab)
      ELSIF tabs < minCol THEN tabs := minCol
      END;
      p.valid := {TextRulers.right, TextRulers.tabs, TextRulers.opts};
      p.opts.val := {TextRulers.rightFixed}; p.opts.mask := p.opts.val;
      p.tabs.len := tabs - 1; i := 0; w := 0;
      WHILE i < tabs - 1 DO
         INC(w, colWidth); p.tabs.tab[i].stop := w; INC(i)
      END;
      INC(w, colWidth); p.right := w;
      RETURN TextRulers.dir.NewFromProp(p)
   END NewRuler;
   PROCEDURE OpenViewer (t: TextModels.Model; title: Views.Title; ruler:TextRulers.Ruler);

      VAR v: TextViews.View;
   BEGIN
      Dialog.MapString(title, title);
      v := TextViews.dir.New(t);
      IF ruler # NIL THEN v.SetDefaults(ruler, TextViews.dir.defAttr) END;
      Views.OpenAux(v, title)
   END OpenViewer;
   
   PROCEDURE ShowTables*;
      VAR db: SqlDB.Database; t, tabs: SqlDB.Table; res, row, col, n, max: INTEGER;
         text: TextModels.Model; out: TextMappers.Formatter; data: SqlDB.Row;
   BEGIN
      text := TextModels.dir.New(); out.ConnectTo(text);
      SqlDB.OpenDatabase(protocol, id, password, datasource, SqlDB.async, SqlDB.showErrors, db, res);
      tabs := db.NewTable();
      tabs.Exec("Show Tables");
      n := 0; max := 0;
      WHILE n < tabs.rows DO
         tabs.Read(n, data);
         name := data.fields[1]^$;
         out.WriteLn;
         out.WriteString("Table "); out.WriteString(name); out.WriteLn;
         out.WriteLn;
         t := db.NewTable();
         t.Exec("select * from :!SqlObxTab.name");
         row := SqlDB.names;
         WHILE row < t.rows DO
            t.Read(row, data); col := 0;
            WHILE col < t.columns DO
               out.WriteString(data.fields[col]^); out.WriteTab;
               INC(col)
            END;
            out.WriteLn; INC(row)
         END;
         IF t.columns > max THEN max := t.columns END;
         t.Clear; INC(n)
      END;
      OpenViewer(text, "Tables", NewRuler(max))
   END ShowTables;
   
END SqlObxTab.