亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
国产综合一区二区| 欧美三区免费完整视频在线观看| 色老头久久综合| 日韩三级中文字幕| 日韩中文字幕麻豆| 在线亚洲人成电影网站色www| 久久伊人蜜桃av一区二区| 欧美a级一区二区| 欧美一区二区三区播放老司机| 五月天一区二区三区| 欧洲一区二区三区在线| 97国产精品videossex| 欧美激情在线看| 成人福利视频网站| 亚洲免费电影在线| 欧美喷水一区二区| 国产呦精品一区二区三区网站| 国产精品理论片| 日本韩国精品在线| 欧美日韩精品免费| 欧美精品v日韩精品v韩国精品v| 九九视频精品免费| 国产精品高潮呻吟| 1000精品久久久久久久久| 欧美一级欧美三级在线观看| 欧美mv日韩mv国产网站app| 国产成人福利片| 一区二区免费视频| 91精品国产91久久久久久最新毛片| 欧美电影在线免费观看| 制服丝袜成人动漫| 色国产综合视频| 日韩欧美中文字幕一区| 久久只精品国产| 亚洲精品中文字幕乱码三区| 日韩欧美一二三四区| 欧美喷水一区二区| 欧美激情在线看| 午夜亚洲国产au精品一区二区| 国产在线国偷精品产拍免费yy| 色综合久久久久综合体桃花网| 国产精品888| 成人国产精品免费观看动漫| 欧美中文字幕一区| 国产亚洲福利社区一区| 26uuu精品一区二区三区四区在线| 亚洲欧美在线观看| 国产在线精品一区在线观看麻豆| 97久久精品人人做人人爽50路| 欧美乱熟臀69xxxxxx| 亚洲人成在线播放网站岛国| 久久精品久久久精品美女| 国产综合成人久久大片91| 日本精品一区二区三区高清| 久久久久久久久一| 国产精品高潮久久久久无| 国产美女娇喘av呻吟久久| 777午夜精品视频在线播放| 一区二区久久久久| 色悠悠久久综合| 国产日韩影视精品| 亚洲欧美另类久久久精品| www..com久久爱| 欧美在线视频日韩| 亚洲香蕉伊在人在线观| 青青草成人在线观看| 69久久99精品久久久久婷婷| 亚洲国产va精品久久久不卡综合| 一本一道综合狠狠老| 亚洲一区二区在线免费观看视频| 亚洲美女淫视频| 欧美日韩一区视频| 日本特黄久久久高潮| 国产精品69久久久久水密桃| 国产人成一区二区三区影院| 久久66热re国产| 中文字幕乱码久久午夜不卡| 99re这里只有精品视频首页| 亚洲国产美国国产综合一区二区| 欧美性极品少妇| 国产精品电影一区二区| 欧美伊人久久大香线蕉综合69| 丝瓜av网站精品一区二区| 91精品中文字幕一区二区三区| 国产一区不卡在线| 日本一区二区成人在线| 日本韩国欧美一区二区三区| 看电影不卡的网站| 亚洲人被黑人高潮完整版| 欧美放荡的少妇| 国产99久久久国产精品潘金| 日韩午夜电影av| 91亚洲精华国产精华精华液| 欧美激情一区二区三区| 欧美午夜精品一区| 国产91丝袜在线18| 日韩激情av在线| 亚洲视频一区二区在线观看| 国产麻豆视频一区二区| 亚洲动漫第一页| 亚洲欧洲性图库| 国产午夜三级一区二区三| 日韩一区二区视频在线观看| 秋霞成人午夜伦在线观看| 2014亚洲片线观看视频免费| 91捆绑美女网站| 精品影院一区二区久久久| 亚洲愉拍自拍另类高清精品| 国产精品视频免费| 国产麻豆9l精品三级站| 视频一区视频二区中文字幕| 国产精品美女久久久久久久网站| 欧美大片在线观看| 欧美精品v日韩精品v韩国精品v| 色播五月激情综合网| 成人美女视频在线看| 亚洲婷婷综合久久一本伊一区 | 国产**成人网毛片九色 | 日韩女优制服丝袜电影| 欧美日韩你懂的| 欧美日韩亚洲另类| 欧美日韩精品欧美日韩精品| 在线观看一区二区精品视频| 色国产精品一区在线观看| 一本在线高清不卡dvd| 欧美丝袜丝交足nylons图片| 欧美午夜不卡在线观看免费| 欧美无乱码久久久免费午夜一区 | 亚洲免费三区一区二区| 国产精品久久久99| 欧美高清在线一区二区| 国产精品国产三级国产专播品爱网 | 99久久精品国产精品久久| 91猫先生在线| 91精品国产综合久久小美女| 欧美一卡2卡3卡4卡| 国产亚洲一区二区三区四区| 欧美激情资源网| 亚洲综合色网站| 麻豆精品国产传媒mv男同| 亚洲视频电影在线| 视频一区二区三区在线| 国产成人免费视频| 欧美在线观看视频在线| 日韩一本二本av| 国产精品萝li| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产一区二区三区不卡在线观看 | 免费精品视频最新在线| 波波电影院一区二区三区| 在线播放中文一区| 国产精品久久久久天堂| 日韩1区2区日韩1区2区| 91视频国产观看| 久久久精品欧美丰满| 亚洲第一会所有码转帖| 中文字幕一区二区在线观看| 日韩在线一区二区| 99国产精品国产精品毛片| 久久这里只有精品视频网| 香蕉加勒比综合久久| 99re66热这里只有精品3直播| 欧美精品一区二区在线播放| 精品国产一区二区三区忘忧草 | 亚洲一区二区三区视频在线| 国产成人99久久亚洲综合精品| 9191成人精品久久| 亚洲欧美视频在线观看视频| av在线这里只有精品| 中文字幕电影一区| 成人爱爱电影网址| 欧美激情艳妇裸体舞| 国产一区二区免费看| 精品视频一区二区三区免费| 91超碰这里只有精品国产| 国产日韩欧美麻豆| 成人18精品视频| 亚洲一区二区三区四区不卡| 欧美体内she精视频| 日韩精品一级中文字幕精品视频免费观看 | 亚洲美女视频在线观看| 在线免费观看成人短视频| 污片在线观看一区二区| 日韩视频一区二区在线观看| 国产在线看一区| 亚洲日本乱码在线观看| 欧美日韩国产影片| 国产乱国产乱300精品| 亚洲女与黑人做爰| 在线综合+亚洲+欧美中文字幕| 国产一区二区伦理| 夜夜嗨av一区二区三区| 欧美一区二区三区四区在线观看| 国产精品白丝jk白祙喷水网站| 欧美国产日产图区| 日韩你懂的电影在线观看| 成人av免费在线| 九色porny丨国产精品| 一区二区三区.www| 国产精品网站在线|