All Downloads are FREE. Search and download functionalities are using the official Maven repository.

dk.eobjects.metamodel.AccessDataContextStrategy Maven / Gradle / Ivy

The newest version!
package dk.eobjects.metamodel;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import com.healthmarketscience.jackcess.Database;

import dk.eobjects.metamodel.data.DataSet;
import dk.eobjects.metamodel.query.SelectItem;
import dk.eobjects.metamodel.schema.Column;
import dk.eobjects.metamodel.schema.ColumnType;
import dk.eobjects.metamodel.schema.Schema;
import dk.eobjects.metamodel.schema.Table;
import dk.eobjects.metamodel.schema.TableType;

public class AccessDataContextStrategy extends
		QueryPostprocessDataContextStrategy {

	private Database _database;
	private File _file;

	public AccessDataContextStrategy(File file) {
		_file = file;
	}

	public AccessDataContextStrategy(String filename) {
		this(new File(filename));
	}

	private Database getDatabase() {
		if (_database == null) {
			synchronized (this) {
				try {
					_database = Database.open(_file, true);
				} catch (IOException e) {
					throw new MetaModelException(e);
				}
			}
		}
		return _database;
	}

	@Override
	protected Schema getMainSchema() throws MetaModelException {
		Schema schema = new Schema(_file.getName());
		Database db = getDatabase();
		for (com.healthmarketscience.jackcess.Table mdbTable : db) {
			Table table = new Table(mdbTable.getName(), TableType.TABLE, schema);

			try {
				int i = 0;
				for (com.healthmarketscience.jackcess.Column mdbColumn : mdbTable
						.getColumns()) {
					ColumnType columnType = ColumnType
							.convertColumnType(mdbColumn.getSQLType());
					Column column = new Column(mdbColumn.getName(), columnType,
							table, i, null);
					column.setColumnSize((int) mdbColumn.getLength());
					column.setNativeType(mdbColumn.getType().name());

					table.addColumn(column);
					i++;
				}
				schema.addTable(table);
			} catch (Exception e) {
				throw new MetaModelException(e);
			}
		}
		return schema;
	}

	@Override
	protected String getMainSchemaName() throws MetaModelException {
		return _file.getName();
	}

	@Override
	public DataSet materializeMainSchemaTable(Table table, Column[] columns,
			int maxRows) {
		try {
			com.healthmarketscience.jackcess.Table mdbTable = getDatabase()
					.getTable(table.getName());
			SelectItem[] selectItems = new SelectItem[columns.length];
			for (int i = 0; i < columns.length; i++) {
				selectItems[i] = new SelectItem(columns[i]);
			}

			int rowNum = 0;
			List data = new LinkedList();
			Iterator> it = mdbTable.iterator();
			while (it.hasNext() && (maxRows < 0 || rowNum < maxRows)) {
				rowNum++;
				Map valueMap = it.next();
				Object[] values = new Object[columns.length];
				for (int j = 0; j < columns.length; j++) {
					values[j] = valueMap.get(columns[j].getName());
				}
				data.add(values);
			}

			return new DataSet(selectItems, data);
		} catch (Exception e) {
			throw new MetaModelException(e);
		}
	}

	@Override
	protected void finalize() throws Throwable {
		super.finalize();
		_database.close();
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy