From: Ken Youens-Clark Date: Mon, 16 Jun 2003 22:01:38 +0000 (+0000) Subject: Created a more generic README for the project. X-Git-Tag: v0.02~12 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=c047df29f77f7e1cf7f2bbda3889bcd204bf49b3;p=dbsrgits%2FSQL-Translator.git Created a more generic README for the project. --- diff --git a/README b/README index ef158e0..b8e887a 100644 --- a/README +++ b/README @@ -1,272 +1,99 @@ -NAME - SQL::Translator - convert schema from one database to another - -SYNOPSIS - use SQL::Translator; - - my $translator = SQL::Translator->new( - debug => 1, # Print debug info - trace => 0, # Print Parse::RecDescent trace - no_comments => 0, # Don't include comments in output - show_warnings => 0, # Print name mutations, conflicts - add_drop_table => 1, # Add "drop table" statements - - # Make all table names CAPS in producers which support this option - format_table_name => sub {my $tablename = shift; return uc($tablename)}, - - # Null-op formatting, only here for documentation's sake - format_package_name => sub {return shift}, - format_fk_name => sub {return shift}, - format_pk_name => sub {return shift}, - ); - - my $output = $translator->translate( - from => "MySQL", - to => "Oracle", - # Or an arrayref of filenames, i.e. [ $file1, $file2, $file3 ] - filename => $file, - ) or die $translator->error; - - print $output; - -DESCRIPTION - This module attempts to simplify the task of converting one database - create syntax to another through the use of Parsers (which understand - the source format) and Producers (which understand the destination - format). The idea is that any Parser can be used with any Producer in - the conversion process. So, if you wanted Postgres-to-Oracle, you would - use the Postgres parser and the Oracle producer. - -CONSTRUCTOR - The constructor is called "new", and accepts a optional hash of options. - Valid options are: - - * parser / from - - * parser_args - - * producer / to - - * producer_args - - * filename / file - - * data - - * debug - - All options are, well, optional; these attributes can be set via - instance methods. Internally, they are; no (non-syntactical) advantage - is gained by passing options to the constructor. - -METHODS - add_drop_table - - Toggles whether or not to add "DROP TABLE" statements just before the - create definitions. - - custom_translate - - Allows the user to override default translation of fields. For example, - if a MySQL "text" field would normally be converted to a "long" for - Oracle, the user could specify to change it to a "CLOB." Accepts a - hashref where keys are the "from" value and values are the "to," returns - the current value of the field. - - no_comments - - Toggles whether to print comments in the output. Accepts a true or false - value, returns the current value. - - producer - - The "producer" method is an accessor/mutator, used to retrieve or define - what subroutine is called to produce the output. A subroutine defined as - a producer will be invoked as a function (*not a method*) and passed 2 - parameters: its container "SQL::Translator" instance and a data - structure. It is expected that the function transform the data structure - to a string. The "SQL::Transformer" instance is provided for - informational purposes; for example, the type of the parser can be - retrieved using the "parser_type" method, and the "error" and "debug" - methods can be called when needed. - - When defining a producer, one of several things can be passed in: A - module name (e.g., "My::Groovy::Producer"), a module name relative to - the "SQL::Translator::Producer" namespace (e.g., "MySQL"), a module name - and function combination ("My::Groovy::Producer::transmogrify"), or a - reference to an anonymous subroutine. If a full module name is passed in - (for the purposes of this method, a string containing "::" is considered - to be a module name), it is treated as a package, and a function called - "produce" will be invoked: "$modulename::produce". If $modulename cannot - be loaded, the final portion is stripped off and treated as a function. - In other words, if there is no file named - My/Groovy/Producer/transmogrify.pm, "SQL::Translator" will attempt to - load My/Groovy/Producer.pm and use "transmogrify" as the name of the - function, instead of the default "produce". - - my $tr = SQL::Translator->new; - - # This will invoke My::Groovy::Producer::produce($tr, $data) - $tr->producer("My::Groovy::Producer"); - - # This will invoke SQL::Translator::Producer::Sybase::produce($tr, $data) - $tr->producer("Sybase"); - - # This will invoke My::Groovy::Producer::transmogrify($tr, $data), - # assuming that My::Groovy::Producer::transmogrify is not a module - # on disk. - $tr->producer("My::Groovy::Producer::transmogrify"); - - # This will invoke the referenced subroutine directly, as - # $subref->($tr, $data); - $tr->producer(\&my_producer); - - There is also a method named "producer_type", which is a string - containing the classname to which the above "produce" function belongs. - In the case of anonymous subroutines, this method returns the string - "CODE". - - Finally, there is a method named "producer_args", which is both an - accessor and a mutator. Arbitrary data may be stored in name => value - pairs for the producer subroutine to access: - - sub My::Random::producer { - my ($tr, $data) = @_; - my $pr_args = $tr->producer_args(); - - # $pr_args is a hashref. - - Extra data passed to the "producer" method is passed to "producer_args": - - $tr->producer("xSV", delimiter => ',\s*'); - - # In SQL::Translator::Producer::xSV: - my $args = $tr->producer_args; - my $delimiter = $args->{'delimiter'}; # value is ,\s* - - parser - - The "parser" method defines or retrieves a subroutine that will be - called to perform the parsing. The basic idea is the same as that of - "producer" (see above), except the default subroutine name is "parse", - and will be invoked as "$module_name::parse($tr, $data)". Also, the - parser subroutine will be passed a string containing the entirety of the - data to be parsed. - - # Invokes SQL::Translator::Parser::MySQL::parse() - $tr->parser("MySQL"); - - # Invokes My::Groovy::Parser::parse() - $tr->parser("My::Groovy::Parser"); - - # Invoke an anonymous subroutine directly - $tr->parser(sub { - my $dumper = Data::Dumper->new([ $_[1] ], [ "SQL" ]); - $dumper->Purity(1)->Terse(1)->Deepcopy(1); - return $dumper->Dump; - }); - - There is also "parser_type" and "parser_args", which perform analogously - to "producer_type" and "producer_args" - - show_warnings - - Toggles whether to print warnings of name conflicts, identifier - mutations, etc. Probably only generated by producers to let the user - know when something won't translate very smoothly (e.g., MySQL "enum" - fields into Oracle). Accepts a true or false value, returns the current - value. - - translate - - The "translate" method calls the subroutines referenced by the "parser" - and "producer" data members (described above). It accepts as arguments a - number of things, in key => value format, including (potentially) a - parser and a producer (they are passed directly to the "parser" and - "producer" methods). - - Here is how the parameter list to "translate" is parsed: - - * 1 argument means it's the data to be parsed; which could be a string - (filename) or a reference to a scalar (a string stored in memory), - or a reference to a hash, which is parsed as being more than one - argument (see next section). - - # Parse the file /path/to/datafile - my $output = $tr->translate("/path/to/datafile"); - - # Parse the data contained in the string $data - my $output = $tr->translate(\$data); - - * More than 1 argument means its a hash of things, and it might be - setting a parser, producer, or datasource (this key is named - "filename" or "file" if it's a file, or "data" for a SCALAR - reference. - - # As above, parse /path/to/datafile, but with different producers - for my $prod ("MySQL", "XML", "Sybase") { - print $tr->translate( - producer => $prod, - filename => "/path/to/datafile", - ); - } - - # The filename hash key could also be: - datasource => \$data, - - You get the idea. - - filename, data - - Using the "filename" method, the filename of the data to be parsed can - be set. This method can be used in conjunction with the "data" method, - below. If both the "filename" and "data" methods are invoked as - mutators, the data set in the "data" method is used. - - $tr->filename("/my/data/files/create.sql"); - - or: - - my $create_script = do { - local $/; - open CREATE, "/my/data/files/create.sql" or die $!; - ; - }; - $tr->data(\$create_script); - - "filename" takes a string, which is interpreted as a filename. "data" - takes a reference to a string, which is used as the data to be parsed. - If a filename is set, then that file is opened and read when the - "translate" method is called, as long as the data instance variable is - not set. - - trace - - Turns on/off the tracing option of Parse::RecDescent. + SQL::Translator README + +The SQLFairy project began with the idea of simplifying the task of +converting one database create syntax to another through the use of +Parsers (which understand the source format) and Producers (which +understand the destination format). The idea is that any Parser can be +used with any Producer in the conversion process, so, if you wanted +Postgres-to-Oracle, you would use the Postgres parser and the Oracle +producer. The project has since grown to include parsing structured data +files like Excel spreadsheets and delimited text files and the +production of various documentation aids, such as images, graphs, POD, +and HTML descriptions of the schema, as well as automatic code +generators through the use of Class::DBI. Presently only the definition +parts of SQL are handled (CREATE, ALTER), not the manipulation of data +(INSERT, UPDATE, DELETE). + +As of version 0.02, parsers exist for the following: + + Excel + MySQL + Oracle + PostgreSQL + Sybase + xSV (arbitrarily delimited text files) + +And the following producers exist: + + ClassDBI: Class::DBI classes + Diagram: quasi-ER diagrams using libgd + GraphViz: ER diagrams using GraphViz + HTML: HTML documentation of schema + MySQL: MySQL-specific schema + Oracle: Oracle-specific schema + POD: Plain Old Documenation of schema + PostgreSQL: PostgreSQL-specific schema + SQLite: SQLite-specific schema + Sybase: Sybase-specific schema + XML: structure of the schema described in XML + +You can, of course, define your own parsers or producers and pair them +with existing parsers or producers as long as they adhere to the API +of the SQL::Translator::Schema object. + +Included in this distribution are a few scripts designed to be user +interfaces for the actual SQL::Translator modules. In the "bin" +directory, you will find: + +* sqlt-diagram.pl +* sqlt-graph.pl +* sql_translator.cgi +* sql_translator.pl + +All scripts ending in ".pl" are meant to be run from the command line +with various switches to control the input and output of the scripts, +while the ".cgi" script is a web-form frontend. The script you'll +probably find most useful is the "sql_translator.pl" script which is +meant to be the main interface for translating from text-to-text. The +graphic producers, however, have many extra switches, so there are +scripts specific for each of the the GraphViz an ER-diagram producers. +All scripts start with "sql" so it will be easier to identify them on +your system. All the "*.pl" scripts will be installed in the normal +installation process, but you'll have to put the CGI script into your +web CGI directory to use it. + +If you're more interested in using the SQL::Translator modules +directly, then you might be more interested to examine some of the +test scripts in the "t" directory. While the test suite isn't +currently as thorough as it should be, you will definitely get the +idea of how to parse a file and manipulate the SQL::Translator::Schema +objects. AUTHORS - Ken Y. Clark, , darren chamberlain , - Chris Mungall , Allen Day - + +Ken Y. Clark, , +darren chamberlain , +Chris Mungall , +Allen Day , +Sam Angiuoli , +Ying Zhang , +Mike Mellilo . COPYRIGHT - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; version 2. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General - Public License for more details. +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; version 2. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +Public License for more details. -BUGS - Please use http://rt.cpan.org/ for reporting bugs. +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -SEE ALSO - the perl manpage, the SQL::Translator::Parser manpage, the - SQL::Translator::Producer manpage, the Parse::RecDescent manpage +BUGS +Please use http://rt.cpan.org/ for reporting bugs.