亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? primarykeyfilter.java

?? 采用 Java 編寫的數據庫系統單元測試程序。
?? JAVA
?? 第 1 頁 / 共 2 頁
字號:
/*
 *
 * The DbUnit Database Testing Framework
 * Copyright (C)2005, DbUnit.org
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

package org.dbunit.database;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
//TODO: should not have dependency on sub-package!
import org.dbunit.database.search.ForeignKeyRelationshipEdge;
import org.dbunit.dataset.DataSetException;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.ITableIterator;
import org.dbunit.dataset.ITableMetaData;
import org.dbunit.dataset.filter.AbstractTableFilter;
import org.dbunit.util.SQLHelper;

/**
 * Filter a table given a map of the allowed rows based on primary key values.<br>
 * It uses a depth-first algorithm (although not recursive - it might be refactored
 * in the future) to define which rows are allowed, as well which rows are necessary
 * (and hence allowed) because of dependencies with the allowed rows.<br>
 * <strong>NOTE:</strong> multi-column primary keys are not supported at the moment.
 * TODO: test cases
 * @author Felipe Leme <dbunit@felipeal.net>
 * @version $Revision: 629 $
 * @since Sep 9, 2005
 */
public class PrimaryKeyFilter extends AbstractTableFilter {

  private final IDatabaseConnection connection;

  private final Map allowedPKsPerTable;
  private final Map allowedPKsInput;
  private final Map pksToScanPerTable;
  
  private final boolean reverseScan;
  
  protected final Logger logger = LoggerFactory.getLogger(getClass());
  
  // cache de primary keys
  private final Map pkColumnPerTable = new HashMap();
  
  private final Map fkEdgesPerTable = new HashMap();
  private final Map fkReverseEdgesPerTable = new HashMap();
  
  // name of the tables, in reverse order of depedency
  private final List tableNames = new ArrayList();

  /**
   * Default constructor, it takes as input a map with desired rows in a final
   * dataset; the filter will ensure that the rows necessary by these initial rows
   * are also allowed (and so on...).
   * @param connection database connection
   * @param allowedPKs map of allowed rows, based on the primary keys (key is the name
   * of a table; value is a Set with allowed primary keys for that table)
   * @param reverseDependency flag indicating if the rows that depend on a row should
   * also be allowed by the filter
   */
  public PrimaryKeyFilter(IDatabaseConnection connection, Map allowedPKs, boolean reverseDependency) {
    this.connection = connection;    
    this.allowedPKsPerTable = new HashMap();    
    this.allowedPKsInput = allowedPKs;
    this.reverseScan = reverseDependency;

    // we need a deep copy here
//    this.idsToScanPerTable = new HashMap(allowedIds);   
    this.pksToScanPerTable = new HashMap(allowedPKs.size()); 
    Iterator iterator = allowedPKs.entrySet().iterator();
    while ( iterator.hasNext() ) {
      Map.Entry entry = (Map.Entry) iterator.next();
      Object table = entry.getKey();
      Set inputSet = (Set) entry.getValue();
      Set newSet = new HashSet( inputSet );
      this.pksToScanPerTable.put( table, newSet );
    }
    
  }

  public void nodeAdded(Object node) {
        logger.debug("nodeAdded(node=" + node + ") - start");

    this.tableNames.add( node );
    if ( this.logger.isDebugEnabled() ) {
      this.logger.debug("nodeAdded: " + node );
    }
  }

  public void edgeAdded(ForeignKeyRelationshipEdge edge) {
    if ( this.logger.isDebugEnabled() ) {
      this.logger.debug("edgeAdded: " + edge );
    }
    // first add it to the "direct edges"
    String from = (String) edge.getFrom();
    Set edges = (Set) this.fkEdgesPerTable.get(from);
    if ( edges == null ) {
      edges = new HashSet();
      this.fkEdgesPerTable.put( from, edges );
    }
    if ( ! edges.contains(edge) ) {
      edges.add(edge);
    }
    
    // then add it to the "reverse edges"
    String to = (String) edge.getTo();
    edges = (Set) this.fkReverseEdgesPerTable.get(to);
    if ( edges == null ) {
      edges = new HashSet();
      this.fkReverseEdgesPerTable.put( to, edges );
    }
    if ( ! edges.contains(edge) ) {
      edges.add(edge);
    }
    
    // finally, update the PKs cache
    Object pkTo = this.pkColumnPerTable.get( to );
    if ( pkTo == null ) {
      Object pk = edge.getPKColumn();
      this.pkColumnPerTable.put( to, pk );
    }
    
  }

  /**
   * @see AbstractTableFilter
   */
  public boolean isValidName(String tableName) throws DataSetException {
        logger.debug("isValidName(tableName=" + tableName + ") - start");

    //    boolean isValid = this.allowedIds.containsKey(tableName);
    //    return isValid;
    return true;
  }

  public ITableIterator iterator(IDataSet dataSet, boolean reversed)
      throws DataSetException {
    if ( this.logger.isDebugEnabled() ) {
      this.logger.debug("Filter.iterator()" );
    }
    try {
      searchPKs(dataSet);
    } catch (SQLException e) {
      throw new DataSetException( e );
    }
    return new FilterIterator(reversed ? dataSet.reverseIterator() : dataSet
        .iterator());
  }

  private void searchPKs(IDataSet dataSet) throws DataSetException, SQLException {
        logger.debug("searchPKs(dataSet=" + dataSet + ") - start");
    
    int counter = 0;
    while ( ! this.pksToScanPerTable.isEmpty() ) {
      counter ++;
      if ( this.logger.isDebugEnabled() ) {
        this.logger.debug( "RUN # " + counter );
      }
      
      for ( int i=this.tableNames.size()-1; i>=0; i-- ) {
        String tableName = (String) this.tableNames.get(i);
        // TODO: support multi-column PKs
        String pkColumn = dataSet.getTable(tableName).getTableMetaData().getPrimaryKeys()[0].getColumnName();
        Set tmpSet = (Set) this.pksToScanPerTable.get( tableName );
        if ( tmpSet != null && ! tmpSet.isEmpty() ) {
          Set pksToScan = new HashSet( tmpSet );
          if ( this.logger.isDebugEnabled() ) {
            this.logger.debug(  "before search: "+ tableName + "=>" + pksToScan );
          }
          scanPKs( tableName, pkColumn, pksToScan );
          scanReversePKs( tableName, pksToScan );
          allowPKs( tableName, pksToScan );
          removePKsToScan( tableName, pksToScan );
        } // if
      } // for 
      removeScannedTables();
    } // while
    if ( this.logger.isDebugEnabled() ) {
      this.logger.debug( "Finished searchIds()" );
    }
  } 

  private void removeScannedTables() {
        logger.debug("removeScannedTables() - start");

    Iterator iterator = this.pksToScanPerTable.entrySet().iterator();
    List tablesToRemove = new ArrayList();
    while ( iterator.hasNext() ) {
      Map.Entry entry = (Map.Entry) iterator.next();
      String table = (String) entry.getKey();
      Set pksToScan = (Set) entry.getValue();
      boolean removeIt = pksToScan.isEmpty();
      if ( ! this.tableNames.contains(table) ) {
        if ( this.logger.isWarnEnabled() ) {
          this.logger.warn("Discarding ids " + pksToScan + " of table " + table +
          "as this table has not been passed as input" );
        }
        removeIt = true;
      }
      if ( removeIt ) {
        tablesToRemove.add( table );
      }
    }
    iterator = tablesToRemove.iterator();
    while ( iterator.hasNext() ) {
      this.pksToScanPerTable.remove( iterator.next() );
    }
  }

  private void allowPKs(String table, Set newAllowedPKs) {
        logger.debug("allowPKs(table=" + table + ", newAllowedPKs=" + newAllowedPKs + ") - start");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人av福利| www.视频一区| 亚洲成av人影院| 久久se这里有精品| 91色在线porny| 欧美一区二区精品| 国产精品久久久久久妇女6080| 亚洲素人一区二区| 久久成人免费网站| 色哟哟精品一区| 2020国产精品久久精品美国| 欧美挠脚心视频网站| 久久婷婷成人综合色| 日韩欧美高清一区| 亚洲欧美偷拍另类a∨色屁股| 秋霞电影一区二区| 极品美女销魂一区二区三区免费| 成人激情校园春色| 久久亚洲综合色一区二区三区| 久久精品一区二区三区av| 麻豆精品在线看| 精品国产亚洲在线| 久久99国内精品| 日日夜夜免费精品| 91精品国产丝袜白色高跟鞋| 欧美韩国一区二区| 成人性生交大片免费看视频在线| 成人av在线一区二区| 欧美午夜免费电影| 国产精品久99| 欧美成人三级在线| 丝袜美腿亚洲一区二区图片| 久久伊99综合婷婷久久伊| 美腿丝袜亚洲三区| 亚洲国产成人私人影院tom| 91黄色小视频| 久久精品久久99精品久久| 欧美这里有精品| 亚洲动漫第一页| 国产麻豆一精品一av一免费| 欧美日韩成人一区| 日韩一区中文字幕| 国产白丝网站精品污在线入口 | 亚洲色图在线视频| www.亚洲人| 亚洲综合色视频| 色综合色狠狠天天综合色| 亚洲已满18点击进入久久| 欧美亚洲国产一区二区三区| 日韩电影在线观看电影| 日韩欧美国产wwwww| 成人免费看的视频| 午夜精品成人在线| 亚洲宅男天堂在线观看无病毒| 色综合久久久久网| 国产精品国产三级国产aⅴ入口 | 美国欧美日韩国产在线播放| 制服丝袜一区二区三区| 美女在线一区二区| 综合av第一页| 国产毛片一区二区| 中文字幕人成不卡一区| 这里只有精品免费| 99久久精品国产导航| 一区二区久久久久| 欧美肥胖老妇做爰| 亚洲制服丝袜在线| 日韩欧美一级二级三级久久久| 国产精品一区一区三区| 亚洲日韩欧美一区二区在线| 欧美另类高清zo欧美| 成人激情免费网站| 久久久99精品免费观看| 欧美精品一卡两卡| 91免费视频观看| 日日欢夜夜爽一区| 亚洲一区欧美一区| 337p日本欧洲亚洲大胆精品| 国产高清在线精品| 国产一二精品视频| 18成人在线观看| 日本一区二区不卡视频| 国产欧美va欧美不卡在线| 日韩女同互慰一区二区| 69精品人人人人| 高清av一区二区| 视频精品一区二区| 亚洲人成精品久久久久| 国产精品久久午夜夜伦鲁鲁| 日本高清不卡一区| 成人免费视频播放| 亚洲国产成人tv| 1000精品久久久久久久久| 欧美国产国产综合| 国产亚洲va综合人人澡精品| 91亚洲精品一区二区乱码| 国产精品自在在线| 国产精品白丝jk黑袜喷水| 激情综合亚洲精品| 国产成人一区二区精品非洲| 国内精品久久久久影院薰衣草| 琪琪久久久久日韩精品| 久热成人在线视频| 国产一区二区女| 在线观看国产精品网站| 97久久精品人人爽人人爽蜜臀| 国产福利精品一区| 一片黄亚洲嫩模| 亚洲一卡二卡三卡四卡五卡| 亚洲6080在线| 国产精品婷婷午夜在线观看| 中文字幕视频一区二区三区久| 亚洲伦理在线精品| 日韩国产精品久久久久久亚洲| 午夜视频久久久久久| 久久精品国产77777蜜臀| 成人99免费视频| 欧美中文字幕一区二区三区亚洲| 欧美美女一区二区在线观看| 亚洲欧美日韩国产综合在线| 国产成人精品影院| 精品国精品国产| 精品无码三级在线观看视频 | 在线看不卡av| 亚洲欧美激情插| 色婷婷av久久久久久久| 亚洲三级视频在线观看| 91麻豆产精品久久久久久| 亚洲免费观看高清完整版在线 | 奇米在线7777在线精品| 日韩一区二区精品在线观看| 蜜桃久久久久久| 国产亚洲短视频| 成人a免费在线看| 自拍偷拍亚洲激情| 欧美日韩国产免费一区二区| 日本麻豆一区二区三区视频| 日韩西西人体444www| 激情久久久久久久久久久久久久久久 | 国产精品久久久久久久久久久免费看 | 国产一区二区三区精品欧美日韩一区二区三区 | 成人av电影免费在线播放| 亚洲综合色成人| 欧美变态凌虐bdsm| av资源网一区| 日韩综合小视频| 国产拍欧美日韩视频二区| 色先锋aa成人| 精品一区二区三区在线观看| 国产精品传媒入口麻豆| 欧美久久久一区| eeuss国产一区二区三区| 偷窥少妇高潮呻吟av久久免费| 26uuu国产一区二区三区| 色av一区二区| 国产成人av自拍| 日韩国产精品久久久| 国产精品久久久爽爽爽麻豆色哟哟| 在线视频欧美区| 成人国产免费视频| 奇米在线7777在线精品| 一区二区三区四区高清精品免费观看| 欧美一级夜夜爽| 在线看国产日韩| 91免费看视频| 国产高清无密码一区二区三区| 天天做天天摸天天爽国产一区 | 中文字幕精品在线不卡| 日韩一区二区精品| 欧美日韩中文国产| 99精品一区二区三区| 国产精品1区2区3区在线观看| 免费亚洲电影在线| 亚洲国产精品影院| 亚洲综合激情网| 一区二区免费在线| 一区二区欧美视频| 亚洲一区二区av在线| 一区二区三区在线免费观看 | 成人av在线网| av成人免费在线| 99国产欧美另类久久久精品| 国产+成+人+亚洲欧洲自线| 成人性生交大片免费看中文网站| 激情五月婷婷综合| 国产成人自拍网| a4yy欧美一区二区三区| 99re热视频精品| 91福利社在线观看| 欧美视频自拍偷拍| 777亚洲妇女| 精品国内片67194| 国产欧美视频在线观看| 国产欧美一区二区三区在线看蜜臀| 国产色婷婷亚洲99精品小说| 国产精品伦理一区二区| 一区二区视频在线| 日韩av一区二| 国产成人免费视频精品含羞草妖精| 国产麻豆成人精品|