text:
package org.insightech.er.editor.model.dbimport;

import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.insightech.er.ERDiagramActivator;
import org.insightech.er.ResourceString;
import org.insightech.er.common.exception.InputException;
import org.insightech.er.db.sqltype.SqlType;
import org.insightech.er.editor.TranslationResources;
import org.insightech.er.editor.model.ERDiagram;
import org.insightech.er.editor.model.diagram_contents.element.connection.Relation;
import org.insightech.er.editor.model.diagram_contents.element.node.table.ERTable;
import org.insightech.er.editor.model.diagram_contents.element.node.table.column.Column;
import org.insightech.er.editor.model.diagram_contents.element.node.table.column.NormalColumn;
import org.insightech.er.editor.model.diagram_contents.element.node.table.index.Index;
import org.insightech.er.editor.model.diagram_contents.element.node.table.properties.TableViewProperties;
import org.insightech.er.editor.model.diagram_contents.element.node.table.unique_key.ComplexUniqueKey;
import org.insightech.er.editor.model.diagram_contents.element.node.view.View;
import org.insightech.er.editor.model.diagram_contents.not_element.dictionary.TypeData;
import org.insightech.er.editor.model.diagram_contents.not_element.dictionary.UniqueWordDictionary;
import org.insightech.er.editor.model.diagram_contents.not_element.dictionary.Word;
import org.insightech.er.editor.model.diagram_contents.not_element.sequence.Sequence;
import org.insightech.er.editor.model.diagram_contents.not_element.tablespace.Tablespace;
import org.insightech.er.editor.model.diagram_contents.not_element.trigger.Trigger;
import org.insightech.er.editor.model.progress_monitor.ProgressMonitor;
import org.insightech.er.editor.model.settings.DBSetting;
import org.insightech.er.util.Check;
import org.insightech.er.util.Format;

public abstract class ImportFromDBManagerBase implements ImportFromDBManager {

	private static Logger logger = Logger
			.getLogger(ImportFromDBManagerBase.class.getName());

	private static final boolean LOG_SQL_TYPE = false;

	private static final Pattern AS_PATTERN = Pattern
			.compile("(.+) [aA][sS] (.+)");

	private static final Pattern TYPE_WITH_LENGTH_PATTERN = Pattern
			.compile("(.+)\\((\\d+)\\).*");

	private static final Pattern TYPE_WITH_DECIMAL_PATTERN = Pattern
			.compile("(.+)\\((\\d+),(\\d+)\\).*");

	protected Connection con;

	private DatabaseMetaData metaData;

	protected DBSetting dbSetting;

	private ERDiagram diagram;

	private List<DBObject> dbObjectList;

	private Map<String, ERTable> tableMap;

	protected Map<String, String> tableCommentMap;

	protected Map<String, Map<String, ColumnData>> columnDataCache;

	protected Map<String, List<ForeignKeyData>> tableForeignKeyDataMap;

	private UniqueWordDictionary dictionary;

	private List<ERTable> importedTables;

	private List<Sequence> importedSequences;

	private List<Trigger> importedTriggers;

	private List<Tablespace> importedTablespaces;

	private List<View> importedViews;

	private Exception exception;

	protected TranslationResources translationResources;

	private boolean useCommentAsLogicalName;

	private boolean mergeWord;

	private int taskCount;

	private int taskTotalCount;

	protected static class ColumnData {
		public String columnName;

		public String type;

		public int size;

		public int decimalDegits;

		public int nullable;

		public String defaultValue;

		public String description;

		public String constraint;

		public String enumData;

		public String characterSet;

		public String collation;

		public boolean isBinary;

		public boolean charSemantics;

		@Override
		public String toString() {
			return "ColumnData [columnName=" + columnName + ", type=" + type
					+ ", size=" + size + ", decimalDegits=" + decimalDegits
					+ "]";
		}

	}

	private static class ForeignKeyData {
		private String name;

		private String sourceTableName;

		private String sourceSchemaName;

		private String sourceColumnName;

		private String targetTableName;

		private String targetSchemaName;

		private String targetColumnName;

		private short updateRule;

		private short deleteRule;
	}

	protected static class PrimaryKeyData {
		private String columnName;

		private String constraintName;
	}

	public ImportFromDBManagerBase() {
		this.tableMap = new HashMap<String, ERTable>();
		this.tableCommentMap = new HashMap<String, String>();
		this.columnDataCache = new HashMap<String, Map<String, ColumnData>>();
		this.tableForeignKeyDataMap = new HashMap<String, List<ForeignKeyData>>();
		this.dictionary = new UniqueWordDictionary();
	}

	public void init(Connection con, DBSetting dbSetting, ERDiagram diagram,
			List<DBObject> dbObjectList, boolean useCommentAsLogicalName,
			boolean mergeWord) throws SQLException {
		this.con = con;
		this.dbSetting = dbSetting;
		this.diagram = diagram;
		this.dbObjectList = dbObjectList;
		this.useCommentAsLogicalName = useCommentAsLogicalName;
		this.mergeWord = mergeWord;

		this.metaData = con.getMetaData();
		this.translationResources = new TranslationResources(diagram
				.getDiagramContents().getSettings().getTranslationSetting());

		if (this.mergeWord) {
			this.dictionary.init(this.diagram);
		}
	}

	public void run(ProgressMonitor monitor) throws InvocationTargetException,
			InterruptedException {

		try {
			this.taskTotalCount = this.dbObjectList.size();

			monitor.beginTask(ResourceString
					.getResourceString("dialog.message.import.db.objects"),
					this.taskTotalCount);

			this.cacheTableComment(monitor);
			this.cacheColumnData(dbObjectList, monitor);

			this.importedSequences = this.importSequences(this.dbObjectList,
					monitor);
			this.importedTriggers = this.importTriggers(this.dbObjectList,
					monitor);
			this.importedTablespaces = this.importTablespaces(
					this.dbObjectList, monitor);
			this.importedTables = this.importTables(this.dbObjectList, monitor);
			this.importedTables.addAll(this.importSynonyms());

			this.setForeignKeys(this.importedTables);

			this.importedViews = this.importViews(this.dbObjectList, monitor);

		} catch (InterruptedException e) {
			throw e;

		} catch (Exception e) {
			logger.log(Level.WARNING, e.getMessage(), e);
			this.exception = e;

		}

		monitor.done();
	}

	protected void cacheColumnData(List<DBObject> dbObjectList,
			ProgressMonitor monitor) throws SQLException, InterruptedException {
		Set<String> schemas = new HashSet<String>();

		for (DBObject dbObject : dbObjectList) {
			if (!dbObject.getType().equals(DBObject.TYPE_TABLE)) {
				continue;
			}

			String schemaName = dbObject.getSchema();

			if (!schemas.contains(schemaName)) {
				if (monitor != null) {
					String displayName = schemaName;

					if (schemaName == null) {
						displayName = ResourceString
								.getResourceString("label.none");
					}
					monitor.subTask("reading schema: " + displayName);
				}

				this.cacheColumnDataX(schemaName, null, dbObjectList, monitor);

				schemas.add(schemaName);

				if (monitor != null && monitor.isCanceled()) {
					throw new InterruptedException("Cancel has been requested.");
				}
			}
		}
	}

	protected void cacheColumnDataX(String schemaName, String tableName,
			List<DBObject> dbObjectList, ProgressMonitor monitor)
			throws SQLException, InterruptedException {
		ResultSet columnSet = null;

		try {
			columnSet = metaData.getColumns(null, schemaName, tableName, null);

			while (columnSet.next()) {
				tableName = columnSet.getString("TABLE_NAME");
				String schema = columnSet.getString("TABLE_SCHEM");

				String tableNameWithSchema = this.dbSetting
						.getTableNameWithSchema(tableName, schema);

				Map<String, ColumnData> cache = this.columnDataCache
						.get(tableNameWithSchema);
				if (cache == null) {
					cache = new LinkedHashMap<String, ColumnData>();
					this.columnDataCache.put(tableNameWithSchema, cache);
				}

				ColumnData columnData = this.createColumnData(columnSet);

				this.cacheOtherColumnData(tableName, schema, columnData);

				cache.put(columnData.columnName, columnData);
			}

		} finally {
			if (columnSet != null) {
				columnSet.close();
			}
		}
	}

	protected ColumnData createColumnData(ResultSet columnSet)
			throws SQLException {
		ColumnData columnData = new ColumnData();
		columnData.columnName = columnSet.getString("COLUMN_NAME");
		columnData.type = columnSet.getString("TYPE_NAME").toLowerCase();
		columnData.size = columnSet.getInt("COLUMN_SIZE");
		columnData.decimalDegits = columnSet.getInt("DECIMAL_DIGITS");
		columnData.nullable = columnSet.getInt("NULLABLE");
		columnData.defaultValue = columnSet.getString("COLUMN_DEF");
		columnData.charSemantics = columnSet.getInt("CHAR_OCTET_LENGTH") == columnData.size;

		if (columnData.defaultValue != null) {
			if ("bit".equals(columnData.type)) {
				byte[] bits = columnData.defaultValue.getBytes();

				columnData.defaultValue = "";

				for (int i = 0; i < bits.length; i++) {
					columnData.defaultValue += bits[i];
				}
			}
		}

		columnData.description = columnSet.getString("REMARKS");

		return columnData;
	}

	protected void cacheOtherColumnData(String tableName, String schema,
			ColumnData columnData) throws SQLException {
	}

	protected void cacheTableComment(ProgressMonitor monitor)
			throws SQLException, InterruptedException {
	}

	private List<Sequence> importSequences(List<DBObject> dbObjectList,
			ProgressMonitor monitor) throws SQLException, InterruptedException {
		List<Sequence> list = new ArrayList<Sequence>();

		for (Iterator<DBObject> iter = dbObjectList.iterator(); iter.hasNext();) {
			DBObject dbObject = iter.next();

			if (DBObject.TYPE_SEQUENCE.equals(dbObject.getType())) {
				iter.remove();
				this.taskCount++;

				String name = dbObject.getName();
				String schema = dbObject.getSchema();
				String nameWithSchema = this.dbSetting.getTableNameWithSchema(
						name, schema);

				monitor.subTask("(" + this.taskCount + "/"
						+ this.taskTotalCount + ") ["
						+ dbObject.getType().toUpperCase() + "] "
						+ nameWithSchema);
				monitor.worked(1);

				Sequence sequence = this.importSequence(schema, name);

				if (sequence != null) {
					list.add(sequence);
				}
			}

			if (monitor.isCanceled()) {
				throw new InterruptedException("Cancel has been requested.");
			}
		}

		return list;
	}

	protected Sequence importSequence(String schema, String sequenceName)
			throws SQLException {
		PreparedStatement stmt = null;
		ResultSet rs = null;

		String sequenceNameWithSchema = this.getTableNameWithSchema(schema,
				sequenceName);

		try {
			stmt = this.con.prepareStatement("SELECT * FROM "
					+ sequenceNameWithSchema);
			rs = stmt.executeQuery();

			if (rs.next()) {
				Sequence sequence = new Sequence();

				sequence.setName(sequenceName);
				sequence.setSchema(schema);
				sequence.setIncrement(rs.getInt("INCREMENT_BY"));
				sequence.setMinValue(rs.getLong("MIN_VALUE"));

				BigDecimal maxValue = rs.getBigDecimal("MAX_VALUE");

				sequence.setMaxValue(maxValue);
				sequence.setStart(rs.getLong("LAST_VALUE"));
				sequence.setCache(rs.getInt("CACHE_VALUE"));
				sequence.setCycle(rs.getBoolean("IS_CYCLED"));

				return sequence;
			}

			return null;

		} finally {
			this.close(rs);
			this.close(stmt);
		}
	}

	private List<Trigger> importTriggers(List<DBObject> dbObjectList,
			ProgressMonitor monitor) throws SQLException, InterruptedException {
		List<Trigger> list = new ArrayList<Trigger>();

		for (Iterator<DBObject> iter = dbObjectList.iterator(); iter.hasNext();) {
			DBObject dbObject = iter.next();

			if (DBObject.TYPE_TRIGGER.equals(dbObject.getType())) {
				iter.remove();
				this.taskCount++;

				String name = dbObject.getName();
				String schema = dbObject.getSchema();
				String nameWithSchema = this.dbSetting.getTableNameWithSchema(
						name, schema);

				monitor.subTask("(" + this.taskCount + "/"
						+ this.taskTotalCount + ") ["
						+ dbObject.getType().toUpperCase() + "] "
						+ nameWithSchema);
				monitor.worked(1);

				Trigger trigger = this.importTrigger(schema, name);

				if (trigger != null) {
					list.add(trigger);
				}
			}

			if (monitor.isCanceled()) {
				throw new InterruptedException("Cancel has been requested.");
			}
		}

		return list;
	}

	protected Trigger importTrigger(String schema, String triggerName)
			throws SQLException {
		//
		return null;
	}

	protected List<ERTable> importTables(List<DBObject> dbObjectList,
			ProgressMonitor monitor) throws SQLException, InterruptedException {
		List<ERTable> list = new ArrayList<ERTable>();

		for (Iterator<DBObject> iter = dbObjectList.iterator(); iter.hasNext();) {
			DBObject dbObject = iter.next();

			if (DBObject.TYPE_TABLE.equals(dbObject.getType())) {
				iter.remove();
				this.taskCount++;

				String tableName = dbObject.getName();
				String schema = dbObject.getSchema();
				String tableNameWithSchema = this.dbSetting
						.getTableNameWithSchema(tableName, schema);

				monitor.subTask("(" + this.taskCount + "/"
						+ this.taskTotalCount + ") ["
						+ dbObject.getType().toUpperCase() + "] "
						+ tableNameWithSchema);
				monitor.worked(1);

				ERTable table = this.importTable(tableNameWithSchema,
						tableName, schema);

				if (table != null) {
					list.add(table);
				}
			}

			if (monitor.isCanceled()) {
				throw new InterruptedException("Cancel has been requested.");
			}
		}

		return list;
	}

	protected List<ERTable> importSynonyms() throws SQLException,
			InterruptedException {
		return new ArrayList<ERTable>();
	}

	protected String getConstraintName(PrimaryKeyData data) {
		return data.constraintName;
	}

	protected ERTable importTable(String tableNameWithSchema, String tableName,
			String schema) throws SQLException, InterruptedException {
		String autoIncrementColumnName = null;
		try {
			autoIncrementColumnName = this.getAutoIncrementColumnName(con,
					this.getTableNameWithSchema(schema, tableName));
		} catch (Exception e) {
			logger.log(Level.WARNING, e.getMessage());
			return null;
		}

		ERTable table = new ERTable();
		TableViewProperties tableProperties = table
				.getTableViewProperties(this.dbSetting.getDbsystem());
		tableProperties.setSchema(schema);

		table.setPhysicalName(tableName);
		table.setLogicalName(this.translationResources.translate(tableName));

		table.setDescription(this.tableCommentMap.get(tableNameWithSchema));

		List<PrimaryKeyData> primaryKeys = this.getPrimaryKeys(table,
				this.metaData);
		if (!primaryKeys.isEmpty()) {
			table.setPrimaryKeyName(getConstraintName(primaryKeys.get(0)));
		}

		List<Index> indexes = this
				.getIndexes(table, this.metaData, primaryKeys);

		List<Column> columns = this.getColumns(tableNameWithSchema, tableName,
				schema, indexes, primaryKeys, autoIncrementColumnName);

		table.setColumns(columns);
		table.setIndexes(indexes);

		this.tableMap.put(tableNameWithSchema, table);

		for (Index index : indexes) {
			this.setIndexColumn(table, index);
		}

		this.setTableViewProperties(tableName, tableProperties);

		return table;
	}

	protected void setTableViewProperties(String tableName,
			TableViewProperties tableViewProperties) {
	}

	protected String getTableNameWithSchema(String schema, String tableName) {
		return this.dbSetting.getTableNameWithSchema(tableName, schema);
	}

	protected void setForeignKeys(List<ERTable> list) throws SQLException {
		this.cacheForeignKeyData();

		for (ERTable target : list) {
			if (this.tableForeignKeyDataMap != null) {
				this.setForeignKeysUsingCache(target);
			} else {
				this.setForeignKeys(target);
			}
		}
	}

	private String getAutoIncrementColumnName(Connection con,
			String tableNameWithSchema) throws SQLException {
		String autoIncrementColumnName = null;

		Statement stmt = null;
		ResultSet rs = null;

		try {
			stmt = con.createStatement();

			rs = stmt.executeQuery("SELECT * FROM " + tableNameWithSchema);
			ResultSetMetaData md = rs.getMetaData();

			for (int i = 0; i < md.getColumnCount(); i++) {
				if (md.isAutoIncrement(i + 1)) {
					autoIncrementColumnName = md.getColumnName(i + 1);
					break;
				}
			}

		} finally {
			this.close(rs);
			this.close(stmt);
		}

		return autoIncrementColumnName;
	}

	protected List<Index> getIndexes(ERTable table, DatabaseMetaData metaData,
			List<PrimaryKeyData> primaryKeys) throws SQLException {

		List<Index> indexes = new ArrayList<Index>();

		Map<String, Index> indexMap = new HashMap<String, Index>();

		ResultSet indexSet = null;

		try {
			indexSet = metaData.getIndexInfo(null, table
					.getTableViewProperties(this.dbSetting.getDbsystem())
					.getSchema(), table.getPhysicalName(), false, true);

			while (indexSet.next()) {
				String name = null;
				try {
					name = indexSet.getString("INDEX_NAME");

				} catch (SQLException e) {
					logger.log(
							Level.WARNING,
							"Cannot get Index Info of ["
									+ table.getTableViewProperties(
											this.dbSetting.getDbsystem())
											.getSchema() + ":"
									+ table.getPhysicalName() + "]");
					continue;
				}

				if (name == null) {
					continue;
				}

				Index index = indexMap.get(name);

				if (index == null) {
					boolean nonUnique = indexSet.getBoolean("NON_UNIQUE");
					String type = null;
					short indexType = indexSet.getShort("TYPE");
					if (indexType == DatabaseMetaData.tableIndexOther) {
						type = "BTREE";
					}

					// DatabaseMetaData.tableIndexClustered
					// DatabaseMetaData.tableIndexOther
					// DatabaseMetaData.tableIndexStatistic

					index = new Index(table, name, nonUnique, type, null);

					indexMap.put(name, index);
					indexes.add(index);
				}

				String columnName = indexSet.getString("COLUMN_NAME");
				String ascDesc = indexSet.getString("ASC_OR_DESC");

				if (columnName.startsWith("\"") && columnName.endsWith("\"")) {
					columnName = columnName.substring(1,
							columnName.length() - 1);
				}

				Boolean desc = null;

				if ("A".equals(ascDesc)) {
					desc = Boolean.FALSE;
				} else if ("D".equals(ascDesc)) {
					desc = Boolean.TRUE;
				}

				index.addColumnName(columnName, desc);
			}

		} catch (SQLException e) {
			throw e;
		} finally {
			this.close(indexSet);
		}

		for (Iterator<Index> iter = indexes.iterator(); iter.hasNext();) {
			Index index = iter.next();
			List<String> indexColumns = index.getColumnNames();

			if (indexColumns.size() == primaryKeys.size()) {
				boolean equals = true;

				for (int i = 0; i < indexColumns.size(); i++) {
					if (!indexColumns.get(i).equals(
							primaryKeys.get(i).columnName)) {
						equals = false;
						break;
					}
				}

				if (equals) {
					iter.remove();
				}
			}
		}

		return indexes;
	}

	private void setIndexColumn(ERTable erTable, Index index) {
		for (String columnName : index.getColumnNames()) {
			for (Column column : erTable.getColumns()) {
				if (column instanceof NormalColumn) {
					NormalColumn normalColumn = (NormalColumn) column;

					if (normalColumn.getPhysicalName().equals(columnName)) {
						index.addColumn(normalColumn);
						break;
					}
				}
			}
		}
	}

	private List<PrimaryKeyData> getPrimaryKeys(ERTable table,
			DatabaseMetaData metaData) throws SQLException {
		List<PrimaryKeyData> primaryKeys = new ArrayList<PrimaryKeyData>();

		ResultSet primaryKeySet = null;

		try {
			primaryKeySet = metaData.getPrimaryKeys(null, table
					.getTableViewProperties(this.dbSetting.getDbsystem())
					.getSchema(), table.getPhysicalName());
			while (primaryKeySet.next()) {
				PrimaryKeyData data = new PrimaryKeyData();

				data.columnName = primaryKeySet.getString("COLUMN_NAME");
				data.constraintName = primaryKeySet.getString("PK_NAME");

				primaryKeys.add(data);
			}

		} catch (SQLException e) {
			// Microsoft Access does not support getPrimaryKeys

		} finally {
			this.close(primaryKeySet);
		}

		return primaryKeys;
	}

	protected Map<String, ColumnData> getColumnDataMap(
			String tableNameWithSchema, String tableName, String schema)
			throws SQLException, InterruptedException {
		return this.columnDataCache.get(tableNameWithSchema);
	}

	private List<Column> getColumns(String tableNameWithSchema,
			String tableName, String schema, List<Index> indexes,
			List<PrimaryKeyData> primaryKeys, String autoIncrementColumnName)
			throws SQLException, InterruptedException {
		List<Column> columns = new ArrayList<Column>();

		Map<String, ColumnData> columnDataMap = this.getColumnDataMap(
				tableNameWithSchema, tableName, schema);
		if (columnDataMap == null) {
			return new ArrayList<Column>();
		}

		Collection<ColumnData> columnSet = columnDataMap.values();

		for (ColumnData columnData : columnSet) {
			String columnName = columnData.columnName;
			String type = columnData.type;

			boolean array = false;
			Integer arrayDimension = null;
			boolean unsigned = false;

			boolean zerofill = false;

			int zerofillIndex = type.toUpperCase().indexOf(" ZEROFILL");
			if (zerofillIndex != -1) {
				zerofill = true;
				type = type.substring(0, zerofillIndex);
			}

			int unsignedIndex = type.toUpperCase().indexOf(" UNSIGNED");
			if (unsignedIndex != -1) {
				unsigned = true;
				type = type.substring(0, unsignedIndex);
			}

			int arrayStartIndex = type.indexOf("[");
			if (arrayStartIndex != -1) {
				array = true;
				String str = type.substring(arrayStartIndex + 1,
						type.indexOf("]"));
				arrayDimension = Integer.parseInt(str);
				type = type.substring(0, arrayStartIndex);
			}

			int size = 0;
			int decimalDegits = 0;

			if (zerofillIndex != -1) {
				Matcher matcher = TYPE_WITH_DECIMAL_PATTERN.matcher(type);
				if (matcher.find()) {
					type = matcher.group(1);
					size = Integer.parseInt(matcher.group(2));
					decimalDegits = Integer.parseInt(matcher.group(3));

				} else {
					matcher = TYPE_WITH_LENGTH_PATTERN.matcher(type);

					if (matcher.find()) {
						type = matcher.group(1);
						size = Integer.parseInt(matcher.group(2));
					}
				}

			} else {
				size = columnData.size;
				decimalDegits = columnData.decimalDegits;
			}

			Integer length = new Integer(size);
			Integer decimal = new Integer(decimalDegits);

			SqlType sqlType = SqlType.valueOf(this.dbSetting.getDbsystem(),
					type, size, decimal);

			if (sqlType == null || LOG_SQL_TYPE) {
				logger.info(columnName + ": " + type + ", " + size + ", "
						+ columnData.decimalDegits);
			}

			boolean notNull = false;
			if (columnData.nullable == DatabaseMetaData.columnNoNulls) {
				notNull = true;
			}

			String defaultValue = Format.null2blank(columnData.defaultValue);
			if (sqlType != null) {
				if (SqlType.SQL_TYPE_ID_SERIAL.equals(sqlType.getId())
						|| SqlType.SQL_TYPE_ID_BIG_SERIAL.equals(sqlType
								.getId())) {
					defaultValue = "";
				}
			}

			String description = Format.null2blank(columnData.description);
			String constraint = Format.null2blank(columnData.constraint);

			boolean primaryKey = false;

			for (PrimaryKeyData primaryKeyData : primaryKeys) {
				if (columnName.equals(primaryKeyData.columnName)) {
					primaryKey = true;
					break;
				}
			}

			boolean uniqueKey = this.isUniqueKey(columnName, indexes,
					primaryKeys);

			boolean autoIncrement = columnName
					.equalsIgnoreCase(autoIncrementColumnName);

			String logicalName = null;
			if (this.useCommentAsLogicalName && !Check.isEmpty(description)) {
				logicalName = description.replaceAll("[\r\n]", "");
			}
			if (Check.isEmpty(logicalName)) {
				logicalName = this.translationResources.translate(columnName);
			}

			String args = columnData.enumData;

			TypeData typeData = new TypeData(length, decimal, array,
					arrayDimension, unsigned, zerofill, columnData.isBinary,
					args, columnData.charSemantics);

			Word word = new Word(columnName, logicalName, sqlType, typeData,
					description, this.diagram.getDatabase());
			word = this.dictionary.getUniqueWord(word);

			// TODO UNIQUE KEY

			NormalColumn column = new NormalColumn(word, notNull, primaryKey,
					uniqueKey, autoIncrement, defaultValue, constraint, null,
					columnData.characterSet, columnData.collation);

			columns.add(column);
		}

		return columns;
	}

	private boolean isUniqueKey(String columnName, List<Index> indexes,
			List<PrimaryKeyData> primaryKeys) {
		String primaryKey = null;

		if (primaryKeys.size() == 1) {
			primaryKey = primaryKeys.get(0).columnName;
		}

		if (columnName == null) {
			return false;
		}

		for (Index index : indexes) {
			List<String> columnNames = index.getColumnNames();
			if (columnNames.size() == 1) {
				String indexColumnName = columnNames.get(0);
				if (columnName.equals(indexColumnName)) {
					if (!index.isNonUnique()) {
						if (!columnName.equals(primaryKey)) {
							indexes.remove(index);
							return true;
						}
						return false;
					}
				}
			}
		}

		return false;
	}

	private boolean isCyclicForeignKye(ForeignKeyData foreignKeyData) {
		if (foreignKeyData.sourceSchemaName == null) {
			if (foreignKeyData.targetSchemaName != null) {
				return false;
			}

		} else if (!foreignKeyData.sourceSchemaName
				.equals(foreignKeyData.targetSchemaName)) {
			return false;
		}

		if (!foreignKeyData.sourceTableName
				.equals(foreignKeyData.targetTableName)) {
			return false;
		}

		if (!foreignKeyData.sourceColumnName
				.equals(foreignKeyData.targetColumnName)) {
			return false;
		}

		return true;
	}

	protected void cacheForeignKeyData() throws SQLException {
		ResultSet foreignKeySet = null;
		try {
			foreignKeySet = metaData.getImportedKeys(null, null, null);

			while (foreignKeySet.next()) {
				ForeignKeyData foreignKeyData = new ForeignKeyData();

				foreignKeyData.name = foreignKeySet.getString("FK_NAME");
				foreignKeyData.sourceSchemaName = foreignKeySet
						.getString("PKTABLE_SCHEM");
				foreignKeyData.sourceTableName = foreignKeySet
						.getString("PKTABLE_NAME");
				foreignKeyData.sourceColumnName = foreignKeySet
						.getString("PKCOLUMN_NAME");
				foreignKeyData.targetSchemaName = foreignKeySet
						.getString("FKTABLE_SCHEM");
				foreignKeyData.targetTableName = foreignKeySet
						.getString("FKTABLE_NAME");
				foreignKeyData.targetColumnName = foreignKeySet
						.getString("FKCOLUMN_NAME");
				foreignKeyData.updateRule = foreignKeySet
						.getShort("UPDATE_RULE");
				foreignKeyData.deleteRule = foreignKeySet
						.getShort("DELETE_RULE");

				if (this.isCyclicForeignKye(foreignKeyData)) {
					continue;
				}

				String key = this.dbSetting.getTableNameWithSchema(
						foreignKeyData.targetTableName,
						foreignKeyData.targetSchemaName);

				List<ForeignKeyData> foreignKeyDataList = tableForeignKeyDataMap
						.get(key);

				if (foreignKeyDataList == null) {
					foreignKeyDataList = new ArrayList<ForeignKeyData>();
					tableForeignKeyDataMap.put(key, foreignKeyDataList);
				}

				foreignKeyDataList.add(foreignKeyData);
			}
		} catch (SQLException e) {
			tableForeignKeyDataMap = null;

		} finally {
			this.close(foreignKeySet);
		}
	}

	private void setForeignKeysUsingCache(ERTable target) throws SQLException {
		String tableName = target.getPhysicalName();
		String schema = target.getTableViewProperties(
				this.dbSetting.getDbsystem()).getSchema();

		tableName = this.dbSetting.getTableNameWithSchema(tableName, schema);

		List<ForeignKeyData> foreignKeyList = this.tableForeignKeyDataMap
				.get(tableName);

		if (foreignKeyList == null) {
			return;
		}

		Map<String, List<ForeignKeyData>> sameNameForeignKeyDataMap = this
				.collectSameNameForeignKeyData(foreignKeyList);

		for (Map.Entry<String, List<ForeignKeyData>> entry : sameNameForeignKeyDataMap
				.entrySet()) {
			this.createRelation(target, entry.getValue());
		}
	}

	private void setForeignKeys(ERTable target) throws SQLException {
		String tableName = target.getPhysicalName();
		String schemaName = target.getTableViewProperties(
				this.dbSetting.getDbsystem()).getSchema();

		ResultSet foreignKeySet = null;

		try {
			foreignKeySet = this.metaData.getImportedKeys(null, schemaName,
					tableName);

			List<ForeignKeyData> foreignKeyList = new ArrayList<ForeignKeyData>();

			while (foreignKeySet.next()) {
				ForeignKeyData foreignKeyData = new ForeignKeyData();

				foreignKeyData.name = foreignKeySet.getString("FK_NAME");
				foreignKeyData.sourceTableName = foreignKeySet
						.getString("PKTABLE_NAME");
				foreignKeyData.sourceSchemaName = foreignKeySet
						.getString("PKTABLE_SCHEM");
				foreignKeyData.sourceColumnName = foreignKeySet
						.getString("PKCOLUMN_NAME");
				foreignKeyData.targetSchemaName = foreignKeySet
						.getString("FKTABLE_SCHEM");
				foreignKeyData.targetColumnName = foreignKeySet
						.getString("FKCOLUMN_NAME");
				foreignKeyData.updateRule = foreignKeySet
						.getShort("UPDATE_RULE");
				foreignKeyData.deleteRule = foreignKeySet
						.getShort("DELETE_RULE");

				foreignKeyList.add(foreignKeyData);
			}

			if (foreignKeyList.isEmpty()) {
				return;
			}

			Map<String, List<ForeignKeyData>> sameNameForeignKeyDataMap = this
					.collectSameNameForeignKeyData(foreignKeyList);

			for (Map.Entry<String, List<ForeignKeyData>> entry : sameNameForeignKeyDataMap
					.entrySet()) {
				this.createRelation(target, entry.getValue());
			}

		} catch (SQLException e) {
			// microsoft access does not support getImportedKeys

		} finally {
			this.close(foreignKeySet);
		}
	}

	private Map<String, List<ForeignKeyData>> collectSameNameForeignKeyData(
			List<ForeignKeyData> foreignKeyList) {
		Map<String, List<ForeignKeyData>> map = new HashMap<String, List<ForeignKeyData>>();

		for (ForeignKeyData foreignKyeData : foreignKeyList) {
			List<ForeignKeyData> list = map.get(foreignKyeData.name);
			if (list == null) {
				list = new ArrayList<ForeignKeyData>();
				map.put(foreignKyeData.name, list);
			}

			list.add(foreignKyeData);
		}

		return map;
	}

	private Relation createRelation(ERTable target,
			List<ForeignKeyData> foreignKeyDataList) {
		ForeignKeyData representativeData = foreignKeyDataList.get(0);

		String sourceTableName = representativeData.sourceTableName;
		String sourceSchemaName = representativeData.sourceSchemaName;

		sourceTableName = this.dbSetting.getTableNameWithSchema(
				sourceTableName, sourceSchemaName);

		ERTable source = this.tableMap.get(sourceTableName);
		if (source == null) {
			return null;
		}

		boolean referenceForPK = true;

		List<NormalColumn> primaryKeys = source.getPrimaryKeys();
		if (primaryKeys.size() != foreignKeyDataList.size()) {
			referenceForPK = false;
		}

		Map<NormalColumn, NormalColumn> referenceMap = new HashMap<NormalColumn, NormalColumn>();

		for (ForeignKeyData foreignKeyData : foreignKeyDataList) {
			NormalColumn sourceColumn = null;

			for (NormalColumn normalColumn : source.getNormalColumns()) {
				if (normalColumn.getPhysicalName().equals(
						foreignKeyData.sourceColumnName)) {
					sourceColumn = normalColumn;
					break;
				}
			}

			if (sourceColumn == null) {
				return null;
			}

			if (!sourceColumn.isPrimaryKey()) {
				referenceForPK = false;
			}

			NormalColumn targetColumn = null;

			for (NormalColumn normalColumn : target.getNormalColumns()) {
				if (normalColumn.getPhysicalName().equals(
						foreignKeyData.targetColumnName)) {
					targetColumn = normalColumn;
					break;
				}
			}

			if (targetColumn == null) {
				return null;
			}

			referenceMap.put(sourceColumn, targetColumn);
		}

		ComplexUniqueKey referencedComplexUniqueKey = null;
		NormalColumn referencedColumn = null;

		if (!referenceForPK) {
			if (referenceMap.size() > 1) {
				// TODO
				referencedComplexUniqueKey = new ComplexUniqueKey("");
				for (NormalColumn column : referenceMap.keySet()) {
					referencedComplexUniqueKey.addColumn(column);
				}
				// TODO
				source.getComplexUniqueKeyList()
						.add(referencedComplexUniqueKey);

			} else {
				referencedColumn = referenceMap.keySet().iterator().next();
			}

		}

		NormalColumn representedForeignKeyColumn = referenceMap.entrySet()
				.iterator().next().getValue();

		Relation relation = new Relation(referenceForPK,
				referencedComplexUniqueKey, referencedColumn,
				representedForeignKeyColumn.isNotNull(),
				representedForeignKeyColumn.isUniqueKey()
						|| representedForeignKeyColumn.isSinglePrimaryKey());
		relation.setName(representativeData.name);
		relation.setSource(source);
		relation.setTargetWithoutForeignKey(target);

		String onUpdateAction = null;
		if (representativeData.updateRule == DatabaseMetaData.importedKeyCascade) {
			onUpdateAction = "CASCADE";
		} else if (representativeData.updateRule == DatabaseMetaData.importedKeyRestrict) {
			onUpdateAction = "RESTRICT";
		} else if (representativeData.updateRule == DatabaseMetaData.importedKeyNoAction) {
			onUpdateAction = "NO ACTION";
		} else if (representativeData.updateRule == DatabaseMetaData.importedKeySetDefault) {
			onUpdateAction = "SET DEFAULT";
		} else if (representativeData.updateRule == DatabaseMetaData.importedKeySetNull) {
			onUpdateAction = "SET NULL";
		} else {
			onUpdateAction = "";
		}

		relation.setOnUpdateAction(onUpdateAction);

		String onDeleteAction = null;
		if (representativeData.deleteRule == DatabaseMetaData.importedKeyCascade) {
			onDeleteAction = "CASCADE";
		} else if (representativeData.deleteRule == DatabaseMetaData.importedKeyRestrict) {
			onDeleteAction = "RESTRICT";
		} else if (representativeData.deleteRule == DatabaseMetaData.importedKeyNoAction) {
			onDeleteAction = "NO ACTION";
		} else if (representativeData.deleteRule == DatabaseMetaData.importedKeySetDefault) {
			onDeleteAction = "SET DEFAULT";
		} else if (representativeData.deleteRule == DatabaseMetaData.importedKeySetNull) {
			onDeleteAction = "SET NULL";
		} else {
			onDeleteAction = "";
		}

		relation.setOnDeleteAction(onDeleteAction);

		for (Map.Entry<NormalColumn, NormalColumn> entry : referenceMap
				.entrySet()) {
			entry.getValue().addReference(entry.getKey(), relation);
		}

		return relation;
	}

	public List<ERTable> getImportedTables() {
		return importedTables;
	}

	public List<Sequence> getImportedSequences() {
		return importedSequences;
	}

	public List<View> getImportedViews() {
		return importedViews;
	}

	private List<View> importViews(List<DBObject> dbObjectList,
			ProgressMonitor monitor) throws SQLException, InterruptedException {
		List<View> list = new ArrayList<View>();

		for (Iterator<DBObject> iter = dbObjectList.iterator(); iter.hasNext();) {
			DBObject dbObject = iter.next();

			if (DBObject.TYPE_VIEW.equals(dbObject.getType())) {
				iter.remove();
				this.taskCount++;

				String name = dbObject.getName();
				String schema = dbObject.getSchema();
				String nameWithSchema = this.dbSetting.getTableNameWithSchema(
						name, schema);

				monitor.subTask("(" + this.taskCount + "/"
						+ this.taskTotalCount + ") ["
						+ dbObject.getType().toUpperCase() + "] "
						+ nameWithSchema);
				monitor.worked(1);

				View view = this.importView(schema, name);

				if (view != null) {
					list.add(view);
				}
			}

			if (monitor.isCanceled()) {
				throw new InterruptedException("Cancel has been requested.");
			}
		}

		return list;
	}

	protected View importView(String schema, String viewName)
			throws SQLException {
		PreparedStatement stmt = null;
		ResultSet rs = null;

		String sql = getViewDefinitionSQL(schema);
		if (sql == null) {
			return null;
		}

		try {
			stmt = this.con.prepareStatement(sql);

			if (schema != null) {
				stmt.setString(1, schema);
				stmt.setString(2, viewName);

			} else {
				stmt.setString(1, viewName);

			}

			rs = stmt.executeQuery();

			if (rs.next()) {
				View view = new View();

				view.setPhysicalName(viewName);
				view.setLogicalName(this.translationResources
						.translate(viewName));
				String definitionSQL = rs.getString(1);
				view.setSql(definitionSQL);
				view.getTableViewProperties().setSchema(schema);

				List<Column> columnList = this.getViewColumnList(definitionSQL);
				view.setColumns(columnList);

				return view;
			}

			return null;

		} finally {
			this.close(rs);
			this.close(stmt);
		}
	}

	protected abstract String getViewDefinitionSQL(String schema);

	private List<Column> getViewColumnList(String sql) {
		List<Column> columnList = new ArrayList<Column>();

		sql = sql.replaceAll("\\s+", " ");
		String upperSql = sql.toUpperCase();

		int selectIndex = upperSql.indexOf("SELECT ");
		int fromIndex = upperSql.indexOf(" FROM ");

		if (selectIndex == -1) {
			return null;
		}

		String columnsPart = null;
		String fromPart = null;

		if (fromIndex != -1) {
			columnsPart = sql.substring(selectIndex + "SELECT ".length(),
					fromIndex);
			fromPart = sql.substring(fromIndex + " FROM ".length());

		} else {
			columnsPart = sql.substring(selectIndex + "SELECT ".length());
			fromPart = "";
		}

		int whereIndex = fromPart.toUpperCase().indexOf(" WHERE ");

		if (whereIndex != -1) {
			fromPart = fromPart.substring(0, whereIndex);
		}

		Map<String, String> aliasTableMap = new HashMap<String, String>();

		StringTokenizer fromTokenizer = new StringTokenizer(fromPart, ",");

		while (fromTokenizer.hasMoreTokens()) {
			String tableName = fromTokenizer.nextToken().trim();

			tableName.replaceAll(" AS", "");
			tableName.replaceAll(" as", "");
			tableName.replaceAll(" As", "");
			tableName.replaceAll(" aS", "");

			String tableAlias = null;

			int asIndex = tableName.toUpperCase().indexOf(" ");
			if (asIndex != -1) {
				tableAlias = tableName.substring(asIndex + 1).trim();
				tableName = tableName.substring(0, asIndex).trim();

				// TODO schema
				int dotIndex = tableName.indexOf(".");
				if (dotIndex != -1) {
					tableName = tableName.substring(dotIndex + 1);
				}

				aliasTableMap.put(tableAlias, tableName);
			}
		}

		StringTokenizer columnTokenizer = new StringTokenizer(columnsPart, ",");

		String previousColumn = null;

		while (columnTokenizer.hasMoreTokens()) {
			String columnName = columnTokenizer.nextToken();

			if (previousColumn != null) {
				columnName = previousColumn + "," + columnName;
				previousColumn = null;
			}

			if (columnName.split("\\(").length > columnName.split("\\)").length) {
				previousColumn = columnName;
				continue;
			}

			columnName = columnName.trim();
			columnName = columnName.replaceAll("\"", "");

			String columnAlias = null;

			Matcher matcher = AS_PATTERN.matcher(columnName);

			if (matcher.matches()) {
				columnAlias = matcher.toMatchResult().group(2).trim();
				columnName = matcher.toMatchResult().group(1).trim();

			} else {
				int asIndex = columnName.indexOf(" ");
				if (asIndex != -1) {
					columnAlias = columnName.substring(asIndex + 1).trim();
					columnName = columnName.substring(0, asIndex).trim();
				}
			}

			int dotIndex = columnName.indexOf(".");

			String tableName = null;

			if (dotIndex != -1) {
				String aliasTableName = columnName.substring(0, dotIndex);
				columnName = columnName.substring(dotIndex + 1);

				dotIndex = columnName.indexOf(".");
				if (dotIndex != -1) {
					aliasTableName = columnName.substring(0, dotIndex);
					columnName = columnName.substring(dotIndex + 1);
				}

				tableName = aliasTableMap.get(aliasTableName);

				if (tableName == null) {
					tableName = aliasTableName;
				}
			}

			if (columnAlias == null) {
				columnAlias = columnName;
			}

			NormalColumn targetColumn = null;

			if (columnName != null) {
				if (tableName != null) {
					tableName = tableName.toLowerCase();
				}
				columnName = columnName.toLowerCase();

				if (!"*".equals(columnName)) {
					for (ERTable table : this.importedTables) {
						if (tableName == null
								|| (table.getPhysicalName() != null && tableName
										.equals(table.getPhysicalName()
												.toLowerCase()))) {
							for (NormalColumn column : table
									.getExpandedColumns()) {
								if (column.getPhysicalName() != null
										&& columnName.equals(column
												.getPhysicalName()
												.toLowerCase())) {
									targetColumn = column;

									break;
								}
							}

							if (targetColumn != null) {
								break;
							}
						}

					}

					try {
						this.addColumnToView(columnList, targetColumn,
								columnAlias);
					} catch (NullPointerException e) {
						throw e;
					}
				} else {
					for (ERTable table : this.importedTables) {
						if (tableName == null
								|| (table.getPhysicalName() != null && tableName
										.equals(table.getPhysicalName()
												.toLowerCase()))) {
							for (NormalColumn column : table
									.getExpandedColumns()) {
								this.addColumnToView(columnList, column, null);
							}
						}
					}
				}
			}
		}

		return columnList;
	}

	private void addColumnToView(List<Column> columnList,
			NormalColumn targetColumn, String columnAlias) {
		Word word = null;

		if (targetColumn != null) {
			while ((word = targetColumn.getWord()) == null) {
				targetColumn = targetColumn.getReferencedColumnList().get(0);
			}

			word = new Word(word);
			if (columnAlias != null) {
				word.setPhysicalName(columnAlias);
			}

		} else {
			word = new Word(columnAlias,
					this.translationResources.translate(columnAlias), null,
					new TypeData(null, null, false, null, false, false, false,
							null, false), null, null);

		}

		this.dictionary.getUniqueWord(word);

		NormalColumn column = new NormalColumn(word, false, false, false,
				false, null, null, null, null, null);
		columnList.add(column);
	}

	public List<Tablespace> getImportedTablespaces() {
		return importedTablespaces;
	}

	private List<Tablespace> importTablespaces(List<DBObject> dbObjectList,
			ProgressMonitor monitor) throws SQLException, InterruptedException {
		List<Tablespace> list = new ArrayList<Tablespace>();

		for (Iterator<DBObject> iter = dbObjectList.iterator(); iter.hasNext();) {
			DBObject dbObject = iter.next();

			if (DBObject.TYPE_TABLESPACE.equals(dbObject.getType())) {
				iter.remove();
				this.taskCount++;

				String name = dbObject.getName();
				String schema = dbObject.getSchema();
				String nameWithSchema = this.dbSetting.getTableNameWithSchema(
						name, schema);

				monitor.subTask("(" + this.taskCount + "/"
						+ this.taskTotalCount + ") ["
						+ dbObject.getType().toUpperCase() + "] "
						+ nameWithSchema);
				monitor.worked(1);

				Tablespace tablespace = this.importTablespace(name);

				if (tablespace != null) {
					list.add(tablespace);
				}
			}

			if (monitor.isCanceled()) {
				throw new InterruptedException("Cancel has been requested.");
			}
		}

		return list;
	}

	public List<Trigger> getImportedTriggers() {
		return importedTriggers;
	}

	protected Tablespace importTablespace(String tablespaceName)
			throws SQLException {
		// TODO
		return null;
	}

	public Exception getException() {
		return exception;
	}

	public static void main(String[] args) throws InputException,
			InstantiationException, IllegalAccessException, SQLException {
		new ERDiagramActivator();

		DBSetting setting = new DBSetting("Oracle", "localhost", 1521, "XE",
				"nakajima", "nakajima", true, null, null);

		Connection con = null;
		try {
			con = setting.connect();
			DatabaseMetaData metaData = con.getMetaData();

			metaData.getIndexInfo(null, "SYS", "ALERT_QT", false, false);

		} finally {
			if (con != null) {
				con.close();
			}
		}
	}

	protected void close(ResultSet rs) throws SQLException {
		if (rs != null) {
			rs.close();
		}
	}

	protected void close(Statement stmt) throws SQLException {
		if (stmt != null) {
			stmt.close();
		}
	}

}

redpajama_set_name: RedPajamaGithub


What if they finally decide to call it a day, leaving us all behind in an abyss of darkness, which some of them have so thoroughly, so painstakingly created for us, their subjects? No, silly! We are not contemplating the size and nature of their eternal resting place in the afterlife. Rather, the Star is proposing a retirement plan for some of the famous and/or infamous characters of our nation, without whom our life would have been dull, drab and dry.


With a large garden and a courtyard with parking, Le Colombier is located 1km from the beach of Wissant, 20 minutes from Boulogne-sur-Mer, Calais.
Rooms include a flat-screen TV and a private bathroom with free toiletries. Wi-Fi is available in the lounge on the mezzanine. All rooms offer views of the garden. A gourmet breakfast is served every day.
According to the seasons, breakfast is crafted using fresh and "homemade" in the region. The room is welcoming, cozy and relaxing. It has a fireplace for small winter mornings.
PETS ARE NOT ACCEPTED WITHIN THE ESTABLISHMENT OR PROPERTY.
Le Colombier is located 1 km from Wissant beach, 20 min. drive from Boulogne-sur-Mer and 25 km from Calais. Wi-Fi is available in the facility. All rooms offer views of the garden. The Museum of the Second World War is only a 5 minute drive away.


Exporting products from a WooCommerce store to a CSV file becomes necessary at one point in time or another for multiple reasons. You can easily export all the products and product types (simple, variable, grouped, and external) in your WooCommerce store to a CSV file using the Product Import Export Plugin for WooCommerce.
Exporting products to a CSV file is necessary if you want to migrate your products to another WooCommerce store in an efficient way. Exporting to CSV file can also be used to keep a backup of the products and the product data. And also, the exporting products of your WooCommerce store into a CSV file allows you to bulk edit the products in the store and then import the products back to the store to reflect the changes.
To export WooCommerce products to CSV file, first, you need to purchase, install and activate Product Import Export Plugin in your WooCommerce store. The Plugin gives you a lot of control over the products that are exported to the CSV file. For example, if you only need a portion of the products to be exported in the CSV file, the offset and the limit fields in the export section help you to do just that. Also, you can export products that belong to a category or selected categories, or you can just export only certain product types etc.
After installing and activating the plugin, on the sidebar under the WooCommerce menu, you can see Product Im-Ex. So, to export the products in your WooCommerce store, from your WooCommerce store admin side dashboard, go to WooCommerce > Product Im-Ex.
This will take you to the Product Import Export plugin page. From the plugin page, on the Products tab, go to Export. This is the default page of the plugin. From this page, you can export all the products in your WooCommerce store into a CSV file.
Offset: Here you can set the number of products to be skipped before exporting to the CSV file. For example, if your store has 100 products and if you give the offset value as 10, the first 10 products will be skipped before the exporting. The resulting CSV will have a total of 90 products.
Limit: In this field, you can set the number of products that should be exported to the CSV file. So, if the value in the field is 50, only 50 products will be exported to the resulting CSV.
The Offset and Limit field can thus be used to export a portion of the products. For example, if you need to export 50 products after skipping the first 10 products then what you need to do is give the value of 10 in the Offset field and 50 in the limit field. This will export product with the product number 11 to 60 in the resulting CSV.
Product Categories: In this field, you can specify which categories of products you want to export in the CSV. The products belonging only those categories will be exported in the resulting CSV.
Product Types: This field allows you to filter the product types (simple, variable. grouped, and external) of the products that are to be exported to the CSV.
Sort Columns: This field allows you to enter the column name by which you can sort the products in the CSV file. You can sort the products by more than one column name by specifying the name of the columns separated by a comma (,).
Delimiter: This field help you set the delimiter by which the values in the CSV will be separated. The default delimiter for the CSV file is a comma (,), but you can also use other special characters like /, " ", |, @, and so on as a delimiter.
Save the Export Mapping: If you wish to save the mapping file for exporting, you can enter the name of the export mapping file in this field. Otherwise, you can leave this field empty.
Include hidden metadata: This field will allow you to include the hidden product metadata in the exported CSV file.
Export Children SKU of the Grouped Product: By enabling this checkbox, you can link the parent and child products of the store using the SKU of the parent product instead of the product ID of the parent product.
Convert Shortcodes to HTML: Enabling this checkbox will allow you to convert the shortcodes to HTML in the resulting CSV file.
After the fields of the plugins have been configured according to the requirements, you can go ahead and click on Export Products. This will create a CSV file that will be downloaded to your local computer.
Apart from exporting products from the CSV file, you can also export products from the products page on the admin side of the WooCommerce store. From the dashboard, go to the Products page.
From the products page, select the products that you want to export. After you have selected the products that you want to export, go to Bulk Actions > Download Products as CSV and click Apply.
This will export the products in the CSV and download the CSV file to your computer.
In this way, you have more control over which products are exported and you can export products, not in a sequential order, but you have less control over how the CSV should be exported.
Read more about importing and exporting products from your WooCommerce store using the Product import Export plugin in the documentation.
IS there any way to export additional product fields? For example I added a field "NS ProductID" into the addition fields or More fields on the product.
It does not show up as a field I can export or import. How can this be done?
Please enable the option Include hidden metadata while exporting to export your custom fields/ additional metadata.
So I exported my products but the data for each product is all in one cell. How do I fix this?
Our plugin by default export the CSV keeping comma as delimiter whereas your CSV viewer may not be using the same. Either you may change the delimiter settings of your CSV viewer or export by specifying appropriate delimiter in the plugin settings. Try with a semicolon ; as the delimiter.


He's always been the black sheep: the troublemaker. But this Christmas, the prodigal cowboy returns.
This was a nice second chance Christmas romance story for Hank and Grace. You have the usual bad boy done some girl wrong and is now back to try and redeem himself . I have not read any of the other books in this Texas Rodeo Series and found that this book stands on its own just fine. This is also a story about love, forgiveness and acceptance. Of dealing with family issues and actions taken in the past that can affect everything. I think this is also one of those books that you will either really enjoy or will not like at all.


text:
Q: raindrops - downward velocity antiderivative question I am working through an antiderivative question but there is one part of the answer I don't understand.
Since raindrops grow as they fall, their surface area increases and therefore the resistance to their falling increases. A raindrop has an initial downward velocity of 10  and its downward acceleration is
$$
a=\left\{\begin{array}{ll}
9-0.9 t & \text { if } 0 \leqslant t \leqslant 10 \\
0 & \text { if } t>10
\end{array}\right.
$$
If the raindrop is initially 500  above the ground, how long does it take to fall?
So,
$$
v(t)=-9 t+.45 t^{2}-10
$$
$$
s(t)=-4.5 t^{2}+.15 t^{3}-10 t+500
$$
And then punch in t=10
$$
s(10)=-4.5(10)^{2}+.15(10)-10(10)+500=100
$$
It's the position result of a 100 I don't undertand. What is the 100 supposed to represent?

A: $s(t)$ is a function which denotes the position of raindrops at time $t.$ When $t = 0,$ then $s(0) = 500.$ This tells us that the raindrops start falling at $500$ units. We find their position at $10$ seconds when $t = 10,$ which we see is $s(10) = 100.$ This tells us that at $10$ seconds, the raindrops are $100$ units above $0.$ However, the question of

If the raindrop is initially 500 above the ground, how long does it take to fall?

was not answered. If you would like to answer this question, then you need to set $s(t) = 0$ and solve for $t.$ This is a standard quadratic equation.

redpajama_set_name: RedPajamaStackExchange


text:
Aucklandella geiri är en stekelart som först beskrevs av Dalla Torre 1902.  Aucklandella geiri ingår i släktet Aucklandella och familjen brokparasitsteklar. Inga underarter finns listade.

Källor

Externa länkar

Brokparasitsteklar
geiri

redpajama_set_name: RedPajamaWikipedia


Looking for finance analyst graduate jobs in London, and want to join a leading financial services firm?
In this Investor Relations Analyst graduate job, you will be joining one of Europe's leading independent credit providers in the financial services sector. They provide a uniquely flexible investment approach and consistently deliver attractive returns, investing in high-end clients across Europe and the US. The firm currently manage in excess of $9 billion of capital on behalf of its investors, which include public and private pension funds, insurance companies, sovereign wealth funds and asset managers.
In this Investor Relations Analyst graduate job, you will be working with the fundraising and investor relations platform to assist in current fundraising, focussing on Korean clients, as well as ongoing relationships with their growing base of institutional investors. You will need to be willing to get stuck in from the start, as you will be responsible for undertaking various administrative tasks to ensure that every part of the business is running smoothly, as well as gaining a huge level of exposure from working with senior analysts.
Please note: This role will close for applications on 5th April.
Previous work experience or internships within the financial services would be a bonus!
Fluent in Korean both written and verbal, to a professional business standard.
The potential for visa sponsorship if required.
Looking for investor relations analyst graduate jobs in London and fluent in Korean? Waste no time and apply for this Investor Relations Analyst graduate job in London today!


text:
Northrop competes for DOT protection
By Aliya Sternstein
"FCW Watch List: A check-in"
The Transportation Department's Volpe National Transportation Systems Center added Northrop Grumman Corp. to the list of companies eligible for up to $120 million in work to protect Transportation Department buildings, security systems and employees from terrorism.
"Northrop Grumman's experience providing physical security services to government agencies helps us fully understand the scope of the Volpe Center's requirements," said Sidney Fuchs, president, Northrop Grumman Information Technology's TASC business unit. "We will use our security knowledge and capabilities to further support the government in its mission to combat terrorism and upgrade the security and electronic systems of our nation's infrastructures."
Under the scope of the contract, Northrop Grumman's IT unit will compete to protect several modes of transportation, logistics processes and governmental functions, facilities and operations from sabotage and terrorist attacks. Northrop Grumman will also provide services including vulnerability assessments and security planning, security-system design and installation, and support for contingency and emergency response and recovery.
Other companies competing for the Volpe task orders include: Batell, Booz Allen Hamilton Inc., Johnson Controls Inc., Lockheed Martin Corp., Science Applications International Corp., JRS Group, Unisys Corp. and STG International Ltd.
The Northrop Grumman IT team includes: Daniel, Mann, Johnson, Mendenhall, Holmes and Narver Inc.; Parsons Brinckerhoff Quade and Douglas Inc.; Excalibur Associates Inc.; Flatter and Associates Inc.; Spectrum Security Group Inc.; and Siemens Building Technologies.

redpajama_set_name: RedPajamaCommonCrawl


When the air is low -- pump it up -- and Go With Joe!
Skip the trip to the gas station and reach for the powerful portable air compressor that fits in the palm of your hand with the AIRJ24C 24-Volt Cordless Air Compressor from SUN JOE.
Compact and convenient for camping, or commuting - it's the power-packed rechargeable pump that's perfect anywhere power is at a premium -- like at the park, at the pool, or on the road. Keep tires at the perfect pressure, inflate a bike tire, pool float or sport ball in seconds. Simply set the PSI on the digital display and pull the trigger. The AIRJ24C automatically stops at your preset pressure.
Unlike bulky gas-powered or electric tools, SUN JOE's 24-Volt cordless compressor employs the most advanced lithium-ion battery technology for no-fade power and peak performance under pressure! When the work is done, simply plug the battery in, power it up – and it's recharged and ready for your next inflation project!
Battery Voltage (V) 24 Hose Length (ft.) 10 in.


"Some free financial tools come as big files but AM Lite is an exception, and it's very quick to install, too. The interface is a model of simplicity, and is much less cluttered than Microsoft Money or Quicken. All commands can be accessed via both buttons and menus and the software is aimed at small business, as well as personal users."
AceMoney, personal finance software, supports different account types like checking, savings, credit cards, loans, debt accounts. You can even create your own custom account type!
AM, personal finance software, can be configured to automatically download transactions from your bank, categorize them, and give you an updated balance of your home budget.
All your business and personal transactions are automatically categorized by AM, personal finance software, so you can see exactly where your money i spent. You can generate home budget reports by categories or payors/payees. See how much you spent on food last month. Find any transactions by any parameter.
AceMoney shows you when your bills are due.
AM, personal financial software for Mac OS X or Windows, requires only 8 megabytes of memory.
Many of our customers have been long time Microsoft Money or Quicken users, but made a switch after learning and appreciating the simplicity and ease of use of AceMoney, personal financial software. You can start managing your home budget right away, you do not have to be a finance expert.
You can easily transfer years of existing transactions: Microsoft Money Alternative or Quicken Alternative. AceMoney can also import your data from other personal finance software in the industry standard QIF and OFX formats. AceMoney is an award-winning Quicken alternative!
AceMoney is localized in 25+ different languages. You can easily add your language! Check out how to translate AceMoney guides to see how easy it is.
All over the world, AceMoney, personal financial software, is loved by people for satisfying their personal needs. Read testimonials from our customers.


A highlight from Aileen and Colm's wedding in the Blue Haven hotel, Co Donegal.
I met with Aileen and the girls in her house house just outside Ardara where Ciara McGroarty was on hand to help with the make up and Aisling Watters was working on the hair styles. I then headed up to Colm's home house where himself and the boys were just getting into their suits.
Fr Nigel O'Gallachoir was there to celebrate the ceremony in The Church of the Holy Family, Ardara.
After the couple met theirs guests we headed toward the Blue Haven, stopping off along the way for some photos.
When the meal and the speeches were finished it was then onto the band to entertain the guests for the rest of the night.


text:
Elsa Navarrete Maciel mexikói színésznő.

Élete
Magyar nézők elsősorban az Esmeralda című telenovellából ismerhetik, melyben Graciela (Nora Salinas) riválisát, Aurorát játszotta. A történetben a két nő Adrián (Alejandro Ruiz) szerelméért harcol. A sorozat folyamán Graciela meghal, a telenovella végén végleg Auroráé lesz Adrián. Elsát a magyar nézők láthatták még az Acapulco-öböl és A betolakodó című telenovellákban is. Elsa a Maharishi University of Management egyetemen szerzett diplomát.

Szerepei
El premio mayor - 1995
Acapulco-öböl - 1995
Esmeralda - 1997
A betolakodó - 2001
Apuesta por un amor - 2005

Források
Internet Movie Database

Mexikói színészek
Mexikói nők
A 20. században született személyek
Élő személyek


text:
Arteon hatchback
Volkswagen Arteon R-Line review
The R-Line trim level adds sporty looks to VW's flagship saloon but doesn't change the relaxed driving experience
by Ben Custard
If you're in the market for a stylish saloon with eye-catching looks and a tech-filled interior, the Volkswagen Arteon is worth considering. R-Line trim features additional exterior jewellery for a sportier appearance, but you won't be giving up the refined and comfortable nature that makes the Arteon such a good motorway cruiser.
The Arteon is a similar car to the Volkswagen Passat saloon but is dressed up in a stylish coupe body style. Its styling is notably different from VW's usual conservative fare in an attempt to steal buyers away from the desirable badges of the BMW 4-Series Gran Coupe and the Audi A5 Sportback.
The R-Line trim is available with all the engines VW offers for the Arteon, so you can choose from two petrol engines - a 148bhp 1.5-litre and a 2.0-litre with either 187bhp or 268bhp - and a 2.0-litre diesel engine with outputs of between 148bhp and 237bhp. All bar the cheapest diesel model feature a dual-clutch automatic gearbox, while four-wheel-drive is fitted on the most powerful petrol and the two most expensive diesels.
Best large family cars
Our test car was the 148bhp diesel with the automatic gearbox, which manages up to 50.4mpg on the stringent new WLTP test regime. We regularly got very close to this figure throughout our time with the Arteon, and it's a rather impressive figure for a car of this size. The CO2 emissions of 118g/km are equally respectable, and the engine is certainly punchy enough to propel the Arteon along nicely. One slight drawback is that the steering feels slightly remote, meaning it's not that fun to drive, but the Arteon is designed to cover long distances without breaking a sweat.
Considered as a cruiser, the Arteon is an excellent choice. The interior and build quality are top-notch, the driving position is very comfortable and the rear seat space is generous - even with the sloping roof. VW has fitted the Arteon with a sophisticated infotainment system that is intuitive to use and features an excellent sat nav, Apple CarPlay and Android Auto as standard.
There are two trim levels to choose, and the R-Line is the sportier of the pair. Choose it and VW will add redesigned bumpers, 19-inch black alloy wheels and chrome detailing. Inside, it features R-Line branding on the seats (offering extra support through faster corners) and the door sills, plus there's a black headliner, privacy glass and silver accents.
That's in addition to the handsomely equipped Exclusive trim level, which includes a raft of kit such as three-zone air conditioning, a 12.3-inch digital driver's display, heated leather seats and LED headlights as standard. Safety-wise, the Arteon delivers too, with lane-keeping assistance, traffic jam and intelligent speed assistance, pedestrian detection and adaptive cruise control.
The R-Line model also keeps the Arteon's enormous boot. There's 563 litres with the rear seats up, or 1,557 litres with those seats folded, although four-wheel-drive models offer a slightly smaller capacity.
Verdict - 4/5
The Arteon R-Line may not result in a sportier drive, but that's a well-judged decision as the the car excels as a relaxing long-distance mile-muncher. Its core strengths are its comfortable cabin, excellent infotainment system and its impressive fuel economy. The R-Line changes simply add extra presence to the already stylish design, which'll help it compete with Audi's S-Line and BMW's M-Sport trim levels.
Top 10 best large family cars 2022
Top 10 best motorway cars 2022
Volkswagen Arteon hatchback review


text:
"I like the randomness of sound."
by Mike Diver August 19th, 2004
Designer Babies will hate me for saying so, but they're mavericks. The Nottingham quartet laugh in the face of convention and make music that is truly theirs and theirs alone. Mark (aka Dusty Bible) tackles guitar duties, Nick (aka Roster) smacks a drum kit ("Kush prank-called me and I thought he was a fucking lunatic," he says, "but I agreed to join the band because I was desperate!"), Kate is the 'noisemaker' and Kush is the band's hypeactive vocalist. On paper they're nothing out of the ordinary; on wax they're out of this world.
"Originality is everything, isn't it?" says Mark. "It's all about trying to make something different."
"I have a short attention span," says Nick, "so to keep me awake we have to keep changing styles."
The current line up has been in place since 2003, after one Rusty Sheriff departed to be replaced by Kate. A self-released EP, 'Monstrous Fromage Excavator', was followed by a 7", 'Baghdad Boogie', on local label Gringo earlier this year. A 3" CD is expected soon through the Olwyn Plant label (www.olwynplant.com). Describing the band's sound is a fruitless task – it's too hard to break down into easily recognisable pigeonholes – so the best way to get some idea of what Designer Babies offer you, the listener, is to probe them for influences and inspirations…
Mark: "Ruins and Captain Beefheart."
Kate: "Japanese experimental music, The Boredoms."
Nick: "Venetian Snares and Jeff Buckley."
Kush: "Mauritiuan music and Reunion Island music [is what] I grew up with. Different things influence us at different times, I guess."
Mark: "I would say I'm not necessarily just inspired by the media; anything can inspire me."
Kate: "I'm definitely influenced by sound. We live in a really noisy world – you can't even listen to music without other sounds interfering and becoming part of what you hear. Sometimes that can actually sound really good. I like the randomness of sound."
Part of the fertile alternative scene in Nottingham, Designer Babies have enjoyed a mixture of gigs, from shows with foreign touring acts such as Melt Banana, and ones with local acts: "We have some really good promoters," says Kate, "so it's kind of 50:50 really, with half our shows being with local bands we really like and half with bands we've never met before."
"There are a lot of bands in Nottingham, and Gringo sort of help to sort out the good ones," says Mark. "They kind of hang out together 'cause they're all part of this happy Gringo family!"
"There's a focal point that allows these type of bands to come together," says Nick. "Bands help each other out a lot."
"There's not really much competition between bands, like you might find in some places, so everyone is open to hearing new stuff and they don't get threatened by it," concludes Kate.
The forthcoming 3" CD marks a change in the band's approach to recording:
"All our previous recordings have been a real rush, so we want to take out time with the next one and not have loads of pressure to get something down so we can get it out," says Kate. "We're probably going to try and do something a lot more lo-fi, and record it in our own practice space."
"The EP is a lot rawer sounding," says Mark. "We recorded it in a friend's bedroom on an eight track reel-to-reel, so it's got a less-produced feel to it than 'Baghdad Boogie'."
With a bucketload of invention and ambition – "If Merzbow can do it, then anyone can make music and sell enough to live off," offers Mark – Designer Babies could well be going places. Keep up to speed with them here: Designer Babies.net.


IOGA members are invited to post job openings, volunteer positions, and sale items.
Friends of IOGA are invited to post land, equipment, seed, or other assorted goods and services that are available for borrowing, trading, selling or giving away.
Listings will be removed 30 days after posting.
If you are not an IOGA member, you may join here.
NOW HIRING Location: Urbana, Illinois Start date: January – February 2016 Duration: 9 – 12 months Salary: Commensurate with qualifications and experience POSITION DESCRIPTION: We seek a farmer to manage a 4-acre Community Supported Agriculture (CSA) farm. Infrastructure on the farm already includes a greenhouse, walk-in cooler, water well and irrigation system, BCS tractor and other supplies. Responsibilities will include: • developing a yearly organic fruit/vegetable crop rotation plan including cover crops • planting, weeding, watering, managing fertilizers, pesticides and other inputs, and harvesting produce • promoting the farm, helping to solicit annual shareholders and maintaining shareholder, client and Board relationships • managing a 100 – 120 member CSA including the weekly distribution and pickup for shareholders and donated produce • overseeing work of seasonal staff, volunteers, seasonal interns, and community outreach programs • working with farm board to develop responsible and realistic annual budget • retail and wholesale sales of produce. POSITION REQUIREMENTS: Experience in working on a Community Supported Agriculture farm or vegetable farm in the Midwest is important. Preference is given to candidates who have expertise and experience running comparable farm operations. Also important is the ability to demonstrate being able to work with Board of Directors, developing a yearly growing plan, managing budgeted money, maintaining a focus on the farm mission and achieving shareholder goals. SOLA GRATIA FARM, LLC: Sola Gratia Farm is a Community Supported Agricultural organization affiliated with St. Matthew Lutheran Church. The Farm is dedicated to producing locally-grown, high-quality, natural foods for its shareholders. The Farm promotes healthy living in our community through education, service and outreach programs. Responding to the Gospel, St. Matthew Lutheran Church and the Farm have committed to leveraging at least 10% of its produce to support regional hunger programs. Send cover letter and resume no later than close of business December 15, 2015 to Tod Satterthwaite, Sola Gratia Farm, 2200 S. Philo Rd., Urbana, IL 61802 or electronically to todsatterthwaite@gmail.com. Early applications encouraged. Call 217-3674-1189 with any questions.
Salary: $28,000 – $32,000, commensurate with qualifications and experience, some benefits and a bonus package included.
•	retail and wholesale sales of produce.
Experience in working on a Community Supported Agriculture farm or vegetable farm in the Midwest is important. Preference is given to candidates who have expertise and experience running comparable farm operations. Also important is the ability to work effectively with Board of Directors, developing a yearly growing plan, managing budgeted money, maintaining a focus on the farm mission and achieving shareholder goals.
Send cover letter and resume no later than close of business January 22, 2016 to Tod Satterthwaite, Sola Gratia Farm, 2200 S. Philo Rd., Urbana, IL 61802 or electronically to todsatterthwaite@gmail.com. Early applications encouraged. Call 217-367-1189 with any questions.
What county is the land in?
I have 10 acres rotational pasture and 5 acres just out of CRP, all eligible for organic certification. Set of farm buildings, some equipment, 25-box chicken house, plus 2-story apartment on site. Interested in locating manager/partner. Located north of Rockford.


Ready to stay in the sun and have some fun this summer? What better way to tickle your taste buds and enjoy the height of summer than indulging in the newest treats from Tim Hortons Philippines.
"Summer means fun and enjoyment. And we wanted to offer our guests food options that are light and tasty, ideal for the season. Food that they will relish," said marketing director of Tim Hortons Philippines, Stephanie Guerrero.
"We also wanted to offer nutritious and delicious items on our menu that people observing Lent can order," Guerrero added.
Being just the perfect fare for hot weather, guests will take a shine to the Tuna Melt Sandwich and Fizz Coolers offered at Tim Hortons Philippines. This scrumptious pair will satiate their hunger and refresh their mood this summer.
Indulge in the Tuna Melt Sandwich, a new take on the artisan style grilled cheese panini that features melted cheddar cheese, tomatoes, onion slices and luscious chunks of tuna. To complement the meal, guests can plunge into the sensational fizzle of the Fizz Coolers, with its uniquely flavored variants.
Whether to kick back and chill or dive into a new adventure this summer, #MakeYourDayGood with these summer treats from Tim Hortons.
Tuna Melt is now available at all Tim Hortons branches for lunch and dinner and priced at Php 175 a la carte and Php 275 as a combo meal. Fizz Coolers will be available March 18 onwards and priced at Php 120 (Small), Php 135 (Medium) and Php 150 (Large).


Optimises Folic Acid Levels. For use before and during pregnancy.
Folic Acid is essential for the healthy growth and development of your baby. Reduces the risk of brain and spinal cord birth defects.
► Contains folic acid which is essential for the healthy growth and development of your baby.
It is best taken one month before conception and throughout the pregnancy as many woman planning pregnancy may not obtain adequate levels of folic acid in their diet. It may take approx 4 cups of cooked green beans each day to obtain the equivalent 300ug of folic acid through diet alone.
A convenient dose of folic acid developed for women planning pregnancy who want extra support to ensure they're getting optimal levels of folic acid - espcially prior to conception and during the first trimester, which is a critical time for the development of baby's nervous system.
Folic Acid supplements should be taken in conjunction with a healthy diet. Folic Acid is a B vitamin and is found naturally in leafy vegetable, citrus fruits, whole wheat bread, yeasts, liver and legumes.
Adults - One tablet daily with main meal, or as professionally prescribed.
None clinically significant noted in the literature at the recommended dosage.


text:
package org.fox.ttcomics;

import java.io.File;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteStatement;
import android.provider.BaseColumns;

public class DatabaseHelper extends SQLiteOpenHelper {

	public static final String DATABASE_NAME = "ComicsCache.db";
	public static final int DATABASE_VERSION = 2;

	public DatabaseHelper(Context context) {
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("DROP TABLE IF EXISTS comics_cache;");

		db.execSQL("CREATE TABLE IF NOT EXISTS comics_cache (" +
                BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
                "filename TEXT, " +
                "path TEXT, " +				//v2
                "checksum TEXT, " +			//v2
                "size INTEGER, " +
                "position INTEGER, " +
                "max_position INTEGER" +
                ");");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		if (oldVersion == 1 && newVersion == 2) {

			db.execSQL("ALTER TABLE comics_cache ADD COLUMN path TEXT;");
			db.execSQL("ALTER TABLE comics_cache ADD COLUMN checksum TEXT;");

			Cursor c = db.query("comics_cache", null,
					null, null, null, null, null);

			if (c.moveToFirst()) {
				while (!c.isAfterLast()) {
					int id = c.getInt(c.getColumnIndex(BaseColumns._ID));
					String fileName = c.getString(c.getColumnIndex("filename"));

					File file = new File(fileName);

					SQLiteStatement stmt = db.compileStatement("UPDATE comics_cache SET filename = ?, path = ? WHERE " + BaseColumns._ID + " = ?");
					stmt.bindString(1, file.getName());
					stmt.bindString(2, file.getParentFile().getAbsolutePath());
					stmt.bindLong(3, id);
					stmt.execute();

					c.moveToNext();
				}
			}

			c.close();
		}
	}

}


text:
Moscow Reserves Right to Retaliate Over FBI Probe Into Sputnik
© AFP 2019 / Mandel Ngan
https://sputniknews.com/russia/201709151057422679-moscow-sputnik-fbi-probe/
Russian Foreign Ministry spokeswoman Maria Zakharova has commented on the FBI questioning of a former Sputnik employee as part of a probe into the news agency's activities.
The Russian Foreign Ministry spokeswoman said that Moscow reserves the right to retaliate over the FBI investigation into Sputnik news agency.
"We reserve the right to respond to the outrageous actions of the American side," Maria Zakharova said.
Maria Zakharova called the FBI questioning of a former Sputnik employee "unacceptable" for a democratic state.
US' pressure on Sputnik is an "obvious" violation of Washington's obigations as the US is "posing as the protector of free speech", she stressed.
"The pressure of the US authorities on the Russian news agency is an obvious violation of international commitments regarding the freedom of expression and media activities. Such an unjustified move by the United States is unacceptable for a democratic state," the representative of the Russian Foreign Ministry said.
Zakharova's statement comes as it was reported earlier this week that the US Federal Bureau of Investigation (FBI) questioned former Sputnik employee Andrew Feinberg as part of the investigation of reports that the agency allegedly acted as a Russian propaganda agency in violation of the US Foreign Agents Act (FARA). At the same time, the portal claimed that the FBI also received access to Sputnik's working correspondence of Feinberg and another former employee of the agency's Washington bureau, Joseph John Fionda.
'If in Doubt, Bash Russia': Why FBI Probe Into Sputnik Echoes Cold War
The Kremlin said that the FBI probe into Sputnik indicates serious censorship problems in the United States, describing the action as a move contradicting pluralism and freedom of the press.
The FBI itself did not respond to the official inquiry on whether it conducted an investigation against the agency within two days, Mindia Gavasheli, editor-in-chief of the Sputnik Bureau in Washington DC, said. Meanwhile, Sputnik Editor-in-Chief Margarita Simonyan slammed the FBI interrogation of Sputnik's ex-employee and said that Russia will respond if an investigation is launched.
Earlier, a bill was submitted to the House of Representatives of the US Congress to amend requirements for registration of foreign agents under the FARA. The project involves the allocation of additional powers to the US Department of Justice, which includes the FBI, to identify and prosecute organizations that "illegally" try to influence the political processes in the United States.
FBI Investigation Into Sputnik Indicates Serious Censorship Problems - Kremlin
US Press Freedom Advocates Concerned Over FBI Involvement Into Sputnik
FBI Questions Ex-Sputnik Employee, Scrutinizing News Agency's Correspondence
investigation, Federal Bureau of Investigation (FBI), Sputnik, Maria Zakharova, United States, Russia


Silk Daisies. Daisies are part of the asteraceae family of flowering plants. The word aster comes from the Greek word for "star". The daisy, with its star-shaped flower, is a representative member of the family. Silk daisies are very versatile. Silk daisies of the gerbera variety come in bright colors and are popular in contemporary silk flower arrangements. Daisy silk flowers also look great mixed with black eyed susans, gypsophilia, freesia, and many other silk flowers.
Silk orchids are the perfect fusion of high color and high fashion. Native to subtropical and tropical areas, orchids have a distinct, exotic look. Our orchid selection boasts silk flower centerpieces, arrangements in acrylic water, and even miniature orchids set in candles.
Silk roses are a classic favorite and are available in a wide selection of colors. Passionate dark reds, fresh whites, and charming yellows are a few of the types you'll find on Designer Silk Plants and Flowers. Roses are a very popular floral gift for any time of year an appropriate for almost any occasion.
Above are listed just a few of the silk floral arrangements we have to offer. If you have any questions about our products, please contact us by phone or email. Our helpful, knowledgeable staff is ready to assist you in finding the perfect silk floral arrangements for you.


text:
package com.cardpay.pccredit.jnpad.model;

/**
 * 客户进件信息
 * @author Administrator
 *
 */
public class AppInfoListVo {
   private int refuseNum;
   private int approvedNum;
 private int returncount;
   private int allcount;
public int getReturncount() {
	return returncount;
}
public void setReturncount(int returncount) {
	this.returncount = returncount;
}
public int getAllcount() {
	return allcount;
}
public void setAllcount(int allcount) {
	this.allcount = allcount;
}
public int getRefuseNum() {
	return refuseNum;
}
public void setRefuseNum(int refuseNum) {
	this.refuseNum = refuseNum;
}
public int getApprovedNum() {
	return approvedNum;
}
public void setApprovedNum(int approvedNum) {
	this.approvedNum = approvedNum;
}

}


Stylish, quality footwear can maximize the beauty of a woman. As of today, footwear is available in both regular brick-and-mortar stores and online stores, thanks to the technology. However, most of these stores don't sell quality and affordability together. In simplest terms, finding top quality footwear for affordable price is a challenging task for many women under practical circumstances. However, if you visit an online footwear store like Public Desire, you can grab a stylish pair of shoes at an affordable price, for real!
Public desire is a globally recognized, leading footwear brand that sells its products online. They update their fashion store on regular basis and therefore, you stand a good chance to get access to the latest fashions every day. The most attractive thing about Public Desire is the affordability they possess. Although the quality of footwear is supreme, their price tags are very affordable. In other words, Public Desire allows you to experience the latest, top quality footwear without costing a fortune. The global distribution center of Public Desire is located in the UK; as of today, they ship their quality footwear across the globe. Public Desire has managed to build a great reputation in the fashion industry; they have added a large number of quality footwear to amaze the passionate women across the globe. This footwear is offered under various categories. They accept all the prominent online payments methods in order to make the purchasing process easier. The professional team work for Public Desire ensures that your personal information is safe and secure; no third party will handle the information of the customers. As a guarantee for the quality of the products they offer, in 2016, they won the Drapers Footwear Award. They continue to expand their exclusive collection of footwear with quality; long lasting and stylish products that give the best return for the money you spend.
Always look at your best!
Public Desire's inline store consists of hundreds of stylish, quality and durable footwear under various categories. Heels, lace ups, Perspex heels, ankle boots, over the knee boots, flats, sandals you name it, they have it! On top of the affordability associated with all the shoes, they offer frequent discounts for their customers. Some of these discounts are as attractive as 85% off! They ship their products worldwide. Fast and secure shipping is assured with each and every product you purchase. The web store they have built is quite a user-friendly one; selecting the right size, desired color and the preferred style is very easy thanks to the user-friendliness. If you are a student, you are eligible for a mandatory discount of 10% from Public Desire; nothing is complicated, just provide your student status with UNiDAYS. Get the alerts of their frequent discounts in your email just by signing in.
Are you among the thousands of satisfied customers of Public Desire? If so, please let us know what you have got to comment about their services. Both Public Desire and we are serious about your comments; based on your reviews, they can further enhance their services.
What do customers think of the shoes of public desire? Read and write experiences, opinions, reviews, complaints.


For many of us, setting aside a portion of our paycheck for an emergency fund or unexpected costs, is not always a reality. That's why Texas Car Title Loan is offering Amarillo residents a way to get a quick infusion of cash to tide them over until payday. Without the hassle of spending time calling or driving around to find the right car title loan lender, Texas Car Title Loan offers a quick approval process with the convenience of an online application. That means we can have you approved in as little as 20 minutes and funded overnight. So for those times when you need a little extra help with those pressing bills or unexpected finances, Texas Car Title Loan is here to help you get the quick cash you need and feel better about your cash flow.
The Big Texan Steak Ranch restaurant is world renowned for offering its 72 oz steak dinner which comes with an appetizer, salad and potato. Visitors who can polish of this colossal meal in under an hour- their meal is FREE! Out of the 95,000 customers who have attempted- 8,500 have succeeded. For those who aren't looking for a challenge but still want to enjoy a good meal, Big Texan Steak Ranch offers a menu of taste-tempting grub which includes but is not limited to: cal fries, chicken fried steak and even rattlesnake! They even make their own beer, calling themselves the Big Texan Brewery. The Big Texan Steak Ranch also has a hotel which invites visitors who are traveling with their steeds, to book a stall that offers bedding and feed for your steed.
Getting a car title loan doesn't mean having to go without your car for a time. At Texas Car Title Loan, we don't want your auto, just the equity you have in it. With that we require that you have the "pink slip" showing that you own your car outright, a steady job with proof of income, and a willingness to repay your auto title loan. Because you already own your car, the loan is secured against its value. What's even better is that whether or not you have good credit, you can still receive a car title loan. Texas Car Title Loan can have you approved for up to $5000 to take care of those medical bills, car repairs, family vacations and any other pressing finances. Texas Auto Title Loan offers a hassle free way to get you the extra cash you need while making it fast, convenient, and friendly for Amarillo.


Offers a wide variety of quality products like slides, jump house, inflatable games ,portable bars, foam parties and photo booths.
We love our customers, let us make your party the best it can be.
Copyright © 2018 Moonjump Of Madison - All Rights Reserved.


The Myths you know and love are getting a makeover! We're excited to announce all new Mythological Munzee Variants. Much like AlternaMyths these are twists on the original Myth types that allow them to bounce to other types of munzees. These variants are only available to Myths that have been "Upgraded" and you can only change the type once.
To start things off we're launching two variants for both the Fairy and the Unicorn. We plan on releasing more Myth Variants in the coming months, so stay tuned to see some changes to your favorite Munzee critters. Remember if you purchased a Fairy it has already been "Upgraded" so you will not have to purchase an additional Myth Upgrade. Unicorns will require a Myth Upgrade to unlock the Variants though. You can purchase Myth Upgrades in the Freeze Tag Online Store.
You can convert your Myths via the website similar to how you would convert any other type of Munzee. Remember that you can only convert a Myth Variant once and after a Myth has been changed it cannot go back.
Points for Variant Myths will remain the same, they will continue counting toward their specific Myth badges just like normal. The only thing that changes is what it bounces to as well as a new capture icon in the Specials list.
In celebration of the new Myth Variants we have added a limited amount of Unicorn and Fairy Myths to the Freeze Tag Store! We have also put together a Variant Elemental Pack to help you bring some of these new myths near you.
Since the Fairies are also attracted to Air Mysteries we have reset the current monthly limit. The new limit, beginning today, is 10 every 10 days. Air Mysteries have also been discounted as well.
Unicorn Mythological Munzees- $20: Purchase HERE!
Myth Upgrade- $5: Purchase HERE!
Fairy Mythological Munzees- $25: Purchase HERE!
Variant Elemental Pack- $12 (originally $16): Purchase HERE!
Air mystery- $1.50 (originally $1.75): Purchase HERE!
Stay tuned for more information on upcoming Myth Variants and in the mean time we're excited to see all those Variants hit the map! Remember that the amount of each that are deployed are entirely up to the player community, so chat with your fellow players to make sure even amounts are being converted!


The North London derby is swept by Arsenal this season, giving a atypical defensive, combative and sluggish performance at White Hart Lane, claiming an ultra important 1-0 win over Tottenham thanks to a sublime Tomas Rosicky goal, putting back in direct contention of the Premier League title.
For Tottenham this was the continuation of an awful week: Losing to Chelsea 4-0, losing at home to Benfica in the Europa League and now to Arsenal. The realization that they don't belong to the top 4 or even remotley close to Champions League football, and that the euphoria of their managerial change was a bit early considering the two have pretty much gotten the exact same result, only Villas-Boas seemed to offer more hope for the future.
Arsenal came to defend and poach a goal, and got that right off the bat. An excellent interception by Alex Oxlade-Chamberlain, once again showing his place is in the middle and not on the wing, released Tomas Rosicky on the right side to score a beauty of a goal, only his second season, with a swerving ball with the outside of his boot from the edge of the box.
Tottenham were the dominant and more dangerous team in a match with more dangerous challenges than anything else. Eight yellow cards were given throughout the match, five of them to Spurs players, who did trouble Wojciech Szczesny but not enough, with most of their chances coming from outside the box.
Tottenham started out the second half with two excellent chances, both falling to Nacer Chadli. If the first wasn't really a miss but more of a slow reaction, the second one was another mistake by Szczesny, dropping the ball and leaving Chadli with an open goal but two defenders that blocked a bad shot from the Belgian. Arsenal had their best chance aside from the goal in the first half, as Oxlade-Chamberlain missed in a one on one situation with Hugo Lloris, trying to chip the ball clumsily instead of passing it to a wide open Lukas Podolski.
Tottenham need to stop dreaming big and concentrate on reality – trying to finish at fifth or sixth, hoping that Everton and Manchester United don't catch up. Arsenal have only one non-league distraction left, hoping that even without great football they can get good results to help them do more than just a top 4 finish.