# 2013 July 04
#
# The author disclaims copyright to this source code.  In place of
# a legal notice, here is a blessing:
#
#    May you do good and not evil.
#    May you find forgiveness for yourself and forgive others.
#    May you share freely, never taking more than you give.
#
#***********************************************************************
#
# This file tests that filter callbacks work as required.
#

if {![info exists testdir]} {
  set testdir [file join [file dirname [info script]] .. .. test]
} 
source [file join [file dirname [info script]] session_common.tcl]
source $testdir/tester.tcl
ifcapable !session {finish_test; return}
set testprefix sessionA


forcedelete test.db2
sqlite3 db2 test.db2
foreach {tn db} {1 db 2 db2} {
  do_test 1.$tn.1 {
    execsql {
      CREATE TABLE t1(a PRIMARY KEY, b);
      CREATE TABLE t2(a PRIMARY KEY, b);
      CREATE TABLE t3(a PRIMARY KEY, b);
    } $db
  } {}
}

proc tbl_filter {zTbl} {
  return $::table_filter($zTbl)
}

do_test 2.1 {
  set ::table_filter(t1) 1
  set ::table_filter(t2) 0
  set ::table_filter(t3) 1

  sqlite3session S db main
  S table_filter tbl_filter 

  execsql {
    INSERT INTO t1 VALUES('a', 'b');
    INSERT INTO t2 VALUES('c', 'd');
    INSERT INTO t3 VALUES('e', 'f');
  }

  set changeset [S changeset]
  S delete
  sqlite3changeset_apply db2 $changeset xConflict

  execsql {
    SELECT * FROM t1;
    SELECT * FROM t2;
    SELECT * FROM t3;
  } db2
} {a b e f}

#-------------------------------------------------------------------------
# Test that filter callbacks passed to sqlite3changeset_apply() are 
# invoked correctly.
#
reset_db
do_execsql_test 3.1 {
  CREATE TABLE t1(a PRIMARY KEY, b);
  CREATE TABLE t2(x PRIMARY KEY, y);
}

do_test 3.2 {
  execsql BEGIN
  set ::cs [changeset_from_sql { 
    INSERT INTO t1 VALUES(1, 2);
    INSERT INTO t2 VALUES('x', 'y');
  }]
  execsql ROLLBACK
  set {} {}
} {}

proc filter {x y} { 
  return [string equal $x $y] 
}

do_test 3.3 {
  sqlite3changeset_apply db $::cs {} [list filter t1]
  execsql {
    SELECT * FROM t1;
    SELECT * FROM t2;
  }
} {1 2}

do_test 3.4 {
  execsql { DELETE FROM t1 }
  sqlite3changeset_apply db $::cs {} [list filter t2]
  execsql {
    SELECT * FROM t1;
    SELECT * FROM t2;
  }
} {x y}

finish_test
