NAME
    SQL::Maker - Yet another SQL builder

SYNOPSIS
        use SQL::Maker;

        my $builder = SQL::Maker->new(
            driver => 'SQLite', # or your favorite driver
        );

        # SELECT
        ($sql, @binds) = $builder->select($table, \@fields, \%where, \%opt);

        # INSERT
        ($sql, @binds) = $builder->insert($table, \%values);

        # DELETE
        ($sql, @binds) = $builder->delete($table, \%values);

        # UPDATE
        ($sql, @binds) = $builder->update($table, \%set, \%where);
        ($sql, @binds) = $builder->update($table, \@set, \%where);

DESCRIPTION
    SQL::Maker is yet another SQL builder class. It is based on
    DBIx::Skinny's SQL generator.

METHODS
    my $builder = SQL::Maker->new(%args);
        Create new instance of SQL::Maker.

        Attributes are following:

        driver: Str
            Driver name is required. The driver type is needed to create SQL
            string.

        quote_char: Str
            This is the character that a table or column name will be quoted
            with.

            Default: auto detect from $driver.

        name_sep: Str
            This is the character that separates a table and column name.

            Default: '.'

        new_line: Str
            This is the character that separates a part of statements.

            Default: '\n'

    my $select = $builder->new_select(%args|\%args);
        Create new instance of SQL::Maker::Select from the settings from
        $builder.

        This method returns instance of SQL::Maker::Select.

    my ($sql, @binds) = $builder->select($table|\@tables, \@fields,
    \%where|\@where|$where, \%opt);
            my ($sql, @binds) = $builder->select('user', ['*'], {name => 'john'}, {order_by => 'user_id DESC'});
            # =>
            #   SELECT * FROM `user` WHERE (`name` = ?) ORDER BY user_id DESC
            #   ['john']

        This method returns SQL string and bind variables for SELECT
        statement.

        $table
        \@tables
            Table name for FROM clause in scalar or arrayref. You can
            specify the instance of SQL::Maker::Select for sub-query.

        \@fields
            This is a list for retrieving fields from database.

        \%where
        \@where
        $where
            where clause from hashref or arrayref via SQL::Maker::Condition,
            or SQL::Maker::Condition object.

        \%opt
            This is a options for SELECT statement

            $opt->{prefix}
                This is a prefix for SELECT statement.

                For example, you can provide the 'SELECT SQL_CALC_FOUND_ROWS
                '. It's useful for MySQL.

                Default Value: 'SELECT '

            $opt->{limit}
                This option makes 'LIMIT $n' clause.

            $opt->{offset}
                This option makes 'OFFSET $n' clause.

            $opt->{order_by}
                This option makes ORDER BY clause

                You can write it as following forms:

                    $builder->select(..., order_by => 'foo DESC, bar ASC');
                    $builder->select(..., order_by => ['foo DESC', 'bar ASC']);
                    $builder->select(..., order_by => {foo => 'DESC'});
                    $builder->select(..., order_by => [{foo => 'DESC'}, {bar => 'ASC'}]);

            $opt->{group_by}
                This option makes GROUP BY clause

                You can write it as following forms:

                    $builder->select(..., group_by => 'foo DESC, bar ASC');
                    $builder->select(..., group_by => ['foo DESC', 'bar ASC']);
                    $builder->select(..., group_by => {foo => 'DESC'});
                    $builder->select(..., group_by => [{foo => 'DESC'}, {bar => 'ASC'}]);

            $opt->{having}
                This option makes HAVING clause

            $opt->{for_update}
                This option makes 'FOR UPDATE" clause.

            $opt->{joins}
                This option makes 'JOIN' via SQL::Maker::Condition.

    my ($sql, @binds) = $builder->insert($table, \%values|\@values);
            my ($sql, @binds) = $builder->insert(user => {name => 'john'});
            # =>
            #    INSERT INTO `user` (`name`) VALUES (?)
            #    ['john']

        Generate INSERT query.

        $table
            Table name in scalar.

        \%values
            This is a values for INSERT statement.

    my ($sql, @binds) = $builder->delete($table, \%where|\@where|$where);
            my ($sql, @binds) = $builder->delete($table, \%where);
            # =>
            #    DELETE FROM `user` WHERE (`name` = ?)
            #    ['john']

        Generate DELETE query.

        $table
            Table name in scalar.

        \%where
        \@where
        $where
            where clause from hashref or arrayref via SQL::Maker::Condition,
            or SQL::Maker::Condition object.

    my ($sql, @binds) = $builder->update($table, \%set|@set,
    \%where|\@where|$where);
        Generate UPDATE query.

            my ($sql, @binds) = $builder->update('user', ['name' => 'john', email => 'john@example.com'], {user_id => 3});
            # =>
            #    'UPDATE `user` SET `name` = ?, `email` = ? WHERE (`user_id` = ?)'
            #    ['john','john@example.com',3]

        $table
            Table name in scalar.

        \%set
            Setting values.

        \%where
        \@where
        $where
            where clause from hashref or arrayref via SQL::Maker::Condition,
            or SQL::Maker::Condition object.

PLUGINS
    SQL::Maker supports plugin system. Write the code like following.

        package My::SQL::Maker;
        use parent qw/SQL::Maker/;
        __PACKAGE__->load_plugin('InsertMulti');

FAQ
    Why don't you use SQL::Abstract?
        I need more extensible one.

        So, this module contains SQL::Maker::Select, the extensible SELECT
        clause object.

AUTHOR
    Tokuhiro Matsuno <tokuhirom AAJKLFJEF@ GMAIL COM>

SEE ALSO
    SQL::Abstract

    Whole code was taken from DBIx::Skinny by nekokak++.

LICENSE
    Copyright (C) Tokuhiro Matsuno

    This library is free software; you can redistribute it and/or modify it
    under the same terms as Perl itself.