DBD::Chart 0.43 - Perl DBI Driver abstraction for rendering charts and graphs
Author: By Dean Arnold
Description: DBD::Chart Reference and User Guide.
Keywords: Chart, graph, chart, Perl, perl, DBD, DBI, PNG, GD

## NAME

### DBD::Chart - Perl DBI Driver interface For Rendering Charts and Graphs

- SYNOPSIS
- DESCRIPTION
- VERSION
- CHANGE HISTORY
- DRIVER-SPECIFIC BEHAVIOR
  - DATA-SOURCE NAME
  - DATA TYPES
  - SQL DIALECT
  - ERROR HANDLING
  - DIAGNOSTICS
  - DRIVER-SPECIFIC ATTRIBUTES
  - DRIVER-SPECIFIC FUNCTIONS
- PREREQUISITES AND CONFORMANCE
- KNOWN BUGS
- TO DO List
- ACKNOWLEDGEMENTS
- REFERENCES
- COPYRIGHT

## SYNOPSIS

        use DBI;
        my $dbh = DBI->connect('dbi:Chart:');
            or die "Cannot connect\n";
        #
        #    example: create a pie chart
        #
        $dbh->do('CREATE TABLE pie (region CHAR(20), sales FLOAT)');
        $sth = $dbh->prepare('INSERT INTO pie VALUES( ?, ?)');
        $sth->execute('East', 2756.34);
        $sth->execute('Southeast', 3456.78);
        $sth->execute('Midwest', 1234.56);
        $sth->execute('Southwest', 4569.78);
        $sth->execute('Northwest', 33456.78);

        $rsth = $dbh->prepare(
        "SELECT PIECHART FROM pie
            WHERE WIDTH=400 AND HEIGHT=400 AND
            TITLE = \'Sales By Region\' AND
            COLOR=(red, green, blue, lyellow, lpurple) AND
            BACKGROUND=lgray AND
            SIGNATURE=\'Copyright(C) 2001, GOWI Systems, Inc.\'");
        $rsth->execute;
        $rsth->bind_col(1, \$buf);
        $rsth->fetch;

produces the image

        #
        # multi-range 3-D bar chart
        #
        $dbh->do('CREATE TABLE bars (quarter SMALLINT, East FLOAT, '.
        'Southeast FLOAT, Midwest FLOAT, Southwest FLOAT, Northwest FLOAT)');
        $sth = $dbh->prepare('INSERT INTO bars VALUES(?, ?, ?, ?, ?, ?)');
        $sth->execute(1, -2756.34, 3456.78, 1234.56, -4569.78, 33456.78);
        $sth->execute(2, 2756.34, 3456.78, 1234.56, 4569.78, 33456.78);
        $sth->execute(3, 2756.34, 3456.78, -1234.56, 4569.78, 33456.78);
        $sth->execute(4, 2756.34, -3456.78, 1234.56, 4569.78, 33456.78);

        $rsth = $dbh->prepare(
        "SELECT BARCHART FROM bars
        	WHERE WIDTH=600 AND HEIGHT=400 AND X-AXIS=\'Quarter\' AND
        	Y-AXIS=\'Revenue\' AND TITLE = \'Quarterly Revenue By Region\' AND
        	3-D=1 AND SHOWVALUES=1 AND COLOR=(red, green, blue, yellow, dbrown)");
        $rsth->execute;
        $rsth->bind_col(1, \$buf);
        $rsth->fetch;

produces the image

        #
        # scatter graph
        #
        $dbh->do('CREATE CHART line (Month SMALLINT, sales FLOAT)');
        $sth = $dbh->prepare('INSERT INTO line VALUES( ?, ?)');
        $sth->execute(1, 2756.34);
        $sth->execute(2, 3456.78);
                ...insert some more rows.....
        $sth->execute(12, 90.57);

        $rsth = $dbh->prepare(
        "SELECT POINTGRAPH FROM line
            WHERE WIDTH=500 AND HEIGHT=300 AND X-AXIS=\'Sales\' AND
            TITLE = \'Sales By Region\' AND COLOR=black AND SHOWGRID=0 AND
            SHAPE=filldiamond AND SHOWVALUES=1");
        $rsth->execute;
        $rsth->bind_col(1, \$buf);
        $rsth->fetch;

produces the image

        #
        # multi-range line w/ points, bkground image, and signature
        #
        $dbh->do('DROP CHART line');
        $dbh->do('CREATE CHART line (Month SMALLINT, East FLOAT, ' .
        'Southeast float, Midwest float, Southwest float, Northwest float)');
        $sth = $dbh->prepare('INSERT INTO line VALUES( ?, ?, ?, ?, ?, ?)');
        $sth->execute(1, 2756.34, 3456.90, 1234.99, 1005.34, 2876.34);
        $sth->execute(2, 3456.78, undef, 4321.25, 9001.34, 997.68);
                ...insert some more rows.....
        $sth->execute(12, 90.57,3456.90, 1234.99, undef, 2876.34);

        $rsth = $dbh->prepare(
        "SELECT LINEGRAPH FROM line
            WHERE WIDTH=? AND HEIGHT=? AND X-AXIS=? AND Y-AXIS=? AND
            TITLE = \'Monthly Sales By Region\' AND
            COLOR=(red, green, blue, yellow, lbrown) AND
            SHOWPOINTS=1 AND SHOWGRID=1 AND
            SHAPE=(fillcircle, fillsquare, filldiamond, horizcross, diagcross) AND
            LOGO=\'gowilogo.png\' AND BACKGROUND=lgray AND
            X-ORIENT=\'VERTICAL\' AND
            SIGNATURE=\'Copyright(C) 2001, GOWI Systems, Inc.\'");
        $rsth->execute(400, 400, 'Month', 'Sales');
        $rsth->bind_col(1, \$buf);
        $rsth->fetch;

produces the image

        $dbh->do('CREATE CHART line (Month SMALLINT, East FLOAT, ' .
        'Southeast float, Midwest float, Southwest float, Northwest float)');
        $sth = $dbh->prepare('INSERT INTO line VALUES( ?, ?, ?, ?, ?, ?)');

        @month = (1,2,3,4,5,6,7,8,9,10,11,12);
        @east = ( 2756.34, 3456.90, 1234.99, 1005.34, 2876.34, 3456.78, undef,
        	4321.25, 9001.34, 997.68, 1234.56, 7783.20);
        @seast = ( 5321.11, 3333.33, 876.10, 4569.78, 4326.3,  -7895.44, 4444.44,
        	12345.29, 3456.78, 12094.5, 6666.66, 3322.11);
        @midwest = ( 9090.90, 908.57, -2367.4, 3399.55, 5555.55, 887.3, 756.34,
        	1111.11, 2222.22, 8888.88, 9456.3, undef);
        @swest = ( 7783.20, 5321.11, 3333.33, 876.10, 12349.56, 12094.5, 6666.66,
        	3322.11, 9090.90, 4569.78, 3456.99, 4321.25);
        @nwest = ( 9001.34, 997.68, 13456.78, 2367.4, 3399.55, 5555.55, 887.3,
        	90.57, 3456.90, 1234.99, undef, 2876.34);

        $sth->func(1, \@month, chart_bind_param_array);
        $sth->func(2, \@east, chart_bind_param_array);
        $sth->func(3, \@seast, chart_bind_param_array);
        $sth->func(4, \@midwest, chart_bind_param_array);
        $sth->func(5, \@swest, chart_bind_param_array);
        $sth->func(6, \@nwest, chart_bind_param_array);

        %stsary = ();
        $sth->func(\%stsary, chart_bind_param_status);

        $sth->execute;

        $rsth = $dbh->prepare(
        "SELECT AREAGRAPH FROM line
            WHERE WIDTH=400 AND HEIGHT=400 AND X-AXIS=\'Month\' AND
            Y-AXIS=\'Sales\' AND TITLE = \'Monthly Sales By Region\' AND
            COLOR=(red, green, blue, yellow, lbrown) AND
            SHOWPOINTS=1 AND SHOWGRID=1 AND
            SHAPE=(fillcircle, fillsquare, filldiamond, horizcross, diagcross)");
        $rsth->execute;
        $rsth->bind_col(1, \$buf);
        $rsth->fetch;

produces the image

        #
        # log-log line graph
        #
        $dbh->do('CREATE CHART line (Month FLOAT, sales FLOAT)');
        $sth = $dbh->prepare('INSERT INTO line VALUES( ?, ?)');
        for ($i = -3; $i < 13; $i++) {
    	    $sth->execute(5**$i, exp($i));
        }

        $rsth = $dbh->prepare(
        "SELECT LINEGRAPH FROM line
            WHERE WIDTH=450 AND HEIGHT=450 AND X-AXIS=\'5**X\' AND
            Y-AXIS=\'e**X\' AND Y-LOG=1 AND X-LOG=1 AND
            SHOWVALUES=0 AND TITLE = \'Sample Log-Log Linegraph\' AND
            COLOR=lred AND SHOWGRID=1 AND SHOWPOINTS=1");
        $rsth->execute;
        $rsth->bind_col(1, \$buf);
        $rsth->fetch;

produces the image

        #
        # simple candle graph, directly from another statement handle
        #
        $tddbh = DBI->connect('dbi:Teradata:dbc', 'dbitst', 'dbitst',
            { PrintError => 1, RaiseError => 0, AutoCommit => 1 });
        $tdsth = $tddbh->prepare(
        "SELECT TradeDay(VARCHAR(18)), lowprice, highprice
            FROM candle ORDER BY TradeDay");
        $tdsth->execute;

        $rsth = $dbh->prepare(
        "SELECT CANDLESTICK FROM ?
            WHERE WIDTH=? AND HEIGHT=? AND X-AXIS=? AND Y-AXIS=? AND
            TITLE = \'Daily Price Range\' AND COLOR=red AND SHOWGRID=1 AND
            SHAPE=filldiamond AND SHOWPOINTS=1 AND SHOWVALUES=0");
        $rsth->execute($tdsth, 300,400, 'Date', 'Price');
        $rsth->bind_col(1, \$buf);
        $rsth->fetch;

produces the image

        #
        #	use same data to render linegraph with symbolic domain
        #
        $tdsth->execute;

        $rsth = $dbh->prepare(
        "SELECT LINEGRAPH FROM ?
            WHERE WIDTH=400 AND HEIGHT=400 AND X-AXIS=\'Date\' AND
            Y-AXIS=\'Price\' AND TITLE = \'Daily Price Range\' AND
            COLOR=(red, blue) AND SHOWGRID=1 AND
            SHAPE=(filldiamond, fillsquare) AND SHOWPOINTS=1");

        $rsth->execute($tdsth);
        $rsth->bind_col(1, \$buf);
        $rsth->fetch;

produces the image

## DESCRIPTION

DBI driver abstraction for rendering pie charts, bar charts, line, point, area, and candlestick graphs. The default output format is PNG; JPEG and GIF format can be generated by setting the FORMAT property (see below), assuming the appropriate supporting libraries and modules are installed.
BE ADVISED: This is BETA software, and subject to change at the whim of the author(s).

Why DBD::Chart ? Basically, the idea is to make chart rendering easy for us database geeks...and maybe for other folks, as well. Being able to render a chart from a rowset by simply binding output column buffers as input parameter buffers for a simple INSERT, then just SELECT'ing to get the image, seemed like a nice abstraction.

BTW: This driver is 100% pure Perl.

## CURRENT VERSION

Release 0.43

ZIP version
.tar.gz version

## CHANGE HISTORY

Release 0.43:

- fix to support GIF via older GD packages (many thanks to Peter Scott!)
- other cosmetic fixes

Release 0.42:

- fix to support X-ORIENT='HORIZONTAL' on symbolic domains, candlesticks

Release 0.41:

- fix to strip quotes from string literal in INSERT statement
- fix for string literal column index variable in prepare of INSERT
- fix for Y-axis tick alignment when no grid is requested

Release 0.40:

- fix for DECIMAL, INTEGER, etc. last columns in CREATE TABLE
- fix for FORMAT property to properly handle as string value
- added Y-MAX, Y-MIN properties to control Y-axis min/max values for barcharts

Release 0.30:

- strip newlines from SQL for prepare()
- add BACKGROUND property to set background color, incl. transparent background
- add FORMAT property to select PNG or JPEG
- add X-ORIENT property to set X-tick label orientation
- add LOGO property to set a background image
- add SIGNATURE property to set a signature string in image
- add placeholder support in SELECT WHERE clause
- add KEEPORIGIN property to force (0,0) in the graph
- auto-skip symbolic X-axis vertical tick labels when they overlap
- add parameterized chart datasource (i.e., SELECT BARCHART FROM ? WHERE...)

Release 0.20:

- added support for 3-D bar and pie charts (via GD::Graph3d)
- added logarithmic line/point graph support
- added area graphs
- added candlestick charts (e.g., for daily trading range charts)
- added support for non-numeric domain values
- packaged for CPAN

Release 0.10:

- Coded; first alpha release

## DRIVER-SPECIFIC BEHAVIOR

### DATA-SOURCE NAME

The dsn string passed to `DBI->connect()` is simply `'dbi:Chart:'`. No username or password is required.

### DATA TYPES

Range (i.e., Y-axis) values must be defined as numbers. INTEGER, FLOAT, SMALLINT, TINYINT, and DECIMAL are all acceptable number types. Domain (i.e., X-axis) values may be either numeric or non-numeric (including CHAR, VARCHAR, DATE, TIME, TIMESTAMP, etc.). A non-numeric (i.e., "symbolic") domain will result in a uniformly distributed mapping of values to the X-axis. For pie and barcharts, and candlestick graphs, all domain types are treated as symbolic; for all other graph types, a numeric domain will be mapped using the actual (scaled) numeric values.

### Date, Time, and Timestamp Types

Obviously, handling these data types is important for temporal graphs. For now, however, we just treat them as symbolic values, the same as CHAR or VARCHAR.

### SQL DIALECT

DBD::Chart uses a small subset of SQL to create, populate, render, and discard chart data:

- `CREATE { TABLE | CHART } chartname ( <domain-definitions> )`

  Creates a chart object that can be populated with datapoints and subsequently rendered. `<domain-definitions>` is a list of column definitions which must follow these rules:

  For pie charts:

  1. no more than 2 columns should be defined; extra columns will be ignored when the chart is rendered.
  2. the 1st column contains the text of label applied to the associated wedge of the pie.
  3. the 2nd column must be numeric and defines the domain values to be plotted.

  For bar charts:

  1. at least 2 columns must be defined
  2. the 1st column contains the text label printed along the X axis for each bar (if only a single domain column is defined) or group of bars (if more than 1 domain column is defined).
  3. the remaining columns must be numeric. When more than 1 domain column is defined, the column values are plotted in groups by the associated label, i.e., all domains for each row are plotted in a group.

  For line, area, or point graphs:

  1. at least 2 columns must be defined.
  2. the 1st column defines the X-axis values for each row to be plotted (i.e., the "domain"), which may be of any type. Note that non-numeric domain types are handled symbolicly, as described above.
  3. each additional column is used as a Y-axis value for a distinct plot line or point-set within the rendered image (i.e., multiple ranges may be plotted against a single domain in a single graph).
  4. Y-axis values may be NULL, in which case the corresponding (X, Y) plot point will be omitted from the associated line or pointset.
  5. numeric domain datasets do not need to be INSERT'ed in order; the charting engine will automatically sort the domain values into ascending order. Non-numeric domains will be plotted in the same order as they are INSERT'd.

  For candlestick graphs:

  1. at least 3 columns must be defined.
  2. the 1st column defines the X-axis values for each candlestick to be plotted, which may be of any type.
  3. the 2nd column must be numeric, and is used as the minimum (bottom) value of the candlestick.
  4. the 3rd column must be numeric, and is used as the maximum (top) value of the candlestick.
  5. multiple sets of candlesticks can be plotted in the same graph by defining additional (minimum, maximum) columns.

  Column qualifers (e.g., NOT NULL, CASESPECIFIC, etc.) are not supported.

- `DROP { TABLE | CHART }chartname`

  Discards the specified chart context information. Any open statement handles which attempt to manipulate the chart after it has been dropped will return errors.

- `INSERT INTO chartname VALUES ( <? | NULL | literal> [, ...] )`

  Populates the chart with the specified data. A value must be provided for each column defined in the chart (i.e., no defaults are used.).

- `SELECT <chart-type> FROM <? | chartname>
  WHERE <qualifier> = <? | literal | literallist> [AND ...]`

  Renders an image containing the specified chart, using the qualifers to control how the image is rendered. Valid <chart-type> values are

  - PIECHART - generates a piechart; each wedge is represented as a percentage of the sum of all the domain values. Negative domain values result in an error.
  - BARCHART - generates a barchart; each bar is represented as a percentage of the largest value in the domain. Negative values are supported.
  - LINEGRAPH - generates a linegraph
  - AREAGRAPH - generates an areagraph (i.e., the area between plotline and X-axis is filled with the plot color).
  - POINTGRAPH - generates a pointgraph (i.e., scatter-graph)
  - CANDLESTICK - generates a candlestick graph

  The following qualifiers are allowed:

  - WIDTH - sets the image width in pixels; single value only
  - HEIGHT - sets the image height in pixels; single value only
  - SHOWGRID - when set to 1, causes the background grid of all charts/graphs except piecharts to be displayed. single value only, valid values are 0 and 1.
  - COLOR - sets the color of chart elements; may be multivalued, in which case each wedge(piechart), bar(barchart), line(linegraph), area(areagraph), pointset(scattergraph), or candlestick-set uses the next color in the list. The colorlist wraps if more range valuesets are defined than colors. Valid color values are `white, lgray, gray, dgray, black, lblue, blue, dblue, gold, lyellow, yellow, dyellow, lgreen, green. dgreen, lred, red, dred, lpurple, purple, dpurple, lorange, orange, pink, dpink, marine, cyan, lbrown, dbrown.`
  - SHAPE - sets the shape of points for line, area, point, or candlestick graphs; may be multivalued. Valid values are `fillsquare, opensquare, horizcross, diagcross, filldiamond, opendiamond, fillcircle, opencircle.`
  - SHOWPOINTS - for line, area, and candlestick graphs, determines whether datapoints are explicitly rendered; single value only. Ignored for pie and bar charts, and pointgraphs. Valid values are 0 and 1.
  - SHOWVALUES - for barcharts, line, area, point, and candlestick graphs, determines whether the datapoint values are displayed; single value only, valid values are 0 and 1, ignored for pie charts. When set to 1, the (X,Y) values are displayed just above the plotted datapoint for line, area, and point graphs; for candlesticks, the minimum and maximum Y values are plotted just above and below each candlestick.
  - X-LOG - causes values along the X-AXIS to be plotted in log10 form; for line, area, point, and candlestick graphs.
  - Y-LOG - causes values along the Y-AXIS to be plotted in log10 form; for line, area, point, and candlestick graphs.
  - X-AXIS - sets the label string on the X-AXIS of line, area, point, and candlestick graphs.
  - Y-AXIS - sets the label string on the Y-AXIS.
  - TITLE - sets the title string of the graph.
  - 3-D - sets the 3-D effect on either pie or bar charts.
  - BACKGROUND - sets the background color; default white. single value only, from list of legal colors or `transparent`.
  - LOGO - sets a background image; default none, single value only. Accepts a filename (optionally including path info) of an image file of either PNG, JPEG, or GIF format. The image will be centered under the graph image. If the image size is less than the defined specified WIDTH and/or HEIGHT, the BACKGROUND color will be used to fill to the edges. If the image exceeds the WIDTH and/or HEIGHT, the image will be clipped to fit.
  - SIGNATURE - sets a signature string to be printed in tiny font in the lower right hand corner of the image; single value, text string only, default none. E.g. "Copyright(C) 2001, GOWI Systems. All rights reserved.".
  - FORMAT - sets the output image format, either PNG, JPEG, or GIF. Single value, string, either 'PNG','JPEG', or 'GIF' (case insensitive).
  - X-ORIENT - sets the display angle of the X-axis tick labels; single value, case-insensitive string, either 'horizontal' or 'vertical', default horizontal.
  - KEEPORIGIN - forces the origin axes (0,0) in the image; single value, either 0 or 1, default 0. Normally, line, point, area, and candlestick graphs automatically clip away the origin axes if the plot does not cross the origin axis. Set this property to 1 to force the origin axis to be included. Ignored for pie or barcharts.
  - Y-MAX - sets the upper limit on Y-axis values; used for improved rendering of barcharts.
  - Y-MIN - sets the lower limit on Y-axis values; used for improved rendering of barcharts.

  Restrictions:

  - no expressions (e.g., X + Y) or functions (e.g., AVG(X)) are allowed.
  - ordering of wedges and bars in pie and barcharts is determined by the order the rows are INSERTed.
  - Ordering of plot points in line, area, and point graphs with numeric domains is ascending left to right on the X-axis, ascending bottom to top on Y-axis. Graphs with non-numeric domains are plotted in the order they are INSERT'd.
  - Due to a current misalignment problem in the GD::Graph3d::bar3d module, the alignment of text when setting SHOWVALUES=1 for 3-D barcharts may be less than appealing.
  - When generating area graphs with multiple range valuesets (i.e., more the 1 set of Y values), the order in which the range valuesets are plotted is column 2, column 3,...column N. This order may cause some ranges to be completely obscured by the areagraph of a succeding range. You'll need to experiment with the order of your range valuesets to get the best view.
  - Datasources for the chart may be either
    - a table explicitly CREATEd on the dbi:Chart database handle that has been populated via INSERTs
    - a valid DBI statement handle which has been `execute()`'d. When a parameterized FROM is specified in a SELECT statement, the application must bind a `prepare()`'d and `execute()`'d statement handle from any valid DBI data source, from which DBD::Chart will subsequently `fetch()` the data for populating the chart. In that case, the application does not need to explicitly CREATE and INSERT to a table for the chart. Obviously, the application must still be careful that the column data returned by the bound statement handle is of the proper format (as described above) and does not returned an excessive number of rows - DBD::Chart currently generates an error if more than 1,000 rows is returned by such a bound statement handle.
  - Setting the FORMAT to JPEG on Windows platforms may be problematic. The PPM of the GD package provided by ActiveState does not appear to include the jpeg-6b library, and the Makefile for the jpeg-6b library only builds a static library, rather than a DLL. To render JPEG format graphics requires building the jpeg library and then building the libgd package to include JPEG support.
  - Support for GIF image formats requires a compatible version of the GD modules (pre 1.20).
  - Y-MIN and Y-MAX currently only apply to barcharts and are subject to the restrictions of the GD::Graph::barchart module (i.e., the range must include zero and all the defined data points).

- `DELETE FROM chartname
  [ WHERE <domain-name> <operator> <? | literal>]`

  Removes one (or more) data points from the chart. Valid <operator>s are <, <=, =, >, >=, <>. E.g., this could be used to render realtime scrolling linegraphs where old values are rolled off the left of the graph, and new values are appended on the right.
  NOTE:Deleting from a barchart, then inserting new rows, will cause new rows to be displayed at the right end of the chart. Use UPDATE if you want to modified the bar values, but maintain the original display order.

- `UPDATE chartname
  SET <domain-name> = <? | literal>
  [ WHERE <domain-value> <operator> <? | literal>]`

  Replaces the point with the specified value with a new point value. Valid <operator>s are <, <=, =, >, >=, <>. E.g., this could be used with a bar chart to refresh the bar values in realtime (e.g., monitor User's CPU usage).

### ERROR HANDLING

Any errors generated from improper SQL usage are flagged with an error value of -1, and appropriate text in the errstr. Errors emanating from the GD::Graph or DBD::Chart::Plot modules will be flagged in err and errstr with whatever info is returned by those modules.

### DIAGNOSTICS

DBI provides the `trace()` function to enable various levels of trace information. DBD::Chart currently doesn't add any traces to this.

### DRIVER-SPECIFIC ATTRIBUTES

- chart_noverify - when set to 1 during connect(), verification of data values with target columns is bypassed (to provide some performance improvement).

### DRIVER-SPECIFIC FUNCTIONS

The following functions are provided to optimize data movement:
Note:generalized versions of these functions are currently under consideration for addition to the DBI specification.

- `$sth->chart_bind_param_array($paramnum, \@paramary [\%attr | $typespec])`

  binds an array of parameters to the statement; the entire array of parameters will be consumed when the statement is executed.

- `$sth->chart_bind_param_status(\@stsary | \%stshash)`

  binds an array or hash to receive parameter status information when parameter array binding has been used on the statement. If the array version is used, then status for every supplied parameter tuple is returned; if a hash is used, then only the status of unsuccessful parameter tuples is reported, using the ordinal tuple number as the hashkey.

Note: array binding of output values is not supported, since SELECT only returns a single value at a time, namely, the chart image.

## PREREQUISITES AND CONFORMANCE

DBD::Chart requires the following (versions are recommended only, cuz they're the version I built with...if you're feeling frisky, you can try older or newer versions.):

- Perl version 5.006
- DBI module 1.14.
- GD module 1.32
- GD::Graph module 1.32
- GD::Graph3d module 0.55
- GD::Text (aka GDTextUtil) module 0.80

Be advised that these modules require the following (non-Perl) libraries:

- libgd
- libpng
- zlib
- jpeg-6b (for JPEG support)

The following DBI functions are not supported:

    DBI->data_sources()
    $dbh->prepare_cached()
    $sth->table_info()
    $dbh->tables()
    $dbh->type_info_all()
    $dbh->type_info()

## KNOWN BUGS

Bug Number | Report Date | Release Reported in | Description | Status | Fix Release
--- | --- | --- | --- | --- | ---
1 | 2001-Mar-16 | 0.20 | SQL statements with newlines won't prepare() | Fixed | 0.30
2 | 2001-May-09 | 0.30 | INTEGER column definition as last column in CREATE TABLE causes an error | Fixed | 0.40
3 | 2001-May-09 | 0.30 | FORMAT property not properly handled as string property | Fixed | 0.40
4 | 2001-Jun-01 | 0.40 | Y-axis ticks not properly aligned when grid disabled | Fixed | 0.41
5 | 2001-Jun-01 | 0.40 | INSERT of string literal value kept quote mark | Fixed | 0.41
6 | 2001-Jun-01 | 0.40 | INSERT of string literal used bad column index variable | Fixed | 0.41
7 | 2001-Oct-01 | 0.41 | X-ORIENT='HORIZONTAL' didn't work with symbolic domains, candlesticks | Fixed | 0.42

## TO DO List

- SVG support
- XML template support
- FONT property to select fonts
- Support derived tables to layer graphs in an image
- clipped barcharts (i.e., Y axis starts > zero)
- (X, Y, Z) (i.e., true 3 axis) barcharts
- Box & whisker charts
- Gantt charts ?
- surfacemaps ?
- some limited meta-data capability
- Any suggestions?

## ACKNOWLEDGEMENTS

Many thanks to all the authors of the various GD, PNG,JPEG, and zlib modules. Special thanks to all the initial victims, er, users for their comments, complaints, and suggestions.

Special thanks to Peter Scott for the GIF support and a few other fixes!

## REFERENCES

- Official DBI Site
- CPAN
- Perl.com
- ActiveState (for Perl software for Windows)

## AUTHOR

Dean Arnold

## COPYRIGHT

Copyright (c) 2001, Dean Arnold, USA
Affiliations:

- Presicient Corp.,
- MyLines.com,
- Homepage

Permission is granted to use this software according to the terms of the GNU General Public License. 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; either version 2 of the License, or (at your option) any later version.

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.

Please note that this license prohibits the incorporation of the source code of this product in publicly distributed, but proprietary products (e.g., something you're trying to sell, as opposed to selling support for). However, proprietary products may invoke DBD::Chart.

I'm offering the software AS IS, and ACCEPT NO LIABILITY FOR ANY ERRORS OR OMMISSIONS IN, OR LOSSES INCURRED AS A RESULT OF USING DBD::Chart.

I reserve the right to provide support for this software to individual sites under a separate (possibly fee-based) agreement.

Last updated October 11, 2001