env003.tcl
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. # See the file LICENSE for redistribution information.
  2. #
  3. # Copyright (c) 1999, 2000
  4. # Sleepycat Software.  All rights reserved.
  5. #
  6. # $Id: env003.tcl,v 11.12 2000/08/25 14:21:50 sue Exp $
  7. #
  8. # Env Test 003
  9. # Test DB_TMP_DIR and env name resolution
  10. # With an environment path specified using -home, and then again
  11. # with it specified by the environment variable DB_HOME:
  12. # 1) Make sure that the DB_TMP_DIR config file option is respected
  13. # a) as a relative pathname.
  14. # b) as an absolute pathname.
  15. # 2) Make sure that the DB_TMP_DIR db_config argument is respected,
  16. # again as relative and absolute pathnames.
  17. # 3) Make sure that if -both- db_config and a file are present,
  18. # only the file is respected (see doc/env/naming.html).
  19. proc env003 { } {
  20. #   env003 is essentially just a small driver that runs
  21. # env003_body twice.  First, it supplies a "home" argument
  22. # to use with environment opens, and the second time it sets
  23. # DB_HOME instead.
  24. #   Note that env003_body itself calls env003_run_test to run
  25. # the body of the actual test.
  26. global env
  27. source ./include.tcl
  28. puts "Env003: DB_TMP_DIR test."
  29. puts "tEnv003: Running with -home argument to berkdb env."
  30. env003_body "-home $testdir"
  31. puts "tEnv003: Running with environment variable DB_HOME set."
  32. set env(DB_HOME) $testdir
  33. env003_body "-use_environ"
  34. unset env(DB_HOME)
  35. puts "tEnv003: Running with both DB_HOME and -home set."
  36. # Should respect -only- -home, so we give it a bogus
  37. # environment variable setting.
  38. set env(DB_HOME) $testdir/bogus_home
  39. env003_body "-use_environ -home $testdir"
  40. unset env(DB_HOME)
  41. }
  42. proc env003_body { home_arg } {
  43. source ./include.tcl
  44. env_cleanup $testdir
  45. set tmpdir "tmpfiles_in_here"
  46. file mkdir $testdir/$tmpdir
  47. # Set up full path to $tmpdir for when we test absolute paths.
  48. set curdir [pwd]
  49. cd $testdir/$tmpdir
  50. set fulltmpdir [pwd]
  51. cd $curdir
  52. # Run test with the temp dir. nonexistent--it checks for failure.
  53. env_cleanup $testdir
  54. env003_make_config $tmpdir
  55. # Run the meat of the test.
  56. env003_run_test a 1 "relative path, config file" $home_arg 
  57. $testdir/$tmpdir
  58. env_cleanup $testdir
  59. env003_make_config $fulltmpdir
  60. # Run the test again
  61. env003_run_test a 2 "absolute path, config file" $home_arg 
  62. $fulltmpdir
  63. env_cleanup $testdir
  64. # Now we try without a config file, but instead with db_config
  65. # relative paths
  66. env003_run_test b 1 "relative path, db_config" "$home_arg 
  67. -tmp_dir $tmpdir -data_dir ." 
  68. $testdir/$tmpdir
  69. env_cleanup $testdir
  70. # absolute
  71. env003_run_test b 2 "absolute path, db_config" "$home_arg 
  72. -tmp_dir $fulltmpdir -data_dir ." 
  73. $fulltmpdir
  74. env_cleanup $testdir
  75. # Now, set db_config -and- have a # DB_CONFIG file, and make
  76. # sure only the latter is honored.
  77. # Make a temp directory that actually does exist to supply
  78. # as a bogus argument--the test checks for -nonexistent- temp
  79. # dirs., as success is harder to detect.
  80. file mkdir $testdir/bogus
  81. env003_make_config $tmpdir
  82. # note that we supply an -existent- tmp dir to db_config as
  83. # a red herring
  84. env003_run_test c 1 "relative path, both db_config and file" 
  85. "$home_arg -tmp_dir $testdir/bogus -data_dir ." 
  86. $testdir/$tmpdir
  87. env_cleanup $testdir
  88. file mkdir $fulltmpdir
  89. file mkdir $fulltmpdir/bogus
  90. env003_make_config $fulltmpdir/nonexistent
  91. # note that we supply an -existent- tmp dir to db_config as
  92. # a red herring
  93. env003_run_test c 2 "relative path, both db_config and file" 
  94. "$home_arg -tmp_dir $fulltmpdir/bogus -data_dir ." 
  95. $fulltmpdir
  96. }
  97. proc env003_run_test { major minor msg env_args tmp_path} {
  98. global testdir
  99. global alphabet
  100. global errorCode
  101. puts "ttEnv003.$major.$minor: $msg"
  102. # Create an environment and small-cached in-memory database to
  103. # use.
  104. set dbenv [eval {berkdb env -create -home $testdir} $env_args 
  105.     {-cachesize {0 40960 1}}]
  106. error_check_good env_open [is_valid_env $dbenv] TRUE
  107. set db [berkdb_open_noerr -env $dbenv -create -btree]
  108. error_check_good db_open [is_valid_db $db] TRUE
  109. # Fill the database with more than its cache can fit.
  110. # !!!
  111. # This is actually trickier than it sounds.  The tempfile
  112. # gets unlinked as soon as it's created, so there's no straightforward
  113. # way to check for its existence.  Instead, we make sure
  114. # DB_TMP_DIR points somewhere bogus, and make sure that the temp
  115. # dir. does -not- exist.  But to do this, we have to know
  116. # which call to DB->put is going to fail--the temp file is
  117. # created lazily, so the failure only occurs when the cache finally
  118. # overflows.
  119. # The data we've conjured up will fit nicely once, but the second
  120. # call will overflow the cache.  Thus we check for success once,
  121. # then failure.
  122. #
  123. set key1 "key1"
  124. set key2 "key2"
  125. set data [repeat $alphabet 1000]
  126. # First put should succeed.
  127. error_check_good db_put_1 [$db put $key1 $data] 0
  128. # Second one should return ENOENT.
  129. set errorCode NONE
  130. catch {$db put $key2 $data} res
  131. error_check_good db_put_2 [is_substr $errorCode ENOENT] 1
  132. error_check_good db_close [$db close] 0
  133. error_check_good env_close [$dbenv close] 0
  134. }
  135. proc env003_make_config { tmpdir } {
  136. global testdir
  137. set cid [open $testdir/DB_CONFIG w]
  138. puts $cid "set_data_dir ."
  139. puts $cid "set_tmp_dir $tmpdir"
  140. close $cid
  141. }