/*
* CodaResultSet.java
*
* Created on March 13, 2007, 3:52 AM
*
* CodaServer and related original technologies are copyright 2008, 18th Street Software, LLC.
*
* Permission to use them is granted under the terms of the GNU GPLv2.
*/
package org.codalang.codaserver.database;
import org.glowacki.CalendarParser;
import org.glowacki.CalendarParserException;
import java.util.Calendar;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Vector;
/**
*
* @author michaelarace
*/
public class CodaResultSet {
protected Vector<CodaResultSetColumnHeading> columnHeadings = new Vector();
protected Vector<CodaResultSetRow> data =new Vector();
protected Hashtable nameColumns = new Hashtable();
// pointer to the current row
protected int rowPointer = -1;
// error fields
protected boolean errorStatus = false;
protected String errorString;
public CodaResultSet (Vector columnHeadings) {
this.columnHeadings = columnHeadings;
if (columnHeadings != null) {
Iterator it = columnHeadings.iterator();
int i = 0;
while(it.hasNext()) {
CodaResultSetColumnHeading cd = (CodaResultSetColumnHeading)it.next();
nameColumns.put(cd.getName(), new Integer(i));
i++;
}
}
}
public CodaResultSet (String errorString) {
this.errorStatus = true;
this.errorString = errorString;
}
public void addRow(Vector data) throws ArrayIndexOutOfBoundsException {
if (data.size() != this.columnHeadings.size()) {
throw new ArrayIndexOutOfBoundsException("Data Vector contains incorrect number of columns.");
} else {
this.data.add(new CodaResultSetRow(data));
}
}
// error functions
public boolean getErrorStatus () {
return errorStatus;
}
public String getErrorString () {
return errorString;
}
// metadata functions
public Vector getColumnHeadings() {
return columnHeadings;
}
public Hashtable getNameColumns() {
return nameColumns;
}
public int getRowPointer() {
return rowPointer;
}
public int getColumnCount() {
return columnHeadings.size();
}
public Vector getColumnNames () {
Vector retval = new Vector();
Iterator i = columnHeadings.iterator();
while (i.hasNext()) {
retval.add(((CodaResultSetColumnHeading)i.next()).getName());
}
return retval;
}
public String getColumnName(int index) {
return ((CodaResultSetColumnHeading)columnHeadings.get(index)).getName();
}
public Vector getColumnTypes () {
Vector retval = new Vector();
Iterator i = columnHeadings.iterator();
while (i.hasNext()) {
retval.add(((CodaResultSetColumnHeading)i.next()).getType());
}
return retval;
}
public String getColumnType(int index) {
return ((CodaResultSetColumnHeading)columnHeadings.get(index)).getType();
}
public int getRowsReturned() {
return data.size();
}
// iterator and fetch data functions
public void reset() {
rowPointer = -1;
}
public boolean next() {
rowPointer++;
if (rowPointer >= this.getRowsReturned()) {
rowPointer = this.getRowsReturned();
return false;
} else {
return true;
}
}
public boolean previous() {
rowPointer--;
if (rowPointer < 0) {
rowPointer = -1;
return false;
} else {
return true;
}
}
public Vector getData() {
return data;
}
public String getData(int index) {
return ((CodaResultSetRow)data.get(rowPointer)).getDataValue(index);
}
public String getData(String index) {
return ((CodaResultSetRow)data.get(rowPointer)).getDataValue(((Integer)nameColumns.get(index)).intValue());
}
public java.util.Calendar getDataDate(int index) {
Calendar c = null;
try {
c = CalendarParser.parse(((CodaResultSetRow)data.get(rowPointer)).getDataValue(index));
} catch (CalendarParserException ex) {
// do nothing
}
return c;
}
public java.util.Calendar getDataDate(String index) {
Calendar c = null;
try {
c = CalendarParser.parse(((CodaResultSetRow)data.get(rowPointer)).getDataValue(((Integer)nameColumns.get(index)).intValue()));
} catch (CalendarParserException ex) {
// do nothing
}
return c;
}
public int getDataInt(int index) {
return Integer.parseInt(((CodaResultSetRow)data.get(rowPointer)).getDataValue(index));
}
public int getDataInt(String index) {
return Integer.parseInt(((CodaResultSetRow)data.get(rowPointer)).getDataValue(((Integer)nameColumns.get(index)).intValue()));
}
public long getDataLong(int index) {
return Long.parseLong(((CodaResultSetRow)data.get(rowPointer)).getDataValue(index));
}
public long getDataLong(String index) {
return Long.parseLong(((CodaResultSetRow)data.get(rowPointer)).getDataValue(((Integer)nameColumns.get(index)).intValue()));
}
public float getDataFloat(int index) {
return Float.parseFloat(((CodaResultSetRow)data.get(rowPointer)).getDataValue(index));
}
public float getDataFloat(String index) {
return Float.parseFloat(((CodaResultSetRow)data.get(rowPointer)).getDataValue(((Integer)nameColumns.get(index)).intValue()));
}
public double getDataDouble(int index) {
return Double.parseDouble(((CodaResultSetRow)data.get(rowPointer)).getDataValue(index));
}
public double getDataDouble(String index) {
return Double.parseDouble(((CodaResultSetRow)data.get(rowPointer)).getDataValue(((Integer)nameColumns.get(index)).intValue()));
}
public boolean getDataBoolean(int index) {
return ((CodaResultSetRow)data.get(rowPointer)).getDataValue(index).equals("1");
}
public boolean getDataBoolean(String index) {
return ((CodaResultSetRow)data.get(rowPointer)).getDataValue(((Integer)nameColumns.get(index)).intValue()).equals("1");
}
public byte[] getDataByteArray(int index) {
return ((CodaResultSetRow)data.get(rowPointer)).getDataValue(index).getBytes();
}
public byte[] getDataByteArray(String index) {
return ((CodaResultSetRow)data.get(rowPointer)).getDataValue(((Integer)nameColumns.get(index)).intValue()).getBytes();
}
public Hashtable serialize () {
Hashtable retval = new Hashtable();
Vector<Hashtable> columnData = new Vector();
Vector<Vector> rowData = new Vector();
for (CodaResultSetColumnHeading heading : columnHeadings) {
Hashtable temp = new Hashtable();
temp.put("columnname", heading.getName());
temp.put("sqltype", heading.getSqlType());
columnData.add(temp);
}
for (CodaResultSetRow rsRow : data) {
rowData.add(rsRow.getData());
}
retval.put("columns", columnData);
retval.put("data", rowData);
return retval;
}
}