package net.sourceforge.phpdt.sql.view.tableview; import java.util.Vector; import net.sourceforge.phpdt.sql.IConstants; import net.sourceforge.phpdt.sql.adapters.AdapterFactory; import net.sourceforge.phpdt.sql.adapters.DatabaseAdapter; import net.sourceforge.phpdt.sql.adapters.DatabaseInfo; import net.sourceforge.phpdt.sql.adapters.NoSuchAdapterException; import net.sourceforge.phpdt.sql.bookmarks.Bookmark; import net.sourceforge.phpdt.sql.sql.FilterSort; import net.sourceforge.phpdt.sql.sql.MultiSQLServer; import net.sourceforge.phpdt.sql.sql.SQLHelper; import net.sourceforge.phpdt.sql.sql.SQLResults; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; public class TableAdapter implements IConstants { public static final String DEFAULT = ""; public static final String UTF_8 = "UTF-8"; public static final String UTF_16 = "UTF-16"; private int pageSize = DefaultSizes.PAGE_SIZE; private int maxColumnSize = DefaultSizes.MAX_COLUMN_SIZE; private SQLHelper helper = new SQLHelper(); private FilterSort extra = new FilterSort(); private int offset = 1; private int totalSize = -1; private Vector rows = new Vector(); private Vector columnNames = new Vector(); private boolean hasMore = false; private String table; private String query; private String encoding = ""; private TableAdapter() { } public void fullMode() { offset = 1; pageSize = Integer.MAX_VALUE; } public void resetMode() { offset = 1; pageSize = DefaultSizes.PAGE_SIZE; } public static TableAdapter createFromQuery(SQLResults results) { TableAdapter retVal = new TableAdapter(); retVal.setQuery(results.getQuery()); retVal.setData(results); return retVal; } public static TableAdapter createFromTable(String table) { TableAdapter retVal = new TableAdapter(); retVal.setTable(table); return retVal; } private void loadSize() { if (table != null) { totalSize = helper.getSize(getTableCountQuery()); } } public int getStartIndex() { if (totalSize == 0) { return 0; } return offset; } public int getEndIndex() { return offset + rows.size() - 1; } public int getTotalSize() { return totalSize; } public void nextPage() { loadSize(); offset = offset + pageSize; if (totalSize >= 0 && offset > totalSize) { offset = offset - pageSize; } } public void previousPage() { offset = offset - pageSize; if (offset < 1) { offset = 1; } } public boolean hasNextPage() { if (table != null) { if (offset + pageSize <= totalSize) { return true; } return false; } return hasMore; } public boolean hasPreviousPage() { if (offset > 1) { return true; } return false; } public String getTableCountQuery() { if (table != null) { Bookmark current = MultiSQLServer.getInstance().getConnected(); return SQLHelper.getFullTableName(current, table); } return query; } public String getQuery() { if (table != null) { MultiSQLServer server = MultiSQLServer.getInstance(); Bookmark current = server.getConnected(); try { DatabaseAdapter adapter = AdapterFactory.getInstance().getAdapter(current.getType()); return adapter.getShowTableQuery(DatabaseInfo.create(current), table) + extra.toString(); } catch (NoSuchAdapterException e) { throw new RuntimeException(e.toString()); } } return query; } public void loadData() { loadSize(); if (table != null) { if (offset > totalSize) { offset = 1; } } String query = getQuery(); if (DEBUG) { System.out.println(offset + " to " + (offset + pageSize - 1)); } SQLResults results = helper.getResults(query, offset, offset + pageSize - 1, maxColumnSize, encoding); setData(results); } public void resetOffset() { offset = 1; } public void setData(SQLResults results) { int rowCount = results.getRowCount(); int columnCount = results.getColumnCount(); rows = new Vector(); columnNames = new Vector(); for (int col = 1; col <= columnCount; col++) { columnNames.addElement(results.getColumnName(col)); } for (int row = 1; row <= rowCount; row++) { String rowData[] = new String[columnCount]; for (int col = 1; col <= columnCount; col++) { rowData[col - 1] = results.getElement(col, row).toString(); } rows.addElement(rowData); } hasMore = results.hasMore(); if (table == null && results.getMaxSize() >= 0) { if (offset > results.getMaxSize()) { offset = 1; loadData(); } } } public void loadTable(Table table) { table.setHeaderVisible(true); for (int i = 0; i < columnNames.size(); i++) { TableColumn column = new TableColumn(table, SWT.NONE); column.setText(columnNames.elementAt(i).toString()); } for (int i = 0; i < columnNames.size(); i++) { table.getColumn(i).pack(); } for (int row = 0; row < rows.size(); row++) { TableItem item = new TableItem(table, SWT.NONE); String itemData[] = (String[]) rows.elementAt(row); item.setText(itemData); } for (int i = 0; i < columnNames.size(); i++) { table.getColumn(i).pack(); } } public int getPageSize() { return pageSize; } public void setFilterSort(FilterSort extra) { this.extra = extra; } public String getTable() { return table; } public void setTable(String table) { this.table = table; } public void setQuery(String query) { this.query = query; } public String getEncoding() { return encoding; } public void setEncoding(String encoding) { this.encoding = encoding; } public String getStatusString() { String status = getStartIndex() + " to " + getEndIndex() + " of " + getTotalSize(); if (!encoding.equals(DEFAULT)) { status += " (" + encoding + ")"; } String filterText = extra.toString(); if (!filterText.equals("")) { status += " (" + filterText + ")"; } if (pageSize == Integer.MAX_VALUE) { status += " (FULL)"; } return status; } }