package jsqlite;

import java.util.Vector;

/**
 * Class representing an SQLite result set as
 * returned by the
 * <A HREF="Database.html#get_table(java.lang.String)">Database.get_table</A>
 * convenience method.
 * <BR><BR>
 * Example:<BR>
 * <p>
 * <PRE>
 * ...
 * SQLite.Database db = new SQLite.Database();
 * db.open("db", 0);
 * System.out.print(db.get_table("select * from TEST"));
 * ...
 * </PRE>
 * Example output:<BR>
 * <p>
 * <PRE>
 * id|firstname|lastname|
 * 0|John|Doe|
 * 1|Speedy|Gonzales|
 * ...
 * </PRE>
 */

public class TableResult implements Callback {

    /**
     * Number of columns in the result set.
     */

    public int ncolumns;

    /**
     * Number of rows in the result set.
     */

    public int nrows;

    /**
     * Column names of the result set.
     */

    public String column[];

    /**
     * Types of columns of the result set or null.
     */

    public String types[];

    /**
     * Rows of the result set. Each row is stored as a String array.
     */

    public Vector<String[]> rows;

    /**
     * Maximum number of rows to hold in the table.
     */

    public int maxrows = 0;

    /**
     * Flag to indicate Maximum number of rows condition.
     */

    public boolean atmaxrows;

    /**
     * Create an empty result set.
     */

    public TableResult() {
        clear();
    }

    /**
     * Create an empty result set with maximum number of rows.
     */

    public TableResult(int maxrows) {
        this.maxrows = maxrows;
        clear();
    }

    /**
     * Clear result set.
     */

    public void clear() {
        column = new String[0];
        types = null;
        rows = new Vector<String[]>();
        ncolumns = nrows = 0;
        atmaxrows = false;
    }

    /**
     * Callback method used while the query is executed.
     */

    @Override
    public void columns(String coldata[]) {
        column = coldata;
        ncolumns = column.length;
    }

    /**
     * Callback method used while the query is executed.
     */

    @Override
    public void types(String types[]) {
        this.types = types;
    }

    /**
     * Callback method used while the query is executed.
     */

    @Override
    public boolean newrow(String rowdata[]) {
        if (rowdata != null) {
            if (maxrows > 0 && nrows >= maxrows) {
                atmaxrows = true;
                return true;
            }
            rows.addElement(rowdata);
            nrows++;
        }
        return false;
    }

    /**
     * Make String representation of result set.
     */

    @Override
    public String toString() {
        StringBuffer sb = new StringBuffer();
        int i;
        for (i = 0; i < ncolumns; i++) {
            sb.append(column[i] == null ? "NULL" : column[i]);
            sb.append('|');
        }
        sb.append('\n');
        for (i = 0; i < nrows; i++) {
            int k;
            String row[] = rows.elementAt(i);
            for (k = 0; k < ncolumns; k++) {
                sb.append(row[k] == null ? "NULL" : row[k]);
                sb.append('|');
            }
            sb.append('\n');
        }
        return sb.toString();
    }
}
