localmemcache 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. data/README +18 -11
  2. data/Rakefile +22 -7
  3. data/VERSION +1 -1
  4. data/bench/common.rb +7 -0
  5. data/bench/gdbm_vs_lmc +10 -0
  6. data/bench/gdbm_vs_lmc.rb +29 -0
  7. data/bench/lmc_bench +11 -0
  8. data/bench/lmc_bench.rb +27 -0
  9. data/bench/memcached_bench +8 -0
  10. data/bench/memcached_bench.rb +19 -0
  11. data/bench/tyrant_bench +10 -0
  12. data/bench/tyrant_bench.rb +19 -0
  13. data/example/hello.c +1 -1
  14. data/site/doc/classes/LocalMemCache/ArgError.html +113 -0
  15. data/site/doc/classes/LocalMemCache/InitError.html +113 -0
  16. data/site/doc/classes/LocalMemCache/LocalMemCacheError.html +111 -0
  17. data/site/doc/classes/LocalMemCache/LockError.html +113 -0
  18. data/site/doc/classes/LocalMemCache/LockTimedOut.html +113 -0
  19. data/site/doc/classes/LocalMemCache/MemoryPoolClosed.html +113 -0
  20. data/site/doc/classes/LocalMemCache/MemoryPoolFull.html +113 -0
  21. data/site/doc/classes/LocalMemCache/OutOfMemoryError.html +113 -0
  22. data/site/doc/classes/LocalMemCache/RecoveryFailed.html +113 -0
  23. data/site/doc/classes/LocalMemCache/ShmError.html +113 -0
  24. data/site/doc/classes/LocalMemCache/ShmLockFailed.html +113 -0
  25. data/site/doc/classes/LocalMemCache/ShmUnlockFailed.html +113 -0
  26. data/site/doc/classes/LocalMemCache.html +515 -0
  27. data/site/doc/classes/LocalMemCache.src/M000001.html +19 -0
  28. data/site/doc/classes/LocalMemCache.src/M000002.html +18 -0
  29. data/site/doc/classes/LocalMemCache.src/M000003.html +18 -0
  30. data/site/doc/classes/LocalMemCache.src/M000004.html +39 -0
  31. data/site/doc/classes/LocalMemCache.src/M000005.html +29 -0
  32. data/site/doc/classes/LocalMemCache.src/M000006.html +23 -0
  33. data/site/doc/classes/LocalMemCache.src/M000007.html +23 -0
  34. data/site/doc/classes/LocalMemCache.src/M000008.html +22 -0
  35. data/site/doc/classes/LocalMemCache.src/M000009.html +24 -0
  36. data/site/doc/classes/LocalMemCache.src/M000010.html +24 -0
  37. data/site/doc/classes/LocalMemCache.src/M000011.html +22 -0
  38. data/site/doc/classes/LocalMemCache.src/M000012.html +22 -0
  39. data/site/doc/created.rid +1 -0
  40. data/site/doc/files/__/src/ruby-binding/extconf_rb.html +108 -0
  41. data/site/doc/files/__/src/ruby-binding/localmemcache_rb.html +108 -0
  42. data/site/doc/files/__/src/ruby-binding/rblocalmemcache_c.html +101 -0
  43. data/site/doc/fr_class_index.html +39 -0
  44. data/site/doc/fr_file_index.html +28 -0
  45. data/site/doc/fr_method_index.html +38 -0
  46. data/site/doc/index.html +24 -0
  47. data/site/doc/rdoc-style.css +208 -0
  48. data/site/index.html +50 -46
  49. data/src/lmc_common.c +22 -0
  50. data/src/lmc_common.h +4 -0
  51. data/src/lmc_hashtable.h +1 -1
  52. data/src/lmc_lock.c +17 -3
  53. data/src/lmc_shm.c +4 -2
  54. data/src/lmc_valloc.c +6 -5
  55. data/src/lmc_valloc.h +1 -0
  56. data/src/localmemcache.c +56 -35
  57. data/src/localmemcache.h +161 -4
  58. data/src/ruby-binding/localmemcache.rb +48 -16
  59. data/src/ruby-binding/rblocalmemcache.c +131 -24
  60. data/src/tests/bench.rb +1 -1
  61. data/src/tests/lmc.rb +11 -2
  62. metadata +48 -7
  63. data/INTERNALS +0 -26
  64. data/example/hello.bin +0 -0
data/README CHANGED
@@ -1,26 +1,30 @@
1
1
  Localmemcache README
2
2
  =====================
3
3
 
4
- The beauty of memcached. For local data. Blazingly fast.
4
+ A persistent key-value database based on mmap()'ed shared memory.
5
5
 
6
6
  * http://localmemcache.rubyforge.org/
7
7
 
8
8
  WHAT IS IT?
9
9
  ===========
10
10
 
11
- Localmemcache is a library for C and ruby that aims to provide an interface
12
- similar to memcached but for accessing local data instead of remote data. It's
13
- based on mmap()'ed shared memory for maximum speed.
11
+ Localmemcache is a library for C and ruby that aims to provide
12
+ an interface similar to memcached but for accessing local data instead of
13
+ remote data. It's based on mmap()'ed shared memory for maximum speed.
14
+ Since version 0.3.0 it supports persistence, also making it a fast
15
+ alternative to GDBM and Berkeley DB.
14
16
 
15
17
  SUPPORTED SYSTEMS
16
18
  =================
17
19
 
18
- - Unix (for mmap)
19
- - A CPU architecture with more than 32 bits is recommended, since otherwise you
20
- might run out of virtual address space when you use larger shared memory
21
- segments.
22
- - OS X is not supported, because it doesn't have sem_timedwait() and
23
- sem_getvalue().
20
+ - a >=64bit Unix
21
+ - a file system that offers sparse files
22
+
23
+ Note for OS X: OS X disqualifies as HFS+ doesn't have sparse files and
24
+ sem_timedwait() and sem_getvalue() aren't supported as well.
25
+
26
+ Note for FreeBSD: It has been reported that Localmemcache sometimes hangs
27
+ there, it is not yet clear what the problem is.
24
28
 
25
29
  EXAMPLE
26
30
  =======
@@ -28,7 +32,10 @@ EXAMPLE
28
32
  In Ruby:
29
33
 
30
34
  require 'localmemcache'
31
- $lm = LocalMemCache.new :namespace => "viewcounters"
35
+ # 1. the memcached way
36
+ # $lm = LocalMemCache.new :namespace => :viewcounters
37
+ # 2. the GDBM way
38
+ $lm = LocalMemCache.new :filename => "./viewcounters.lmc"
32
39
  $lm[:foo] = 1
33
40
  $lm[:foo]
34
41
  $lm.delete(:foo)
data/Rakefile CHANGED
@@ -32,6 +32,18 @@ task :sanity_test do
32
32
  "make -C src/tests/ && ./src/tests/lmc "
33
33
  end
34
34
 
35
+ task :performance_test do
36
+ sh "./configure && make -C src clean && make -C src && " +
37
+ "(cd src/ruby-binding; ruby extconf.rb) && " +
38
+ "make -C src/ruby-binding/ && " +
39
+ "(cd src/tests; ruby extconf.rb) && " +
40
+ "make -C src/tests/ && ./src/tests/lmc; " +
41
+ "./src/tests/bench; " +
42
+ "ls -al /var/tmp/localmemcache/speed-comparison.lmc && " +
43
+ "du -h /var/tmp/localmemcache/speed-comparison.lmc && " +
44
+ "uname -a && ruby -v "
45
+ end
46
+
35
47
  task :c_api_package do
36
48
  tgz = "pkg/localmemcache-#{version}.tar.gz"
37
49
  sh "test -d pkg || mkdir pkg"
@@ -42,8 +54,8 @@ end
42
54
  #task :pushsite => [:rdoc] do
43
55
  task :pushsite do
44
56
  sh "chmod 755 site"
45
- sh "chmod 644 site/*.html"
46
- sh "chmod 644 site/*.css"
57
+ sh "find site -type d | xargs chmod go+rx"
58
+ sh "find site -type f | xargs chmod go+r"
47
59
  sh 'rsync --rsh="ssh -i $HOME/.ssh/id_rsa_oss -l sck" -avz site/ sck@localmemcache.rubyforge.org:/var/www/gforge-projects/localmemcache/'
48
60
  end
49
61
 
@@ -62,19 +74,22 @@ else
62
74
  s.name = "localmemcache"
63
75
  s.version = version
64
76
  s.platform = Gem::Platform::RUBY
65
- s.summary = "The beauty of memcached. For local data. " +
66
- "Blazingly fast"
77
+ s.summary = "A persistent key-value database based on mmap()'ed shared memory."
67
78
 
68
79
  s.description = <<-EOF
69
80
 
70
- Localmemcache aims to be faster than using memcached locally by using shared
71
- memory, but providing a similar interface.
81
+ Localmemcache is a library for C and ruby that aims to provide
82
+ an interface similar to memcached but for accessing local data instead of
83
+ remote data. It's based on mmap()'ed shared memory for maximum speed.
84
+ Since version 0.3.0 it supports persistence, also making it a fast
85
+ alternative to GDBM and Berkeley DB.
86
+
72
87
  EOF
73
88
 
74
89
  s.files = manifest
75
90
  s.extensions = ['configure', 'src/ruby-binding/extconf.rb']
76
91
  s.require_path = 'src/ruby-binding'
77
- s.has_rdoc = false
92
+ s.has_rdoc = true
78
93
  s.test_files = Dir['src/test/*.rb']
79
94
 
80
95
  s.author = 'Sven C. Koehler'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.3.0
data/bench/common.rb ADDED
@@ -0,0 +1,7 @@
1
+ def measure_time(c, &block)
2
+ _then = Time.now
3
+ c.times { block.call }
4
+ now = Time.now
5
+ puts "#{(now - _then)*1000} ms"
6
+ end
7
+
data/bench/gdbm_vs_lmc ADDED
@@ -0,0 +1,10 @@
1
+ #! /bin/sh
2
+ D=`dirname $0`
3
+ DIR=`cd $D; pwd`
4
+ script=$DIR/gdbm_vs_lmc.rb
5
+
6
+ if test "x$1" = "x-d"; then
7
+ irb -r $script
8
+ else
9
+ ruby $script
10
+ fi
@@ -0,0 +1,29 @@
1
+ $DIR=File.dirname(__FILE__)
2
+ ['.', '../src/ruby-binding/'].each {|p| $:.unshift File.join($DIR, p) }
3
+
4
+ require 'common.rb'
5
+
6
+ def __test(n)
7
+ require 'localmemcache'
8
+ puts "LocalMemCache"
9
+ LocalMemCache.clear :filename => "/tmp/fruitstore.lmc"
10
+ $lm2 = LocalMemCache.new :filename=>"/tmp/fruitstore.lmc"
11
+ measure_time(n) {
12
+ r = rand(10000).to_s
13
+ $lm2.set(r, r)
14
+ $lm2.get(r)
15
+ }
16
+
17
+ require 'gdbm'
18
+ puts "GDBM"
19
+ h = GDBM.new("/tmp/fruitstore.db")
20
+ measure_time(n) {
21
+ r = rand(10000).to_s
22
+ h[r] = r
23
+ h[r]
24
+ }
25
+ h.close
26
+ end
27
+
28
+ __test(2_000_000)
29
+
data/bench/lmc_bench ADDED
@@ -0,0 +1,11 @@
1
+ #! /bin/sh
2
+ D=`dirname $0`
3
+ DIR=`cd $D; pwd`
4
+ script=$DIR/lmc_bench.rb
5
+
6
+ if test "x$1" = "x-d"; then
7
+ irb -r $script
8
+ else
9
+ #valgrind --leak-check=full --tool=memcheck ruby $script
10
+ ruby $script
11
+ fi
@@ -0,0 +1,27 @@
1
+ $DIR=File.dirname(__FILE__)
2
+ ['.', '../src/ruby-binding/'].each {|p| $:.unshift File.join($DIR, p) }
3
+
4
+ require 'localmemcache'
5
+ require 'common.rb'
6
+
7
+ LocalMemCache.clear_namespace("speed-comparison");
8
+ $lm2 = LocalMemCache.new :namespace=>"speed-comparison"
9
+
10
+ def compare_speed(n)
11
+ puts "LocalMemCache"
12
+ measure_time(n) {
13
+ r = rand(10000).to_s
14
+ $lm2.set(r, r)
15
+ $lm2.get(r)
16
+ }
17
+
18
+ puts "Ruby Hash with strings"
19
+ $hh = {}
20
+ measure_time(n) {
21
+ r = rand(10000).to_s
22
+ $hh[r] = r
23
+ $hh[r]
24
+ }
25
+ end
26
+
27
+ compare_speed(2_000_000)
@@ -0,0 +1,8 @@
1
+ #! /bin/sh
2
+
3
+ /usr/bin/memcached -m 3072 -p 11211 &
4
+ PID=$!
5
+
6
+ ruby ./memcached_bench.rb
7
+
8
+ kill $PID
@@ -0,0 +1,19 @@
1
+ $DIR=File.dirname(__FILE__)
2
+ ['.'].each {|p| $:.unshift File.join($DIR, p) }
3
+
4
+ require 'memcache'
5
+ require 'common.rb'
6
+
7
+ def __test(n)
8
+ memcache_ips = ['localhost:11211']
9
+ $cache = MemCache.new memcache_ips,
10
+ :namespace => 'rtn_',
11
+ :multithreaded => true
12
+ measure_time(n) {
13
+ r = rand(10000).to_s
14
+ $cache[r] = r
15
+ $cache[r]
16
+ }
17
+ end
18
+
19
+ __test(2_000_000)
@@ -0,0 +1,10 @@
1
+ #! /bin/sh
2
+
3
+ ttserver -port 2001 /tmp/foo.tch > /dev/null &
4
+ PID=$!
5
+
6
+ sleep 1
7
+
8
+ ruby ./tyrant_bench.rb
9
+
10
+ kill $PID
@@ -0,0 +1,19 @@
1
+ $DIR=File.dirname(__FILE__)
2
+ ['.'].each {|p| $:.unshift File.join($DIR, p) }
3
+
4
+ require 'memcache'
5
+ require './common.rb'
6
+
7
+ def __test(n)
8
+ memcache_ips = ['localhost:2001']
9
+ $cache = MemCache.new memcache_ips,
10
+ :namespace => 'rtn_',
11
+ :multithreaded => true
12
+ measure_time(n) {
13
+ r = rand(10000).to_s
14
+ $cache[r] = r
15
+ $cache[r]
16
+ }
17
+ end
18
+
19
+ __test(2_000_000)
data/example/hello.c CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  int main() {
5
5
  lmc_error_t e;
6
- local_memcache_t *lmc = local_memcache_create("viewcounters", 0, &e);
6
+ local_memcache_t *lmc = local_memcache_create("viewcounters", 0, 0, &e);
7
7
  if (!lmc) {
8
8
  fprintf(stderr, "Couldn't create localmemcache: %s\n", e.error_str);
9
9
  return 1;
@@ -0,0 +1,113 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Class: LocalMemCache::ArgError</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Class</strong></td>
53
+ <td class="class-name-in-header">LocalMemCache::ArgError</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../../files/__/src/ruby-binding/localmemcache_rb.html">
59
+ ../src/ruby-binding/localmemcache.rb
60
+ </a>
61
+ <br />
62
+ </td>
63
+ </tr>
64
+
65
+ <tr class="top-aligned-row">
66
+ <td><strong>Parent:</strong></td>
67
+ <td>
68
+ <a href="LocalMemCacheError.html">
69
+ LocalMemCacheError
70
+ </a>
71
+ </td>
72
+ </tr>
73
+ </table>
74
+ </div>
75
+ <!-- banner header -->
76
+
77
+ <div id="bodyContent">
78
+
79
+
80
+
81
+ <div id="contextContent">
82
+
83
+
84
+
85
+ </div>
86
+
87
+
88
+ </div>
89
+
90
+
91
+ <!-- if includes -->
92
+
93
+ <div id="section">
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+ <!-- if method_list -->
103
+
104
+
105
+ </div>
106
+
107
+
108
+ <div id="validator-badges">
109
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
110
+ </div>
111
+
112
+ </body>
113
+ </html>
@@ -0,0 +1,113 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Class: LocalMemCache::InitError</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Class</strong></td>
53
+ <td class="class-name-in-header">LocalMemCache::InitError</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../../files/__/src/ruby-binding/localmemcache_rb.html">
59
+ ../src/ruby-binding/localmemcache.rb
60
+ </a>
61
+ <br />
62
+ </td>
63
+ </tr>
64
+
65
+ <tr class="top-aligned-row">
66
+ <td><strong>Parent:</strong></td>
67
+ <td>
68
+ <a href="LocalMemCacheError.html">
69
+ LocalMemCacheError
70
+ </a>
71
+ </td>
72
+ </tr>
73
+ </table>
74
+ </div>
75
+ <!-- banner header -->
76
+
77
+ <div id="bodyContent">
78
+
79
+
80
+
81
+ <div id="contextContent">
82
+
83
+
84
+
85
+ </div>
86
+
87
+
88
+ </div>
89
+
90
+
91
+ <!-- if includes -->
92
+
93
+ <div id="section">
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+ <!-- if method_list -->
103
+
104
+
105
+ </div>
106
+
107
+
108
+ <div id="validator-badges">
109
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
110
+ </div>
111
+
112
+ </body>
113
+ </html>
@@ -0,0 +1,111 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Class: LocalMemCache::LocalMemCacheError</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Class</strong></td>
53
+ <td class="class-name-in-header">LocalMemCache::LocalMemCacheError</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../../files/__/src/ruby-binding/localmemcache_rb.html">
59
+ ../src/ruby-binding/localmemcache.rb
60
+ </a>
61
+ <br />
62
+ </td>
63
+ </tr>
64
+
65
+ <tr class="top-aligned-row">
66
+ <td><strong>Parent:</strong></td>
67
+ <td>
68
+ StandardError
69
+ </td>
70
+ </tr>
71
+ </table>
72
+ </div>
73
+ <!-- banner header -->
74
+
75
+ <div id="bodyContent">
76
+
77
+
78
+
79
+ <div id="contextContent">
80
+
81
+
82
+
83
+ </div>
84
+
85
+
86
+ </div>
87
+
88
+
89
+ <!-- if includes -->
90
+
91
+ <div id="section">
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+ <!-- if method_list -->
101
+
102
+
103
+ </div>
104
+
105
+
106
+ <div id="validator-badges">
107
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
108
+ </div>
109
+
110
+ </body>
111
+ </html>