Loading ...
Sorry, an error occurred while loading the content.

Re: [metabase-dev] Correct understanding

Expand Messages
  • Manuel Lemos
    Hello Frank, ... No, what I meantioned are just things that were planned because at least I need them to evolve in that direction. For instance, I have planned
    Message 1 of 14 , May 1 2:58 PM
    • 0 Attachment
      Hello Frank,

      On 01-May-00 01:03:57, you wrote:

      >> >It was more of a curiosity. I myself had designed and implemented a
      >> >system by which we abstracted the schema to a meta-model which was
      >> >reasoned with at run time for persistence.
      >>
      >> Well, I have been planning to move driver functions for database
      >> administration like those for defining how each datatype should be
      >> declared, table alteration, sequence and index access, etc. to separate
      >> classes so that at run time, when usually of such functions are not needed,
      >> they won't be loaded, making the actual code just for database access much
      >> smaller.
      >>
      >> The driver classes function would still be used to maintain compatibility
      >> but they would rely on a separate class instance that would only be loaded
      >> on demand, ie, only when such functions are called for the first time.
      >>
      >> Along with this I was planning to move the table creation and dropping
      >> procedure to those separate classes. This way the interface would be more
      >> abastracted and it could indeed be used to create schemas for non-SQL
      >> databases, given the appropriate driver classes. So, yes, it could and
      >> will be done. Hang on.

      >Whoa, don't do anything on my part. I am curious from a totally

      No, what I meantioned are just things that were planned because at least I
      need them to evolve in that direction.

      For instance, I have planned and will implement some time in the future the
      table definition inheritance capabilities to the database schema
      description parser. This will allow you to define a sort of table base from
      which other tables will be defined with fields common to the base table.

      It will be similar to Object Oriented inheritance at the data level with
      needing any Object Oriented support from any DBMS. Actually it will
      something that will require backward compatible changes to the database
      schema XML parser.

      This may look nice from an academic perspective, but I am planning to
      implement this to satisfy a need that I encounter all the time. I need to
      perform queries to tables that have a common set of fields but differ in
      the remaining field definition.

      For instance, imagine a document database that have a table for all the
      documents. But there are some types of documents that need to more
      information than others.

      If I am not going to query the documents database for more than one kind of
      document at once, there is no problem in spliting the document database in
      several table, one for each kind of document and so I don't have to stuff
      all the properties of all type of supported documents in a single table.

      The inheritance ability will reduce the table design and maintenance time
      as I don't have to retype all the common fields for each new table I may
      need. So, the real need that this feature will satisfy is reducing design
      and implementation time.


      >conversational perspective. To the point to say that if you have
      >something you want to hash out, I may have been there and would be happy
      >to "chew the fat" over it.

      So, what have you been up to in this aspect of asbtraction schema tables
      creation?


      Regards,
      Manuel Lemos

      Web Programming Components using PHP Classes.
      Look at: http://phpclasses.UpperDesign.com/?user=mlemos@...
      --
      E-mail: mlemos@...
      URL: http://www.mlemos.e-na.net/
      PGP key: http://www.mlemos.e-na.net/ManuelLemos.pgp
      --
    • Frank V. Castellucci
      ... Ok, starting with a few tenets: * Every meta-schema object has a unique identifier that is global worldwide. * Meta-schema objects describe tables,
      Message 2 of 14 , May 2 6:04 AM
      • 0 Attachment
        Manuel Lemos wrote:
        >
        > Hello Frank,
        >
        > On 01-May-00 01:03:57, you wrote:
        >
        > >Whoa, don't do anything on my part. I am curious from a totally
        >
        > No, what I meantioned are just things that were planned because at least I
        > need them to evolve in that direction.
        >
        > For instance, I have planned and will implement some time in the future the
        > table definition inheritance capabilities to the database schema
        > description parser. This will allow you to define a sort of table base from
        > which other tables will be defined with fields common to the base table.
        >
        > It will be similar to Object Oriented inheritance at the data level with
        > needing any Object Oriented support from any DBMS. Actually it will
        > something that will require backward compatible changes to the database
        > schema XML parser.
        >
        > This may look nice from an academic perspective, but I am planning to
        > implement this to satisfy a need that I encounter all the time. I need to
        > perform queries to tables that have a common set of fields but differ in
        > the remaining field definition.
        >
        > For instance, imagine a document database that have a table for all the
        > documents. But there are some types of documents that need to more
        > information than others.
        >
        > If I am not going to query the documents database for more than one kind of
        > document at once, there is no problem in spliting the document database in
        > several table, one for each kind of document and so I don't have to stuff
        > all the properties of all type of supported documents in a single table.
        >
        > The inheritance ability will reduce the table design and maintenance time
        > as I don't have to retype all the common fields for each new table I may
        > need. So, the real need that this feature will satisfy is reducing design
        > and implementation time.
        >
        > >conversational perspective. To the point to say that if you have
        > >something you want to hash out, I may have been there and would be happy
        > >to "chew the fat" over it.
        >
        > So, what have you been up to in this aspect of asbtraction schema tables
        > creation?
        >

        Ok, starting with a few tenets:

        * Every meta-schema object has a unique identifier that is global
        worldwide.
        * Meta-schema objects describe tables, columns, constraints,
        relationships, and types
        * Meta-types are organized in a hierarchical form. This is useful in the
        run-time engine for optimization of statements.
        * Meta-tables consist of relationships to meta-columns, relationships to
        meta-constraints, and relationships to meta-relationships in addition to
        the meta-table tuple
        * Meta-columns consist of relationships to meta-types, relatioships to
        meta-constraints in addition to the meta-column tuple



        --
        Frank V. Castellucci
      • Pierre-henri Delaval
        Due to the fact that my php is not compiled with xml, I cannot perform the whole test set. So here is the state of the informix driver. The majors things are
        Message 3 of 14 , May 2 6:09 AM
        • 0 Attachment
          Due to the fact that my php is not compiled with xml, I cannot perform the
          whole test set.
          So here is the state of the informix driver.

          The majors things are insert and select queries. with blobs.

          If someone could test this driver, it could be fine.

          sy

          -----------------------------------------------------------------

          <?
          if(!defined("METABASE_IFX_INCLUDED"))
          {
          define("METABASE_IFX_INCLUDED",1);

          /*
          * metabase_ifx.php
          *
          * @(#) $Header: /cvsroot/metabase/metabase_ifx.php,v 1.32 2000/02/22
          03:32:54 mlemos Exp $
          *
          */

          class metabase_ifx_class extends metabase_database_class
          {
          var $connection=0;
          var $connected_host;
          var $connected_user;
          var $connected_password;
          var $connected_port;
          var $opened_persistent="";
          var $decimal_factor=1.0;
          var $highest_fetched_row=array();

          var $num_rows=0;
          var $results=array();
          var $current_row=array();
          var $columns=array();
          var $rows=array();
          var $limits=array();
          var $row_buffer=array();
          var $TextAsVarchar;


          Function Connect()
          {
          $port=(IsSet($this->options["Port"]) ? $this->options["Port"] : "");
          $this->TextAsVarchar=(IsSet($this->options["TextAsVarchar"]) ?
          $this->options["TextAsVarchar"] : 0);
          if($this->connection!=0)
          {
          if(!strcmp($this->connected_host,$this->host)
          && !strcmp($this->connected_user,$this->user)
          && !strcmp($this->connected_password,$this->password)
          && !strcmp($this->connected_port,$port)
          && $this->opened_persistent==$this->persistent)
          return(1);
          ifx_Close($this->connection);
          $this->connection=0;
          $this->affected_rows=-1;
          }
          $function=($this->persistent ? "ifx_pconnect" : "ifx_connect");

          if(($this->connection=@$function($this->database_name."@".$this->host.(!strc
          mp($port,"") ? "" : ":".$port),$this->user,$this->password))<=0)
          {
          $this->last_error=(IsSet($php_errormsg) ? $php_errormsg : "Could not
          connect to Informix server");
          return(0);
          }
          if($this->connection!=0):
          $this->last_error= "connection ok";
          else:
          $this->last_error= "connection Nok";
          endif;

          $this->connected_host=$this->host;
          $this->connected_user=$this->user;
          $this->connected_password=$this->password;
          $this->connected_port=$port;
          $this->opened_persistent=$this->persistent;
          return(1);
          }

          Function Close()
          {
          if($this->connection!=0)
          {
          ifx_Close($this->connection);
          $this->connection=0;
          $this->affected_rows=-1;
          }
          }

          Function Query($query)
          {
          $first=$this->first_selected_row;
          $limit=$this->selected_row_limit;
          $this->first_selected_row=$this->selected_row_limit=0;
          if(!strcmp($this->database_name,""))
          {
          $this->last_error="It was not specified a valid database name to select";
          return(0);
          }
          if(!$this->Connect())
          return(0);

          /* no limit in ifx, sorry ;)

          if(($select=(strtolower(strtok($query," "))=="select")) && $limit>0)
          $query.=" FIRST $limit";
          */

          // set to get blob text in the query table
          ifx_textasvarchar($this->TextAsVarchar);

          if(($result=ifx_prepare($query,$this->connection))) {
          $this->num_rows = ifx_affected_rows($result);
          if ($this->num_rows > 1000 ) {
          $this->last_error= "Too many rows in result";
          $result = 0;
          }
          else {
          if (ifx_do($result)) {
          if($select) {
          $this->current_row[$result]=-1;
          $this->highest_fetched_row[$result]=-1;
          $this->num_rows = ifx_affected_rows($result);
          }
          else {
          $this->affected_rows=ifx_affected_rows($result);
          }
          }
          else {
          $this->last_error=ifx_error();
          }
          }
          }
          else
          $this->last_error=ifx_error();
          return($result);
          }

          Function EndOfResult($result)
          {
          if(!IsSet($this->highest_fetched_row[$result]))
          {
          $this->last_error="attempted to check the end of an unknown result";
          return(-1);
          }
          return($this->highest_fetched_row[$result]>=$this->NumberOfRows($result)-1);
          }

          Function GetColumnNames($result)
          {
          if(!IsSet($this->columns[$result]))
          {
          $this->columns[$result]=array();
          $columns=ifx_num_fields($result);
          $types = ifx_fieldtypes($result);
          for($column=0;$column<$columns;$column++)
          {
          $fname = key ($types);
          $this->columns[$result][strtoupper($fname)]=$column;
          next ($types);
          }
          }
          }

          Function GetColumn($result,$field)
          {
          $this->GetColumnNames($result);
          if(GetType($field)=="integer")
          {
          if(($column=$field)<0
          || $column>=ifx_num_fields($result))
          {
          $this->last_error= "attempted to fetch an query result column out of
          range";
          return(-1);
          }
          }
          else
          {
          $name=strtoupper($field);
          if(!IsSet($this->columns[$result][$name]))
          {
          $this->last_error="attempted to fetch an unknown query result column";
          return(-1);
          }
          $column=$this->columns[$result][$name];
          }
          return($column);
          }

          Function FetchRow($result,$row)
          {
          if(!IsSet($this->current_row[$result]))
          {
          $this->last_error="attempted to fetch a row from an unknown query result";
          return(0);
          }
          if(IsSet($this->results[$result][$row]))
          return(1);
          if(IsSet($this->rows[$result]))
          {
          $this->last_error="there are no more rows to retrieve";
          return(0);
          }
          if(IsSet($this->row_buffer[$result]))
          {
          $this->current_row[$result]++;

          $this->results[$result][$this->current_row[$result]]=$this->row_buffer[$resu
          lt];
          Unset($this->row_buffer[$result]);
          }
          for(;$this->current_row[$result]<$row;$this->current_row[$result]++)
          {
          $data = ifx_fetch_row($result,"NEXT");
          $i = 0;
          if (is_array($data)) {
          for (reset($data);$fieldname=key($data);next($data))
          {
          $tmp = $this->current_row[$result]+1;
          $this->results[$result][$tmp][$i] = $data[$fieldname];
          $i++;
          }
          }
          else
          {
          $this->rows[$result]=$this->current_row[$result]+1;
          $this->last_error="could not fetch the query result row";
          return(0);
          }
          }
          return(1);
          }


          Function FetchResult($result,$row,$field)
          {
          if(($column=$this->GetColumn($result,$field))==-1
          || !$this->FetchRow($result,$row))
          return("");
          if(!IsSet($this->results[$result][$row][$column]))
          return("");
          return($this->results[$result][$row][$column]);
          }

          Function FetchDecimalResult($result,$row,$field)
          {

          return(sprintf("%.".$this->decimal_places."f",$this->FetchResult($result,$ro
          w,$field)/$this->decimal_factor));
          }

          Function NumberOfRows($result)
          {
          return($this->num_rows);
          }

          Function FreeResult($result)
          {
          UnSet($this->highest_fetched_row[$result]);
          return(ifx_free_result($result));
          }

          Function Error()
          {
          return($this->last_error);
          }

          Function CreateDatabase($name)
          {
          // not yet implemented
          return(1);
          }

          Function DropDatabase($name)
          {
          // not yet implemented
          return(1);
          }

          Function GetTextFieldValue($value)
          {
          return("'".AddSlashes($value)."'");
          }

          Function GetIntegerFieldTypeDeclaration($name,&$field)
          {
          return("$name ".(IsSet($field["unsigned"]) ? "INT UNSIGNED" :
          "INT").(IsSet($field["default"]) ? " DEFAULT ".$field["default"] :
          "").(IsSet($field["notnull"]) ? " NOT NULL" : ""));
          }

          Function GetDateFieldTypeDeclaration($name,&$field)
          {
          return($name." DATE".(IsSet($field["default"]) ? " DEFAULT
          '".$field["default"]."'" : "").(IsSet($field["notnull"]) ? " NOT NULL" : ""));
          }

          Function GetTimestampFieldTypeDeclaration($name,&$field)
          {
          return($name." DATETIME".(IsSet($field["default"]) ? " DEFAULT
          '".$field["default"]."'" : "").(IsSet($field["notnull"]) ? " NOT NULL" : ""));
          }

          Function GetTimeFieldTypeDeclaration($name,&$field)
          {
          return($name." TIME".(IsSet($field["default"]) ? " DEFAULT
          '".$field["default"]."'" : "").(IsSet($field["notnull"]) ? " NOT NULL" : ""));
          }

          Function GetFloatFieldTypeDeclaration($name,&$field)
          {
          return("$name DOUBLE ".(IsSet($field["default"]) ? " DEFAULT
          ".$this->GetFloatFieldValue($field["default"]) :
          "").(IsSet($field["notnull"]) ? " NOT NULL" : ""));
          }

          Function GetDecimalFieldTypeDeclaration($name,&$field)
          {
          return("$name BIGINT".(IsSet($field["default"]) ? " DEFAULT
          ".$this->GetDecimalFieldValue($field["default"]) :
          "").(IsSet($field["notnull"]) ? " NOT NULL" : ""));
          }

          Function GetFloatFieldValue($value)
          {
          return(!strcmp($value,"NULL") ? "NULL" : "$value");
          }

          Function GetDecimalFieldValue($value)
          {
          return(!strcmp($value,"NULL") ? "NULL" :
          strval(intval($value*$this->decimal_factor)));
          }

          Function AlterTable($name,$changes,$check)
          {
          // not yet implemented
          return (1);
          }

          Function CreateSequence($name,$start)
          {
          // not yet implemented
          return (1);
          }

          Function DropSequence($name)
          {
          // not yet implemented
          return (1);
          }

          Function GetSequenceNextValue($name,&$value)
          {
          // not yet implemented
          return (1);
          }

          Function GetSequenceCurrentValue($name,&$value)
          {
          // not yet implemented
          return (1);
          }

          Function CreateIndex($table,$name,$definition)
          {
          // not yet implemented
          return (1);
          }

          Function DropIndex($table,$name)
          {
          // not yet implemented
          return (1);
          }

          Function Setup()
          {
          $this->supported["AffectedRows"]=
          1;
          $this->decimal_factor=pow(1.0,$this->decimal_places);
          return("");
          }

          Function PrepareQuery ($query)
          {
          $positions=array();

          for($position=-1;GetType($position=strpos($query,"?",$position+1))=="integer";)
          $positions[]=$position;
          $this->prepared_queries[]=array(
          "Query"=>$query,
          "Positions"=>$positions,
          "BlobId"=>array()
          );
          $prepared_query=count($this->prepared_queries);
          return($prepared_query);
          }

          Function QuerySet($prepared_query,$parameter,$type,$value)
          {
          $index=$prepared_query-1;
          if($parameter<1
          || $parameter>count($this->prepared_queries[$index]["Positions"]))
          {
          $this->last_error="it was not specified a valid argument number";
          return(0);
          }
          // Now create the blob id for that parameter:

          if (strcmp($type,"text") == 0)
          {
          $blobid = ifx_create_blob(1,0,$value);
          $this->prepared_queries[$index]["BlobId"][$parameter-1]=$blobid;
          return(1);
          }
          else
          {
          $this->last_error="it is not a correct text type. (the only supported
          with prepare)";
          return(0);
          }
          }

          Function ExecuteQuery($prepared_query)
          {

          $blobsidarray = array();

          $index=$prepared_query-1;

          for($query="",$last_position=$position=0;$position<count($this->prepared_que
          ries[$index]["Positions"]);$position++)
          {
          if(!IsSet($this->prepared_queries[$index]["BlobId"][$position]))
          {
          $this->last_error="it was not defined query argument ".($position+1);
          return(0);
          }

          $current_position=$this->prepared_queries[$index]["Positions"][$position];
          $blobsidarray[] = $this->prepared_queries[$index]["BlobId"][$position];
          $last_position=$current_position+1;
          }

          $query = $this->prepared_queries[$index]["Query"];
          if(!strcmp($this->database_name,""))
          {
          $this->last_error="It was not specified a valid database name to select";
          return(0);
          }
          if(!$this->Connect())
          return(0);

          if(($result=ifx_prepare($query,$this->connection,$blobsidarray))) {
          $this->num_rows = ifx_affected_rows($result);
          if ($this->num_rows > 1000 ) {
          $this->last_error= "Too many rows in result";
          $result = 0;
          }
          else {
          if (ifx_do($result)) {
          $this->affected_rows=ifx_affected_rows($result);
          }
          else {
          $this->last_error=ifx_error();
          }
          }
          }
          else
          $this->last_error=ifx_error();
          return($result);
          }



          };

          }
          ?>
          Pierre-Henri Delaval EuroNet Internet
          Portal Developer A Subsidiary of France Telecom
          http://www.wanadoo.be Lozenberg 22 - 1932 Zaventem
          pierre-henri@... Tel: +32 (0)2 717 18 13
        • Manuel Lemos
          Hello Frank, ... In the current schema definition, each object has a unique name within its scope, ie, each table has a unique name among schema tables, each
          Message 4 of 14 , May 8 12:44 PM
          • 0 Attachment
            Hello Frank,

            On 02-May-00 11:04:23, you wrote:

            >> >conversational perspective. To the point to say that if you have
            >> >something you want to hash out, I may have been there and would be happy
            >> >to "chew the fat" over it.
            >>
            >> So, what have you been up to in this aspect of asbtraction schema tables
            >> creation?
            >>

            >Ok, starting with a few tenets:

            >* Every meta-schema object has a unique identifier that is global
            >worldwide.

            In the current schema definition, each object has a unique name within its
            scope, ie, each table has a unique name among schema tables, each field has
            a unique name among table fields, each index has a unique name among table
            indexes and each sequence has a unique name among schema sequences.

            So, there maybe tables and sequences with the same names but they are
            different objects. The same for fields and indexes. Should I prevent
            this? Why?


            >* Meta-schema objects describe tables, columns, constraints,
            >relationships, and types

            There is currently no support for inter-table field relationships like
            foreign keys and such. Most applications don't need that and many DBMS
            don't support them, so I didn't bother to add some support for
            relationships at that level. I am not sure if that is what you meant and
            if it wouldn't be something to invest.


            >* Meta-types are organized in a hierarchical form. This is useful in the
            >run-time engine for optimization of statements.
            >* Meta-tables consist of relationships to meta-columns, relationships to
            >meta-constraints, and relationships to meta-relationships in addition to
            >the meta-table tuple
            >* Meta-columns consist of relationships to meta-types, relatioships to
            >meta-constraints in addition to the meta-column tuple

            I'm not sure what you mean. Maybe it would be clearer if you could explain
            with examples.



            Regards,
            Manuel Lemos

            Web Programming Components using PHP Classes.
            Look at: http://phpclasses.UpperDesign.com/?user=mlemos@...
            --
            E-mail: mlemos@...
            URL: http://www.mlemos.e-na.net/
            PGP key: http://www.mlemos.e-na.net/ManuelLemos.pgp
            --
          • Manuel Lemos
            Hello Pierre-henri, ... Humm... I guess I ll change the test script to define the tables using PHP instead of going through the parser as some people yourself
            Message 5 of 14 , May 8 12:52 PM
            • 0 Attachment
              Hello Pierre-henri,

              On 02-May-00 11:09:44, you wrote:

              >Due to the fact that my php is not compiled with xml, I cannot perform the
              >whole test set.

              Humm... I guess I'll change the test script to define the tables using PHP
              instead of going through the parser as some people yourself may have
              trouble to set up PHP with XML.


              >So here is the state of the informix driver.

              >The majors things are insert and select queries. with blobs.

              Blobs need a special treatment at Metabase interface level. I am thinking
              to add a special type for them as blobs can't be treated as normal text
              fields. I was looking at JDBC and they use a sort of stream I/O to store
              and retrieve data from BLOB fields.


              >If someone could test this driver, it could be fine.

              I'll do so in a few days. I have my disk full of database installations so
              I'll have to make some space for Informix too. BTW, I was looking at
              Informix site and it seems they no longer offer free development licenses
              for Linux. I wonder if the trial version that is in the Intraware site
              could be used for testing this driver.



              Regards,
              Manuel Lemos

              Web Programming Components using PHP Classes.
              Look at: http://phpclasses.UpperDesign.com/?user=mlemos@...
              --
              E-mail: mlemos@...
              URL: http://www.mlemos.e-na.net/
              PGP key: http://www.mlemos.e-na.net/ManuelLemos.pgp
              --
            • Frank V. Castellucci
              ... The names of tables, columns, etc are implementation issues, I am talking about the meta-schema model elements. There are many type ontologies in this
              Message 6 of 14 , May 10 4:25 AM
              • 0 Attachment
                Manuel Lemos wrote:
                >
                > Hello Frank,
                >
                > On 02-May-00 11:04:23, you wrote:
                >
                > >> >conversational perspective. To the point to say that if you have
                > >> >something you want to hash out, I may have been there and would be happy
                > >> >to "chew the fat" over it.
                > >>
                > >> So, what have you been up to in this aspect of asbtraction schema tables
                > >> creation?
                > >>
                >
                > >Ok, starting with a few tenets:
                >
                > >* Every meta-schema object has a unique identifier that is global
                > >worldwide.
                >
                > In the current schema definition, each object has a unique name within its
                > scope, ie, each table has a unique name among schema tables, each field has
                > a unique name among table fields, each index has a unique name among table
                > indexes and each sequence has a unique name among schema sequences.
                >
                > So, there maybe tables and sequences with the same names but they are
                > different objects. The same for fields and indexes. Should I prevent
                > this? Why?

                The names of tables, columns, etc are implementation issues, I am
                talking about the meta-schema model elements.

                There are many type ontologies in this world. There are types for
                engineers, marketing, developers, databases, grocery stores, etc., etc.,
                etc.. which are the domains that declare the types. A universal
                identification (DCE UUID for example) leaves the door open for namespace
                and so on in the future. Just a thought.

                >
                > >* Meta-schema objects describe tables, columns, constraints,
                > >relationships, and types
                >
                > There is currently no support for inter-table field relationships like
                > foreign keys and such. Most applications don't need that and many DBMS
                > don't support them, so I didn't bother to add some support for
                > relationships at that level. I am not sure if that is what you meant and
                > if it wouldn't be something to invest.

                Wheter the underlying database supports it is irrelevant. If it is the
                logical schema for the designer, than it is up to the implementation
                driver to emulate the join criteria (sub-select, recursive) whatever.
                The point is that it is a naturally occuring relationship.

                >
                > >* Meta-types are organized in a hierarchical form. This is useful in the
                > >run-time engine for optimization of statements.
                > >* Meta-tables consist of relationships to meta-columns, relationships to
                > >meta-constraints, and relationships to meta-relationships in addition to
                > >the meta-table tuple
                > >* Meta-columns consist of relationships to meta-types, relatioships to
                > >meta-constraints in addition to the meta-column tuple
                >
                > I'm not sure what you mean. Maybe it would be clearer if you could explain
                > with examples.

                Umm, the model of the schema would describe entities (tables, columns,
                indexes, constraints, etc.) and their relationships. These are
                meta-elements themselves yes?

                >
                > Regards,
                > Manuel Lemos
                >
                --
                Frank V. Castellucci
              • Manuel Lemos
                Precedence: bulk Hello Frank, It has been a while since you sent this message... :-) ... I see, but the way I see it, there should be an higher level database
                Message 7 of 14 , Jun 30, 2000
                • 0 Attachment
                  Precedence: bulk

                  Hello Frank,

                  It has been a while since you sent this message... :-)

                  On 10-May-00 09:25:18, you wrote:

                  >> >* Every meta-schema object has a unique identifier that is global
                  >> >worldwide.
                  >>
                  >> In the current schema definition, each object has a unique name within its
                  >> scope, ie, each table has a unique name among schema tables, each field has
                  >> a unique name among table fields, each index has a unique name among table
                  >> indexes and each sequence has a unique name among schema sequences.
                  >>
                  >> So, there maybe tables and sequences with the same names but they are
                  >> different objects. The same for fields and indexes. Should I prevent
                  >> this? Why?

                  >The names of tables, columns, etc are implementation issues, I am
                  >talking about the meta-schema model elements.

                  >There are many type ontologies in this world. There are types for
                  >engineers, marketing, developers, databases, grocery stores, etc., etc.,
                  >etc.. which are the domains that declare the types. A universal
                  >identification (DCE UUID for example) leaves the door open for namespace
                  >and so on in the future. Just a thought.

                  I see, but the way I see it, there should be an higher level database
                  schema abstraction that could be mapped to Metabase schema descriptions
                  because Metabase is meant to only install databases from descriptions
                  of data and their types that map to the usual data types that are available
                  in SQL databases.


                  >> >* Meta-schema objects describe tables, columns, constraints,
                  >> >relationships, and types
                  >>
                  >> There is currently no support for inter-table field relationships like
                  >> foreign keys and such. Most applications don't need that and many DBMS
                  >> don't support them, so I didn't bother to add some support for
                  >> relationships at that level. I am not sure if that is what you meant and
                  >> if it wouldn't be something to invest.

                  >Wheter the underlying database supports it is irrelevant. If it is the
                  >logical schema for the designer, than it is up to the implementation
                  >driver to emulate the join criteria (sub-select, recursive) whatever.
                  >The point is that it is a naturally occuring relationship.

                  I see, but please understand that is beyond the scope of Metabase. An
                  higher level tool could let developers model their database in the way that
                  you suggest and then could output schema description files that Metabase
                  could parse and install. I'm afraid that stuffing all that in Metabase
                  would make it more bloated than most people need.

                  If you want to start working on such higher level tool, just let me know
                  if you need any help.

                  Regards,
                  Manuel Lemos

                  Web Programming Components using PHP Classes.
                  Look at: http://phpclasses.UpperDesign.com/?user=mlemos@...
                  --
                  E-mail: mlemos@...
                  URL: http://www.mlemos.e-na.net/
                  PGP key: http://www.mlemos.e-na.net/ManuelLemos.pgp
                  --
                • Frank V. Castellucci
                  ... With most modeling tools (including ArgoUML) generating XMI as the interchange it may be more useful for Metabase to be able to parse that, or maybe XML
                  Message 8 of 14 , Jul 1, 2000
                  • 0 Attachment
                    Manuel Lemos wrote:
                    >
                    > Precedence: bulk
                    >
                    > Hello Frank,
                    >
                    > It has been a while since you sent this message... :-)
                    >
                    > On 10-May-00 09:25:18, you wrote:
                    > [snip]
                    >
                    > >Wheter the underlying database supports it is irrelevant. If it is the
                    > >logical schema for the designer, than it is up to the implementation
                    > >driver to emulate the join criteria (sub-select, recursive) whatever.
                    > >The point is that it is a naturally occuring relationship.
                    >
                    > I see, but please understand that is beyond the scope of Metabase. An
                    > higher level tool could let developers model their database in the way that
                    > you suggest and then could output schema description files that Metabase
                    > could parse and install. I'm afraid that stuffing all that in Metabase
                    > would make it more bloated than most people need.
                    >
                    > If you want to start working on such higher level tool, just let me know
                    > if you need any help.

                    With most modeling tools (including ArgoUML) generating XMI as the
                    interchange it may be more useful for Metabase to be able to parse that,
                    or maybe XML Schema.

                    But I'll keep your offer in mind!

                    Best,

                    Frank V. Castellucci
                  • Manuel Lemos
                    Hello Frank, ... I ve been noting down a few other projects announce in Freshmeat that attempt to achieve similar goals. Take a look before you start
                    Message 9 of 14 , Jul 9, 2000
                    • 0 Attachment
                      Hello Frank,

                      On 01-Jul-00 08:57:13, you wrote:

                      >> >Wheter the underlying database supports it is irrelevant. If it is the
                      >> >logical schema for the designer, than it is up to the implementation
                      >> >driver to emulate the join criteria (sub-select, recursive) whatever.
                      >> >The point is that it is a naturally occuring relationship.
                      >>
                      >> I see, but please understand that is beyond the scope of Metabase. An
                      >> higher level tool could let developers model their database in the way that
                      >> you suggest and then could output schema description files that Metabase
                      >> could parse and install. I'm afraid that stuffing all that in Metabase
                      >> would make it more bloated than most people need.
                      >>
                      >> If you want to start working on such higher level tool, just let me know
                      >> if you need any help.

                      >With most modeling tools (including ArgoUML) generating XMI as the
                      >interchange it may be more useful for Metabase to be able to parse that,
                      >or maybe XML Schema.

                      >But I'll keep your offer in mind!

                      I've been noting down a few other projects announce in Freshmeat that
                      attempt to achieve similar goals. Take a look before you start anything.


                      From: freshd@...
                      Subject: UML2SQL 0.7.0 - tool to synchronize SQL databases with UML diagrams
                      Date: 15 Jun 2000 10:29:33 GMT

                      application: UML2SQL 0.7.0
                      author: Ingo Kegel <kingo@...>
                      license: LGPL
                      category: Development/Database

                      homepage: http://freshmeat.net/redir/homepage/961063613/
                      download: http://freshmeat.net/redir/download/961063613/

                      description:
                      UML2SQL is a java tool which synchronizes SQL databases with UML
                      diagrams. UML class diagrams can thus serve as authoritative
                      definitions of database catalogs. UML2SQL can be used together with a
                      UML design tool which is capable of producing XML. For the most generic
                      operations, only a JDBC driver is required for the SQL database. Vendor
                      specific DDL commands for unsupported databases can be easily
                      implemented by extending the DatabaseAdapter class.

                      Changes:
                      initial release

                      |> http://freshmeat.net/news/2000/06/15/961065054.html


                      From: freshd@...
                      Subject: xplain2sql 0.8.0 - An Xplain to SQL conversion tool.
                      Date: 1 Jul 2000 18:26:01 GMT

                      application: xplain2sql 0.8.0
                      author: Berend de Boer <berend@...>
                      license: Eiffel Forum Freeware License
                      category: Development/Database
                      urgency: medium

                      homepage: http://freshmeat.net/redir/homepage/950141364/
                      download: http://freshmeat.net/redir/download/950141364/

                      description:
                      xplain2sql converts files from Xplain to SQL. It supports a very large
                      subset of Xplain, and it can convert from Xplain to Microsoft SQL
                      Server, DB/2, Inprise InterBase, PostgreSQL, MySQL, or ANSI-92 SQL. It
                      can also generate low-level Delphi/ADO middletier code. It compiles
                      without change on FreeBSD, BeOS, and NT.

                      Changes:
                      DB/2 support, fixes for various wrong SQL generation bugs (including an
                      import one when using extends), a new column rename operator `as',
                      support for Xplain per operator in get statements (i.e., you can sort
                      your results now), requirement of the Formatter library to compile, and
                      compile support with SmallEiffel and VisualEiffel.

                      |> http://freshmeat.net/news/2000/07/01/962475970.html


                      From: freshd@...
                      Subject: Alzabo 0.03a - Perl data modelling tool and RDBMS-OO mapper.
                      Date: 7 Jul 2000 19:53:05 GMT

                      application: Alzabo 0.03a
                      author: Dave Rolsky <autarch@...>
                      license: GPL
                      category: Development/Perl Modules

                      homepage: http://freshmeat.net/redir/homepage/962987023/
                      download: http://freshmeat.net/redir/download/962987023/

                      description:
                      Alzabo is a two-fold program. Its first function is as a data modelling
                      tool. Through either a schema creation interface or a custom Perl
                      program, it allows a programmer to create a set of schema, table,
                      column, etc. objects that represent a data model. Alzabo is also
                      capable of reverse engineering an existing data model. Its second
                      function is as a RDBMS to object mapping system. Once you have created
                      a schema, you can use Alzabo classes to access its data. These classes
                      offer a low level interface to common operations such as SQL SELECT,
                      INSERT, DELETE, and UPDATE commands.

                      Changes:
                      Initial Freshmeat announcement.

                      |> http://freshmeat.net/news/2000/07/07/962999611.html


                      From: freshd@...
                      Subject: ObjectArtist snapshot20000701 - A development tool to create OO-Software with UML
                      Date: 9 Jul 2000 18:48:15 GMT

                      application: ObjectArtist snapshot20000701
                      author: Sven Daumann <SvenD@...>
                      license: GPL
                      category: Development/Environments
                      urgency: low

                      homepage: http://freshmeat.net/redir/homepage/927393111/
                      download: http://freshmeat.net/redir/download/927393111/

                      description:
                      ObjectArtist is a development tool to create object-oriented software.
                      It uses UML diagrams for modeling and stores the models in XMI, an XML
                      based format.

                      Changes:
                      A rewrite of the Model-View-Controller architecture resulting in a
                      better repainting in JDK 1.2, and a change to Ant as the build tool.

                      |> http://freshmeat.net/news/2000/07/09/963168527.html






                      Regards,
                      Manuel Lemos

                      Web Programming Components using PHP Classes.
                      Look at: http://phpclasses.UpperDesign.com/?user=mlemos@...
                      --
                      E-mail: mlemos@...
                      URL: http://www.mlemos.e-na.net/
                      PGP key: http://www.mlemos.e-na.net/ManuelLemos.pgp
                      --
                    Your message has been successfully submitted and would be delivered to recipients shortly.