| 20 | 
 package wiki::driver::http; | 
 package wiki::driver::http; | 
| 21 | 
 use strict; | 
 use strict; | 
| 22 | 
  | 
  | 
| 23 | 
  | 
   ## These lines should be removed after utf8 support | 
| 24 | 
  | 
   BEGIN { | 
| 25 | 
  | 
     $Message::Util::Formatter::Base::Token = qr/[\w._+\x80-\xFF-]+/; | 
| 26 | 
  | 
     require Message::Util::Formatter::Base; | 
| 27 | 
  | 
   } | 
| 28 | 
  | 
   use Message::Util::Error; | 
| 29 | 
  | 
  | 
| 30 | 
  | 
 use Message::Util::QName::General [q<ExpandedURI>], { | 
| 31 | 
  | 
   'media-type' => q<http://suika.fam.cx/~wakaba/-temp/2004/04/24/mt#>, | 
| 32 | 
  | 
 }; | 
| 33 | 
  | 
  | 
| 34 | 
 push our @Config, sub ($) { | 
 push our @Config, sub ($) { | 
 | 
   eval q{ use Message::Util::Error }; | 
  | 
| 35 | 
   my $WIKI = shift; | 
   my $WIKI = shift; | 
| 36 | 
   use Cwd qw(abs_path); | 
   use Cwd qw(abs_path); | 
| 37 | 
    | 
    | 
| 38 | 
   ## -- Filesystem path mapping | 
   ## -- Filesystem path mapping | 
| 39 | 
   for ( | 
   for ( | 
| 40 | 
      [db__cache__dir          => q"./wikidata/lock/"], | 
      [db__cache__dir          => q"./wikidata/cache/"], | 
| 41 | 
      [db__cache_struct__file  => q"./wikidata/lock/struct.db"], | 
      [db__cache_struct__file  => q"./wikidata/cache/struct.db"], | 
| 42 | 
      [db__content__dir        => q"./wikidata/page/"], | 
      [db__content__dir        => q"./wikidata/page/"], | 
| 43 | 
      [db__content__error_log  => q"./wikidata/log/db-content.log"], | 
      [db__content__error_log  => q"./wikidata/log/db-content.log"], | 
| 44 | 
      [db__bdb__home_dir       => q"./wikidata/lock/"], | 
      [db__bdb__home_dir       => q"./wikidata/lock/"], | 
| 99 | 
        | 
        | 
| 100 | 
       ## Main content | 
       ## Main content | 
| 101 | 
       $wiki->{db}->_set_prop_db (content => {-db_open => sub { | 
       $wiki->{db}->_set_prop_db (content => {-db_open => sub { | 
| 102 | 
         require SuikaWiki::DB::FileSystem::YukiWikiDBNS; | 
         require SuikaWiki::DB::FileSystem::LeafFile; | 
| 103 | 
         SuikaWiki::DB::FileSystem::YukiWikiDBNS->new  | 
         SuikaWiki::DB::FileSystem::LeafFile->new | 
| 104 | 
           (directory => $wiki->{config}->{path_to}->{db__content__dir}, | 
           (base_directory => $wiki->{config}->{path_to}->{db__content__dir}, | 
| 105 | 
            logfile   => $wiki->{config}->{path_to}->{db__content__error_log}, | 
            directory_suffix => '.ns', | 
| 106 | 
            suffix    => '.txt', | 
            file_suffix    => '.txt', | 
| 107 | 
  | 
            root_key => $wiki->{config}->{page}->{Default}, | 
| 108 | 
  | 
            -lock => $wiki->{var}->{db}->{lock_prop}->('content_prop')); | 
| 109 | 
  | 
       }, -db_close => sub { | 
| 110 | 
  | 
         my %opt = @_; | 
| 111 | 
  | 
         $opt{prop_info}->{-db}->close; | 
| 112 | 
  | 
         delete $opt{prop_info}->{-db}; | 
| 113 | 
  | 
       }}); | 
| 114 | 
  | 
        | 
| 115 | 
  | 
       ## Properties | 
| 116 | 
  | 
       $wiki->{db}->_set_prop_db (content_prop => {-db_open => sub { | 
| 117 | 
  | 
         require SuikaWiki::DB::FileSystem::LeafProp; | 
| 118 | 
  | 
         SuikaWiki::DB::FileSystem::LeafProp->new | 
| 119 | 
  | 
           (base_directory => $wiki->{config}->{path_to}->{db__content__dir}, | 
| 120 | 
  | 
            directory_suffix => '.ns', | 
| 121 | 
  | 
            file_suffix    => '.prop', | 
| 122 | 
  | 
            root_key => $wiki->{config}->{page}->{Default}, | 
| 123 | 
            -lock => $wiki->{var}->{db}->{lock_prop}->('content')); | 
            -lock => $wiki->{var}->{db}->{lock_prop}->('content')); | 
| 124 | 
       }, -db_close => sub { | 
       }, -db_close => sub { | 
| 125 | 
         my %opt = @_; | 
         my %opt = @_; | 
| 163 | 
           delete $opt{prop_info}->{-db}; | 
           delete $opt{prop_info}->{-db}; | 
| 164 | 
         }}); | 
         }}); | 
| 165 | 
        | 
        | 
 | 
       ## Berkely DB Environment Preparation | 
  | 
 | 
       use BerkeleyDB; | 
  | 
 | 
       my $bdbenv = new BerkeleyDB::Env | 
  | 
 | 
          -Home => $wiki->{config}->{path_to}->{db__bdb__home_dir}, | 
  | 
 | 
          -Config => { | 
  | 
 | 
            DB_DATA_DIR => $wiki->{config}->{path_to}->{db__content__dir}, | 
  | 
 | 
            DB_LOG_DIR => $wiki->{config}->{path_to}->{db__bdb__log_dir}, | 
  | 
 | 
            DB_TMP_DIR => $wiki->{config}->{path_to}->{db__bdb__temp_dir}, | 
  | 
 | 
          }, | 
  | 
 | 
          -ErrFile => $wiki->{config}->{path_to}->{db__bdb__log_file}, | 
  | 
 | 
          -Flags => DB_CREATE | DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL, | 
  | 
 | 
          -Verbose => $wiki->{config}->{debug}->{db}; | 
  | 
 | 
  | 
  | 
 | 
       $wiki->{db}->_set_prop_db (content__structured => {-db_open => sub { | 
  | 
 | 
         require SuikaWiki::DB::Hash; | 
  | 
 | 
         new SuikaWiki::DB::Hash constructor => sub { | 
  | 
 | 
           use MLDBM qw(BerkeleyDB::Hash);# Storable); | 
  | 
 | 
           tie my %mldb, 'MLDBM', | 
  | 
 | 
                         -Filename => $wiki->{config}->{path_to} | 
  | 
 | 
                                           ->{db__cache_struct__file}, | 
  | 
 | 
                         -Env => $bdbenv, | 
  | 
 | 
                         -Flags => DB_CREATE, | 
  | 
 | 
                         -Mode => 0644; | 
  | 
 | 
           \%mldb; | 
  | 
 | 
        }; | 
  | 
 | 
       }}); | 
  | 
 | 
        | 
  | 
| 166 | 
       ## Referer Database (See Referer plugin module) | 
       ## Referer Database (See Referer plugin module) | 
| 167 | 
       $wiki->{db}->_set_prop_db (referer => {-db_open => sub { | 
       $wiki->{db}->_set_prop_db (referer => {-db_open => sub { | 
| 168 | 
         require SuikaWiki::DB::Hash; | 
         require SuikaWiki::DB::FileSystem::Count; | 
| 169 | 
         new SuikaWiki::DB::Hash constructor => sub { | 
         SuikaWiki::DB::FileSystem::Count->new | 
| 170 | 
           tie my %db, 'BerkeleyDB::Hash', | 
           (base_directory => $wiki->{config}->{path_to}->{db__content__dir}, | 
| 171 | 
                         -Filename => 'referer.db', | 
            directory_suffix => '.ns', | 
| 172 | 
                         -Env => $bdbenv, | 
            file_suffix    => '.ref', | 
| 173 | 
                         -Flags => DB_CREATE, | 
            root_key => $wiki->{config}->{page}->{Default}, | 
| 174 | 
                         -Mode => 0644; | 
            auto_mkdir => 0, | 
| 175 | 
           \%db; | 
            -lock => $wiki->{var}->{db}->{lock_prop}->('referer')); | 
| 176 | 
        }; | 
       }, -db_close => sub { | 
| 177 | 
  | 
         my %opt = @_; | 
| 178 | 
  | 
         $opt{prop_info}->{-db}->close; | 
| 179 | 
  | 
         delete $opt{prop_info}->{-db}; | 
| 180 | 
       }}); | 
       }}); | 
| 181 | 
  | 
  | 
 | 
       ## HTTP Request Logging Database (See RequestLog plugin module) | 
  | 
 | 
       $wiki->{db}->_set_prop_db (log__http_request => {-db_open => sub { | 
  | 
 | 
         require SuikaWiki::DB::Hash; | 
  | 
 | 
         new SuikaWiki::DB::Hash constructor => sub { | 
  | 
 | 
           tie my %db, 'BerkeleyDB::Hash', | 
  | 
 | 
                         -Filename => 'http-request-log.db', | 
  | 
 | 
                         -Env => $bdbenv, | 
  | 
 | 
                         -Flags => DB_CREATE, | 
  | 
 | 
                         -Mode => 0644; | 
  | 
 | 
           \%db; | 
  | 
 | 
        }; | 
  | 
 | 
       }}); | 
  | 
 | 
        | 
  | 
| 182 | 
       ## Additional WikiDB properties should be defined here | 
       ## Additional WikiDB properties should be defined here | 
| 183 | 
       # ...     | 
       # ...     | 
| 184 | 
   }; | 
   }; | 
| 218 | 
     separator_reg => qr#\s*//\s*#, | 
     separator_reg => qr#\s*//\s*#, | 
| 219 | 
     self => '.', | 
     self => '.', | 
| 220 | 
     parent => '..', | 
     parent => '..', | 
| 221 | 
  | 
     root => '//', | 
| 222 | 
   }; | 
   }; | 
| 223 | 
    | 
    | 
| 224 | 
   ## -- Default character codes | 
   ## -- Default character codes | 
| 238 | 
       uri_fragment => 'x-punycode',     ## Reserved for possible future use | 
       uri_fragment => 'x-punycode',     ## Reserved for possible future use | 
| 239 | 
   }; | 
   }; | 
| 240 | 
    | 
    | 
| 241 | 
  | 
   ## -- User option for media types | 
| 242 | 
  | 
   $WIKI->{config}->{ExpandedURI q<media-type:accept-media-type>} = { | 
| 243 | 
  | 
     q<IMT:text/css##> => 1, | 
| 244 | 
  | 
     q<IMT:text/plain##> => 1, | 
| 245 | 
  | 
     q<IMT:text/x-suikawiki;version="0.9"##> => 1, | 
| 246 | 
  | 
     q<IMT:application/x.suikawiki.config;version="2.0"##> => 1, | 
| 247 | 
  | 
   }; | 
| 248 | 
  | 
    | 
| 249 | 
   ## -- Expires duration templates | 
   ## -- Expires duration templates | 
| 250 | 
   $WIKI->{config}->{entity}->{expires} = { | 
   $WIKI->{config}->{entity}->{expires} = { | 
| 251 | 
     edit      => {delta => 60}, | 
     edit      => {delta => 60}, | 
| 252 | 
     view      => {delta => 2*3600}, | 
     view      => {delta => 2*3600}, | 
| 253 | 
  | 
     list      => {delta => 60}, | 
| 254 | 
     lm_flaged => {delta => 30*24*3600}, | 
     lm_flaged => {delta => 30*24*3600}, | 
| 255 | 
     stylesheet => {delta => 30*24*3600}, | 
     stylesheet => {delta => 30*24*3600}, | 
| 256 | 
     error     => {delta => 60}, | 
     error     => {delta => 60}, |