SF.net SVN: phpwiki:[11052] trunk/lib/WikiDB/backend

vargenau--- via phpwiki-checkins <[email protected]> Fri, 14 Jul 2023 11:00:34 +0000
Newsgroups gmane.comp.web.wiki.phpwiki.checkins
Message-ID <[email protected]>
Revision: 11052
          http://sourceforge.net/p/phpwiki/code/11052
Author:   vargenau
Date:     2023-07-14 11:00:34 +0000 (Fri, 14 Jul 2023)
Log Message:
-----------
lib/WikiDB/backend: PHP 7: add types for function arguments and return

Modified Paths:
--------------
    trunk/lib/WikiDB/backend/PDO.php
    trunk/lib/WikiDB/backend/PDO_mysql.php
    trunk/lib/WikiDB/backend/PDO_oci8.php
    trunk/lib/WikiDB/backend/PDO_pgsql.php
    trunk/lib/WikiDB/backend/PearDB.php
    trunk/lib/WikiDB/backend/PearDB_ffpgsql.php
    trunk/lib/WikiDB/backend/PearDB_mysqli.php
    trunk/lib/WikiDB/backend/PearDB_oci8.php
    trunk/lib/WikiDB/backend/PearDB_pgsql.php
    trunk/lib/WikiDB/backend/dba.php
    trunk/lib/WikiDB/backend/dbaBase.php
    trunk/lib/WikiDB/backend/dumb/AllRevisionsIter.php
    trunk/lib/WikiDB/backend/dumb/LinkSearchIter.php
    trunk/lib/WikiDB/backend/dumb/MostPopularIter.php
    trunk/lib/WikiDB/backend/file.php
    trunk/lib/WikiDB/backend/flatfile.php

Modified: trunk/lib/WikiDB/backend/PDO.php
===================================================================
--- trunk/lib/WikiDB/backend/PDO.php	2023-07-14 10:33:04 UTC (rev 11051)
+++ trunk/lib/WikiDB/backend/PDO.php	2023-07-14 11:00:34 UTC (rev 11052)
@@ -278,7 +278,7 @@
     /*
      * Read page information from database.
      */
-    public function get_pagedata($pagename)
+    public function get_pagedata(string $pagename): array
     {
         $dbh = &$this->_dbh;
         $page_tbl = $this->_table_names['page_tbl'];
@@ -290,7 +290,7 @@
         return $row ? $this->_extract_page_data($row[3], $row[2]) : false;
     }
 
-    public function _extract_page_data($data, $hits)
+    public function _extract_page_data($data, $hits): array
     {
         if (empty($data)) {
             return array('hits' => $hits);
@@ -299,7 +299,7 @@
         }
     }
 
-    public function update_pagedata($pagename, $newdata)
+    public function update_pagedata(string $pagename, array $newdata): bool
     {
         $dbh = &$this->_dbh;
         $page_tbl = $this->_table_names['page_tbl'];
@@ -434,7 +434,7 @@
         return $id;
     }
 
-    public function get_latest_version($pagename)
+    public function get_latest_version(string $pagename): int
     {
         $dbh = &$this->_dbh;
         extract($this->_table_names);
@@ -448,7 +448,7 @@
         return $sth->fetchColumn();
     }
 
-    public function get_previous_version($pagename, $version)
+    public function get_previous_version(string $pagename, int $version): int
     {
         $dbh = &$this->_dbh;
         extract($this->_table_names);
@@ -474,7 +474,7 @@
      *
      * @return array|false The version data, or false if specified version does not exist.
      */
-    public function get_versiondata($pagename, $version, $want_content = false)
+    public function get_versiondata(string $pagename, int $version, bool $want_content = false)
     {
         $dbh = &$this->_dbh;
         extract($this->_table_names);
@@ -555,7 +555,7 @@
     /*
      * Create a new revision of a page.
      */
-    public function set_versiondata($pagename, $version, $data)
+    public function set_versiondata(string $pagename, int $version, array $data)
     {
         $dbh = &$this->_dbh;
         $version_tbl = $this->_table_names['version_tbl'];
@@ -611,7 +611,7 @@
     /*
      * Delete an old revision of a page.
      */
-    public function delete_versiondata($pagename, $version)
+    public function delete_versiondata(string $pagename, int $version)
     {
         $dbh = &$this->_dbh;
         extract($this->_table_names);
@@ -637,7 +637,7 @@
      * so that get_latest_version returns id+1 and get_previous_version returns prev id
      * and page->exists returns false.
      */
-    public function delete_page($pagename)
+    public function delete_page(string $pagename): bool
     {
         /**
          * @var WikiRequest $request
@@ -699,7 +699,7 @@
     /*
      * Delete page completely from the database.
      */
-    public function purge_page($pagename)
+    public function purge_page(string $pagename): int
     {
         $dbh = &$this->_dbh;
         extract($this->_table_names);
@@ -734,7 +734,7 @@
      * @param string $pagename Page name
      * @param array  $links    List of page(names) which page links to.
      */
-    public function set_links($pagename, $links)
+    public function set_links(string $pagename, array $links)
     {
         // Update link table.
         // FIXME: optimize: mysql can do this all in one big INSERT/REPLACE.
@@ -803,13 +803,13 @@
      *   if (isset($next['linkrelation']))
      */
     public function get_links(
-        $pagename,
-        $reversed = true,
-        $include_empty = false,
-        $sortby = '',
-        $limit = '',
-        $exclude = '',
-        $want_relations = false
+        string $pagename,
+        bool   $reversed = true,
+        bool   $include_empty = false,
+        string $sortby = '',
+        string $limit = '',
+        string $exclude = '',
+        bool $want_relations = false
     )
     {
         $dbh = &$this->_dbh;
@@ -872,10 +872,10 @@
     }
 
     public function get_all_pages(
-        $include_empty = false,
-        $sortby = '',
-        $limit = '',
-        $exclude = ''
+        bool   $include_empty = false,
+        string $sortby = '',
+        string $limit = '',
+        string $exclude = ''
     )
     {
         $dbh = &$this->_dbh;
@@ -935,11 +935,11 @@
      * Text search (title or full text)
      */
     public function text_search(
-        $search,
-        $fulltext = false,
-        $sortby = '',
-        $limit = '',
-        $exclude = ''
+        object $search,
+        bool   $fulltext = false,
+        string $sortby = '',
+        string $limit = '',
+        string $exclude = ''
     )
     {
         $dbh = &$this->_dbh;
@@ -991,7 +991,7 @@
      * This is only for already resolved wildcards:
      * " WHERE $page_tbl.pagename NOT IN ".$this->_sql_set(array('page1','page2'));
      */
-    public function _sql_set($pagenames)
+    public function _sql_set($pagenames): string
     {
         $s = '(';
         foreach ($pagenames as $p) {
@@ -1003,7 +1003,7 @@
     /*
      * Find highest or lowest hit counts.
      */
-    public function most_popular($limit = 20, $sortby = '-hits')
+    public function most_popular(int $limit = 20, string $sortby = '-hits')
     {
         $dbh = &$this->_dbh;
         extract($this->_table_names);
@@ -1041,7 +1041,7 @@
     /*
      * Find recent changes.
      */
-    public function most_recent($params)
+    public function most_recent(array $params)
     {
         $limit = 0;
         $since = 0;
@@ -1161,7 +1161,7 @@
      * @param string $to       Future page name
      */
 
-    public function rename_page($pagename, $to)
+    public function rename_page(string $pagename, string $to)
     {
         $dbh = &$this->_dbh;
         extract($this->_table_names);
@@ -1239,7 +1239,7 @@
      * Calls can be nested.  The tables won't be unlocked until
      * _unlock_database() is called as many times as _lock_database().
      */
-    public function lock($tables = array(), $write_lock = true)
+    public function lock(array $tables = array(), bool $write_lock = true)
     {
         if ($this->_lock_count++ == 0) {
             $this->_current_lock = $tables;
@@ -1270,7 +1270,7 @@
      *
      * @see _lock_database
      */
-    public function unlock($tables = array(), $force = false)
+    public function unlock(array $tables = array(), bool $force = false)
     {
         if ($this->_lock_count == 0) {
             $this->_current_lock = false;
@@ -1330,13 +1330,13 @@
         return $this->_dbh->databaseType;
     }
 
-    public function connection()
+    public function connection(): bool
     {
         trigger_error("PDO: connectionID unsupported", E_USER_ERROR);
         return false;
     }
 
-    public function listOfTables()
+    public function listOfTables(): array
     {
         trigger_error("PDO: virtual listOfTables", E_USER_ERROR);
         return array();
@@ -1362,7 +1362,7 @@
      BETWEEN $offset AND $last
      ORDER BY $pk $asc_desc
      */
-    public function _limit_sql($limit = false)
+    public function _limit_sql($limit = false): string
     {
         if ($limit) {
             list($offset, $count) = $this->limit($limit);
@@ -1413,7 +1413,7 @@
         //$this->_fields = $field_list;
     }
 
-    public function count()
+    public function count(): int
     {
         if (!is_object($this->_result)) {
             return false;
@@ -1467,7 +1467,7 @@
 
 class WikiDB_backend_PDO_search extends WikiDB_backend_search_sql
 {
-    public function _pagename_match_clause($node)
+    public function _pagename_match_clause($node): string
     {
         $word = $node->sql();
         if ($word == '%') { // ALL shortcut
@@ -1481,7 +1481,7 @@
         }
     }
 
-    public function _fulltext_match_clause($node)
+    public function _fulltext_match_clause($node): string
     {
         // force word-style %word% for fulltext search
         $dbh = &$this->_dbh;
@@ -1538,7 +1538,7 @@
  *
  * @author Tomas V.V.Cox <[email protected]>
  */
-function parseDSN($dsn)
+function parseDSN(string $dsn): array
 {
     $parsed = array(
         'phptype' => false,

Modified: trunk/lib/WikiDB/backend/PDO_mysql.php
===================================================================
--- trunk/lib/WikiDB/backend/PDO_mysql.php	2023-07-14 10:33:04 UTC (rev 11051)
+++ trunk/lib/WikiDB/backend/PDO_mysql.php	2023-07-14 11:00:34 UTC (rev 11052)
@@ -35,7 +35,7 @@
         $this->_dbh->query("SET NAMES 'utf8'");
     }
 
-    public function backendType()
+    public function backendType(): string
     {
         return 'mysql';
     }
@@ -66,7 +66,7 @@
     /**
      * Pack tables.
      */
-    public function optimize()
+    public function optimize(): bool
     {
         $this->_timeout();
         foreach ($this->_table_names as $table) {
@@ -75,7 +75,7 @@
         return true;
     }
 
-    public function listOfTables()
+    public function listOfTables(): array
     {
         $sth = $this->_dbh->prepare("SHOW TABLES");
         $sth->execute();
@@ -90,7 +90,7 @@
      * offset specific syntax within mysql
      * convert from,count to SQL "LIMIT $from, $count"
      */
-    public function _limit_sql($limit = false)
+    public function _limit_sql($limit = false): string
     {
         if ($limit) {
             list($from, $count) = $this->limit($limit);

Modified: trunk/lib/WikiDB/backend/PDO_oci8.php
===================================================================
--- trunk/lib/WikiDB/backend/PDO_oci8.php	2023-07-14 10:33:04 UTC (rev 11051)
+++ trunk/lib/WikiDB/backend/PDO_oci8.php	2023-07-14 11:00:34 UTC (rev 11052)
@@ -29,12 +29,12 @@
 
 class WikiDB_backend_PDO_oci8 extends WikiDB_backend_PDO
 {
-    public function backendType()
+    public function backendType(): string
     {
         return 'oci8';
     }
 
-    public function optimize()
+    public function optimize(): bool
     {
         // Do nothing here -- Leave that for the DBA
         // Cost Based Optimizer tuning vary from version to version

Modified: trunk/lib/WikiDB/backend/PDO_pgsql.php
===================================================================
--- trunk/lib/WikiDB/backend/PDO_pgsql.php	2023-07-14 10:33:04 UTC (rev 11051)
+++ trunk/lib/WikiDB/backend/PDO_pgsql.php	2023-07-14 11:00:34 UTC (rev 11052)
@@ -29,7 +29,7 @@
 
 class WikiDB_backend_PDO_pgsql extends WikiDB_backend_PDO
 {
-    public function backendType()
+    public function backendType(): string
     {
         return 'pgsql';
     }
@@ -38,7 +38,7 @@
      * offset specific syntax within pgsql
      * convert from,count to SQL "LIMIT $count OFFSET $from"
      */
-    public function _limit_sql($limit = false)
+    public function _limit_sql($limit = false): string
     {
         if ($limit) {
             list($from, $count) = $this->limit($limit);

Modified: trunk/lib/WikiDB/backend/PearDB.php
===================================================================
--- trunk/lib/WikiDB/backend/PearDB.php	2023-07-14 10:33:04 UTC (rev 11051)
+++ trunk/lib/WikiDB/backend/PearDB.php	2023-07-14 11:00:34 UTC (rev 11052)
@@ -166,7 +166,7 @@
     /*
      * Read page information from database.
      */
-    public function get_pagedata($pagename)
+    public function get_pagedata(string $pagename): array
     {
         $dbh = &$this->_dbh;
         //trigger_error("GET_PAGEDATA $pagename", E_USER_NOTICE);
@@ -181,7 +181,7 @@
         return $result ? $this->_extract_page_data($result) : false;
     }
 
-    public function _extract_page_data($data)
+    public function _extract_page_data($data): array
     {
         if (empty($data)) {
             return array();
@@ -194,7 +194,7 @@
         }
     }
 
-    public function update_pagedata($pagename, $newdata)
+    public function update_pagedata(string $pagename, array $newdata)
     {
         $dbh = &$this->_dbh;
         $page_tbl = $this->_table_names['page_tbl'];
@@ -309,7 +309,7 @@
         return $id;
     }
 
-    public function get_latest_version($pagename)
+    public function get_latest_version(string $pagename): int
     {
         $dbh = &$this->_dbh;
         extract($this->_table_names);
@@ -323,7 +323,7 @@
             ));
     }
 
-    public function get_previous_version($pagename, $version)
+    public function get_previous_version(string $pagename, int $version): int
     {
         $dbh = &$this->_dbh;
         extract($this->_table_names);
@@ -353,7 +353,7 @@
      *
      * @return array|false The version data, or false if specified version does not exist.
      */
-    public function get_versiondata($pagename, $version, $want_content = false)
+    public function get_versiondata(string $pagename, int $version, bool $want_content = false)
     {
         $dbh = &$this->_dbh;
         extract($this->_table_names);
@@ -428,7 +428,7 @@
     /*
      * Create a new revision of a page.
      */
-    public function set_versiondata($pagename, $version, $data)
+    public function set_versiondata(string $pagename, int $version, array $data)
     {
         $dbh = &$this->_dbh;
         $version_tbl = $this->_table_names['version_tbl'];
@@ -471,7 +471,7 @@
     /*
      * Delete an old revision of a page.
      */
-    public function delete_versiondata($pagename, $version)
+    public function delete_versiondata(string $pagename, int $version)
     {
         $dbh = &$this->_dbh;
         extract($this->_table_names);
@@ -491,7 +491,7 @@
     /*
      * Delete page completely from the database.
      */
-    public function purge_page($pagename)
+    public function purge_page(string $pagename): int
     {
         $dbh = &$this->_dbh;
         extract($this->_table_names);
@@ -527,7 +527,7 @@
      * @param string $pagename Page name
      * @param array  $links    List of page(names) which page links to.
      */
-    public function set_links($pagename, $links)
+    public function set_links(string $pagename, array $links)
     {
         // Update link table.
         // FIXME: optimize: mysql can do this all in one big INSERT/REPLACE.
@@ -591,13 +591,13 @@
      *   if (isset($next['linkrelation']))
      */
     public function get_links(
-        $pagename,
-        $reversed = true,
-        $include_empty = false,
-        $sortby = '',
-        $limit = '',
-        $exclude = '',
-        $want_relations = false
+        string $pagename,
+        bool   $reversed = true,
+        bool   $include_empty = false,
+        string $sortby = '',
+        string $limit = '',
+        string $exclude = '',
+        bool $want_relations = false
     )
     {
         $dbh = &$this->_dbh;
@@ -666,10 +666,10 @@
     }
 
     public function get_all_pages(
-        $include_empty = false,
-        $sortby = '',
-        $limit = '',
-        $exclude = ''
+        bool   $include_empty = false,
+        string $sortby = '',
+        string $limit = '',
+        string $exclude = ''
     )
     {
         $dbh = &$this->_dbh;
@@ -733,11 +733,11 @@
      * Text search (title or full text)
      */
     public function text_search(
-        $search,
-        $fulltext = false,
-        $sortby = '',
-        $limit = '',
-        $exclude = ''
+        object $search,
+        bool   $fulltext = false,
+        string $sortby = '',
+        string $limit = '',
+        string $exclude = ''
     )
     {
         $dbh = &$this->_dbh;
@@ -788,7 +788,7 @@
 
     //Todo: check if the better Mysql MATCH operator is supported,
     // (ranked search) and also google like expressions.
-    public function _sql_match_clause($word)
+    public function _sql_match_clause($word): string
     {
         $word = preg_replace('/(?=[%_\\\\])/', "\\", $word);
         $word = $this->_dbh->escapeSimple($word);
@@ -799,7 +799,7 @@
         return "LOWER(pagename) LIKE '%$word%'";
     }
 
-    public function _sql_casematch_clause($word)
+    public function _sql_casematch_clause($word): string
     {
         $word = preg_replace('/(?=[%_\\\\])/', "\\", $word);
         $word = $this->_dbh->escapeSimple($word);
@@ -806,7 +806,7 @@
         return "pagename LIKE '%$word%'";
     }
 
-    public function _fullsearch_sql_match_clause($word)
+    public function _fullsearch_sql_match_clause($word): string
     {
         $word = preg_replace('/(?=[%_\\\\])/', "\\", $word);
         $word = $this->_dbh->escapeSimple($word);
@@ -815,7 +815,7 @@
         return "LOWER(pagename) LIKE '%$word%' OR content LIKE '%$word%'";
     }
 
-    public function _fullsearch_sql_casematch_clause($word)
+    public function _fullsearch_sql_casematch_clause($word): string
     {
         $word = preg_replace('/(?=[%_\\\\])/', "\\", $word);
         $word = $this->_dbh->escapeSimple($word);
@@ -822,7 +822,7 @@
         return "pagename LIKE '%$word%' OR content LIKE '%$word%'";
     }
 
-    public function _sql_set(&$pagenames)
+    public function _sql_set(&$pagenames): string
     {
         $s = '(';
         foreach ($pagenames as $p) {
@@ -834,7 +834,7 @@
     /*
      * Find highest or lowest hit counts.
      */
-    public function most_popular($limit = 20, $sortby = '-hits')
+    public function most_popular(int $limit = 20, string $sortby = '-hits')
     {
         $dbh = &$this->_dbh;
         extract($this->_table_names);
@@ -872,7 +872,7 @@
     /*
      * Find recent changes.
      */
-    public function most_recent($params)
+    public function most_recent(array $params)
     {
         $limit = 0;
         $since = 0;
@@ -981,7 +981,7 @@
      * @param string $to       Future page name
      */
 
-    public function rename_page($pagename, $to)
+    public function rename_page(string $pagename, string $to)
     {
         $dbh = &$this->_dbh;
         extract($this->_table_names);
@@ -1006,7 +1006,7 @@
      * Can be undone and is seen in RecentChanges.
      */
 
-    public function delete_page($pagename)
+    public function delete_page(string $pagename)
     {
         /**
          * @var WikiRequest $request
@@ -1084,7 +1084,7 @@
      * Calls can be nested.  The tables won't be unlocked until
      * _unlock_database() is called as many times as _lock_database().
      */
-    public function lock($tables = array(), $write_lock = true)
+    public function lock(array $tables = array(), bool $write_lock = true)
     {
         if ($this->_lock_count++ == 0) {
             $this->_lock_tables($write_lock);
@@ -1108,7 +1108,7 @@
      *
      * @see _lock_database
      */
-    public function unlock($tables = array(), $force = false)
+    public function unlock(array $tables = array(), bool $force = false)
     {
         if ($this->_lock_count == 0) {
             return;
@@ -1173,7 +1173,7 @@
      *
      * @return bool True iff error is not really an error.
      */
-    private function _is_false_error($error)
+    private function _is_false_error($error): bool
     {
         if ($error->getCode() != DB_ERROR) {
             return false;
@@ -1268,7 +1268,7 @@
         $this->_options = $field_list;
     }
 
-    public function count()
+    public function count(): int
     {
         if (!$this->_result) {
             return false;
@@ -1306,7 +1306,7 @@
         }
     }
 
-    public function asArray()
+    public function asArray(): array
     {
         $result = array();
         while ($page = $this->next()) {

Modified: trunk/lib/WikiDB/backend/PearDB_ffpgsql.php
===================================================================
--- trunk/lib/WikiDB/backend/PearDB_ffpgsql.php	2023-07-14 10:33:04 UTC (rev 11051)
+++ trunk/lib/WikiDB/backend/PearDB_ffpgsql.php	2023-07-14 11:00:34 UTC (rev 11052)
@@ -93,13 +93,13 @@
     /*
      * Read page information from database.
      */
-    public function get_pagedata($pagename)
+    public function get_pagedata(string $pagename)
     {
         global $page_prefix;
         return parent::get_pagedata($page_prefix . $pagename);
     }
 
-    public function update_pagedata($pagename, $newdata)
+    public function update_pagedata(string $pagename, array $newdata)
     {
         $dbh = &$this->_dbh;
         $page_tbl = $this->_table_names['page_tbl'];
@@ -164,13 +164,13 @@
         $this->unlock(array($page_tbl));
     }
 
-    public function get_latest_version($pagename)
+    public function get_latest_version(string $pagename): int
     {
         global $page_prefix;
         return parent::get_latest_version($page_prefix . $pagename);
     }
 
-    public function get_previous_version($pagename, $version)
+    public function get_previous_version(string $pagename, int $version): int
     {
         global $page_prefix;
         return parent::get_previous_version($page_prefix . $pagename, $version);
@@ -185,7 +185,7 @@
      *
      * @return array The version data, or false if specified version does not exist.
      */
-    public function get_versiondata($pagename, $version, $want_content = false)
+    public function get_versiondata(string $pagename, int $version, bool $want_content = false): array
     {
         $dbh = &$this->_dbh;
         extract($this->_table_names);
@@ -288,7 +288,7 @@
     /*
      * Delete page completely from the database.
      */
-    public function purge_page($pagename)
+    public function purge_page(string $pagename): int
     {
         $dbh = &$this->_dbh;
         extract($this->_table_names);
@@ -335,13 +335,13 @@
      *   if (isset($next['linkrelation']))
      */
     public function get_links(
-        $pagename,
-        $reversed = true,
-        $include_empty = false,
-        $sortby = '',
-        $limit = '',
-        $exclude = '',
-        $want_relations = false
+        string $pagename,
+        bool   $reversed = true,
+        bool   $include_empty = false,
+        string $sortby = '',
+        string $limit = '',
+        string $exclude = '',
+        bool $want_relations = false
     )
     {
         $dbh = &$this->_dbh;
@@ -393,10 +393,10 @@
     }
 
     public function get_all_pages(
-        $include_empty = false,
-        $sortby = '',
-        $limit = '',
-        $exclude = ''
+        bool   $include_empty = false,
+        string $sortby = '',
+        string $limit = '',
+        string $exclude = ''
     )
     {
         $dbh = &$this->_dbh;
@@ -468,7 +468,7 @@
     /*
      * Find highest or lowest hit counts.
      */
-    public function most_popular($limit = 20, $sortby = '-hits')
+    public function most_popular(int $limit = 20, string $sortby = '-hits')
     {
         $dbh = &$this->_dbh;
         extract($this->_table_names);
@@ -510,7 +510,7 @@
     /*
      * Find recent changes.
      */
-    public function most_recent($params)
+    public function most_recent(array $params)
     {
         $limit = 0;
         $since = 0;
@@ -628,7 +628,7 @@
      * @param string $to       Future page name
      */
 
-    public function rename_page($pagename, $to)
+    public function rename_page(string $pagename, string $to)
     {
         $dbh = &$this->_dbh;
         extract($this->_table_names);
@@ -681,7 +681,7 @@
      * Pack tables.
      * NOTE: Disable vacuum, wikiuser is not the table owner
      */
-    public function optimize()
+    public function optimize(): bool
     {
         return true;
     }
@@ -690,11 +690,11 @@
      * Text search (title or full text)
      */
     public function text_search(
-        $search,
-        $fulltext = false,
-        $sortby = '',
-        $limit = '',
-        $exclude = ''
+        object $search,
+        bool   $fulltext = false,
+        string $sortby = '',
+        string $limit = '',
+        string $exclude = ''
     )
     {
         $dbh = &$this->_dbh;
@@ -757,7 +757,7 @@
         return $iter;
     }
 
-    public function exists_link($pagename, $link, $reversed = false)
+    public function exists_link($pagename, $link, $reversed = false): int
     {
         $dbh = &$this->_dbh;
         extract($this->_table_names);
@@ -781,7 +781,7 @@
 
 class WikiDB_backend_PearDB_ffpgsql_search extends WikiDB_backend_PearDB_pgsql_search
 {
-    public function _pagename_match_clause($node)
+    public function _pagename_match_clause($node): string
     {
         $word = $node->sql();
         // @alu: use _quote maybe instead of direct pg_escape_string

Modified: trunk/lib/WikiDB/backend/PearDB_mysqli.php
===================================================================
--- trunk/lib/WikiDB/backend/PearDB_mysqli.php	2023-07-14 10:33:04 UTC (rev 11051)
+++ trunk/lib/WikiDB/backend/PearDB_mysqli.php	2023-07-14 11:00:34 UTC (rev 11052)
@@ -51,7 +51,7 @@
     /*
      * Create a new revision of a page.
      */
-    public function set_versiondata($pagename, $version, $data)
+    public function set_versiondata(string $pagename, int $version, array $data)
     {
         $dbh = &$this->_dbh;
         $version_tbl = $this->_table_names['version_tbl'];
@@ -163,7 +163,7 @@
     /**
      * Pack tables.
      */
-    public function optimize()
+    public function optimize(): bool
     {
         $dbh = &$this->_dbh;
         $this->_timeout();
@@ -211,7 +211,7 @@
 
 class WikiDB_backend_PearDB_mysqli_search extends WikiDB_backend_PearDB_search
 {
-    public function _pagename_match_clause($node)
+    public function _pagename_match_clause($node): string
     {
         $word = $node->sql();
         $dbh = &$this->_dbh;

Modified: trunk/lib/WikiDB/backend/PearDB_oci8.php
===================================================================
--- trunk/lib/WikiDB/backend/PearDB_oci8.php	2023-07-14 10:33:04 UTC (rev 11051)
+++ trunk/lib/WikiDB/backend/PearDB_oci8.php	2023-07-14 11:00:34 UTC (rev 11052)
@@ -60,7 +60,7 @@
     /**
      * Pack tables.
      */
-    public function optimize()
+    public function optimize(): bool
     {
         // Do nothing here -- Leave that for the DBA
         // Cost Based Optimizer tuning vary from version to version
@@ -89,7 +89,7 @@
         }
     }
 
-    public function _quote($s)
+    public function _quote($s): string
     {
         return base64_encode($s);
     }
@@ -135,7 +135,7 @@
     // Index on the CLOB. While it is very efficient, it requires the
     // Intermedia Text option, so let's stick to the 'simple' thing
     // Note that this does only an exact fulltext search, not using MATCH or LIKE.
-    public function _fulltext_match_clause($node)
+    public function _fulltext_match_clause($node): string
     {
         if ($this->isStoplisted($node)) {
             return "1=1";

Modified: trunk/lib/WikiDB/backend/PearDB_pgsql.php
===================================================================
--- trunk/lib/WikiDB/backend/PearDB_pgsql.php	2023-07-14 10:33:04 UTC (rev 11051)
+++ trunk/lib/WikiDB/backend/PearDB_pgsql.php	2023-07-14 11:00:34 UTC (rev 11052)
@@ -43,7 +43,7 @@
      * Pack tables.
      * NOTE: Only the table owner can do this. Either fix the schema or setup autovacuum.
      */
-    public function optimize()
+    public function optimize(): bool
     {
         return true; // if the wikiuser is not the table owner
 
@@ -55,7 +55,7 @@
         */
     }
 
-    public function _quote($s)
+    public function _quote($s): string
     {
         if (USE_BYTEA) {
             return pg_escape_bytea($s);
@@ -166,11 +166,11 @@
      * Text search (title or full text)
      */
     public function text_search(
-        $search,
-        $fulltext = false,
-        $sortby = '',
-        $limit = '',
-        $exclude = ''
+        object $search,
+        bool   $fulltext = false,
+        string $sortby = '',
+        string $limit = '',
+        string $exclude = ''
     )
     {
         $dbh = &$this->_dbh;
@@ -230,7 +230,7 @@
 
 class WikiDB_backend_PearDB_pgsql_search extends WikiDB_backend_PearDB_search
 {
-    public function _pagename_match_clause($node)
+    public function _pagename_match_clause($node): string
     {
         $word = $node->sql();
         if ($node->op == 'REGEX') { // posix regex extensions
@@ -258,7 +258,7 @@
      * The full-text index will still be used, and the regex will be used to
      * prune the results afterwards.
      */
-    public function _fulltext_match_clause($node)
+    public function _fulltext_match_clause($node): string
     {
         $word = strtolower($node->word);
         $word = str_replace(" ", "&", $word); // phrase fix

Modified: trunk/lib/WikiDB/backend/dba.php
===================================================================
--- trunk/lib/WikiDB/backend/dba.php	2023-07-14 10:33:04 UTC (rev 11051)
+++ trunk/lib/WikiDB/backend/dba.php	2023-07-14 11:00:34 UTC (rev 11052)
@@ -60,11 +60,11 @@
         parent::__construct($db);
     }
 
-    public function lock($tables = array(), $write_lock = true)
+    public function lock(array $tables = array(), bool $write_lock = true)
     {
     }
 
-    public function unlock($tables = array(), $force = false)
+    public function unlock(array $tables = array(), bool $force = false)
     {
     }
 }

Modified: trunk/lib/WikiDB/backend/dbaBase.php
===================================================================
--- trunk/lib/WikiDB/backend/dbaBase.php	2023-07-14 10:33:04 UTC (rev 11051)
+++ trunk/lib/WikiDB/backend/dbaBase.php	2023-07-14 11:00:34 UTC (rev 11052)
@@ -82,16 +82,16 @@
         $this->_dbdb = new DbaPartition($dba, 'd');
     }
 
-    public function sortable_columns()
+    public function sortable_columns(): array
     {
         return array('pagename', 'mtime' /*,'author_id','author'*/);
     }
 
-    public function lock($tables = array(), $write_lock = true)
+    public function lock(array $tables = array(), bool $write_lock = true)
     {
     }
 
-    public function unlock($tables = array(), $force = false)
+    public function unlock(array $tables = array(), bool $force = false)
     {
     }
 
@@ -100,7 +100,7 @@
         $this->_db->close();
     }
 
-    public function optimize()
+    public function optimize(): bool
     {
         $this->_db->optimize();
         return true;
@@ -111,7 +111,7 @@
         $this->_db->sync();
     }
 
-    public function rebuild($args = false)
+    public function rebuild(bool $args = false): bool
     {
         if (!empty($args['all'])) {
             $result = parent::rebuild();
@@ -125,7 +125,7 @@
         return true;
     }
 
-    public function check($args = false)
+    public function check(bool $args = false): bool
     {
         // cleanup v?Pagename UNKNOWN0x0
         $errs = array();
@@ -162,7 +162,7 @@
         return array_merge($errs, $this->_linkdb->check());
     }
 
-    public function get_pagedata($pagename)
+    public function get_pagedata(string $pagename): array
     {
         $result = $this->_pagedb->get($pagename);
         if (!$result) {
@@ -172,7 +172,7 @@
         return unserialize($packed);
     }
 
-    public function update_pagedata($pagename, $newdata)
+    public function update_pagedata(string $pagename, array $newdata)
     {
         $result = $this->_pagedb->get($pagename);
         if ($result) {
@@ -198,12 +198,12 @@
         );
     }
 
-    public function get_latest_version($pagename)
+    public function get_latest_version(string $pagename): int
     {
         return (int)$this->_pagedb->get($pagename);
     }
 
-    public function get_previous_version($pagename, $version)
+    public function get_previous_version(string $pagename, int $version): int
     {
         $versdb = &$this->_versiondb;
 
@@ -224,7 +224,7 @@
      *
      * @return array|false The version data, or false if specified version does not exist
      */
-    public function get_versiondata($pagename, $version, $want_content = false)
+    public function get_versiondata(string $pagename, int $version, bool $want_content = false)
     {
         $data = $this->_versiondb->get((int)$version . ":$pagename");
         if (empty($data) or $data == 'UNKNOWN'.chr(0)) {
@@ -246,7 +246,7 @@
      * Can be undone and is seen in RecentChanges.
      * See backend.php
      */
-    public function delete_page($pagename)
+    public function delete_page(string $pagename)
     {
         /**
          * @var WikiRequest $request
@@ -275,7 +275,7 @@
     /*
      * Completely delete all page revisions from the database.
      */
-    public function purge_page($pagename)
+    public function purge_page(string $pagename)
     {
         $pagedb = &$this->_pagedb;
         $versdb = &$this->_versiondb;
@@ -296,7 +296,7 @@
      * @param string $to       Future page name
      */
 
-    public function rename_page($pagename, $to)
+    public function rename_page(string $pagename, string $to): bool
     {
         /**
          * @var WikiRequest $request
@@ -337,7 +337,7 @@
     /*
      * Delete an old revision of a page.
      */
-    public function delete_versiondata($pagename, $version)
+    public function delete_versiondata(string $pagename, int $version)
     {
         $versdb = &$this->_versiondb;
 
@@ -363,7 +363,7 @@
     /*
      * Create a new revision of a page.
      */
-    public function set_versiondata($pagename, $version, $data)
+    public function set_versiondata(string $pagename, int $version, array $data)
     {
         $versdb = &$this->_versiondb;
         // fix broken pages
@@ -396,7 +396,7 @@
         $pagedb->set($pagename, (int)$latest . ':' . (int)$flags . ":$pagedata");
     }
 
-    public function numPages($include_empty = false, $exclude = '')
+    public function numPages($include_empty = false, $exclude = ''): int
     {
         $pagedb = &$this->_pagedb;
         $count = 0;
@@ -422,7 +422,7 @@
         return $count;
     }
 
-    public function get_all_pages($include_empty = false, $sortby = '', $limit = '', $exclude = '')
+    public function get_all_pages(bool $include_empty = false, string $sortby = '', string $limit = '', string $exclude = '')
     {
         $pagedb = &$this->_pagedb;
         $pages = array();
@@ -473,7 +473,7 @@
      * @param string $pagename Page name
      * @param array  $links    List of page(names) which page links to.
      */
-    public function set_links($pagename, $links)
+    public function set_links(string $pagename, array $links)
     {
         $this->_linkdb->set_links($pagename, $links);
     }
@@ -494,13 +494,13 @@
      */
 
     public function get_links(
-        $pagename,
-        $reversed = true,
-        $include_empty = false,
-        $sortby = '',
-        $limit = '',
-        $exclude = '',
-        $want_relations = false
+        string $pagename,
+        bool   $reversed = true,
+        bool   $include_empty = false,
+        string $sortby = '',
+        string $limit = '',
+        string $exclude = '',
+        bool $want_relations = false
     )
     {
         // optimization: if no relation at all is found, mark it in the iterator.
@@ -527,7 +527,7 @@
         $also_attributes = false,
         $only_attributes = false,
         $sorted = true
-    )
+    ): array
     {
         $linkdb = &$this->_linkdb;
         $relations = array();
@@ -568,7 +568,7 @@
      * the link key, we iterate here directly over the
      * linkdb and check the pagematch there.
      *
-     * @param object$pages      A TextSearchQuery object for the pagename filter.
+     * @param object $pages      A TextSearchQuery object for the pagename filter.
      * @param object $linkvalue     A SearchQuery object (Text or Numeric) for the linkvalues,
      *                          linkto, linkfrom (=backlink), relation or attribute values.
      * @param string $linktype  One of the 4 linktypes "linkto",
@@ -580,11 +580,11 @@
      * @see WikiDB::linkSearch
      */
     public function link_search(
-        $pages,
-        $linkvalue,
-        $linktype,
+        object $pages,
+        object $linkvalue,
+        string $linktype,
         $relation = false,
-        $options = array()
+        array $options = array()
     )
     {
         /**
@@ -713,7 +713,7 @@
      * @return object A WikiDB_backend_iterator.
      * @see WikiDB::linkSearch
      */
-    public function relation_search($pages, $query, $options = array())
+    public function relation_search(object $pages, object $query, array $options = array())
     {
         /**
          * @var WikiRequest $request
@@ -778,22 +778,22 @@
     }
 }
 
-function WikiDB_backend_dbaBase_sortby_pagename_ASC($a, $b)
+function WikiDB_backend_dbaBase_sortby_pagename_ASC($a, $b): int
 {
     return strcasecmp($a, $b);
 }
 
-function WikiDB_backend_dbaBase_sortby_pagename_DESC($a, $b)
+function WikiDB_backend_dbaBase_sortby_pagename_DESC($a, $b): int
 {
     return strcasecmp($b, $a);
 }
 
-function WikiDB_backend_dbaBase_sortby_mtime_ASC($a, $b)
+function WikiDB_backend_dbaBase_sortby_mtime_ASC($a, $b): int
 {
     return WikiDB_backend_dbaBase_sortby_num($a, $b, 'mtime');
 }
 
-function WikiDB_backend_dbaBase_sortby_mtime_DESC($a, $b)
+function WikiDB_backend_dbaBase_sortby_mtime_DESC($a, $b): int
 {
     return WikiDB_backend_dbaBase_sortby_num($b, $a, 'mtime');
 }
@@ -806,7 +806,7 @@
     return WikiDB_backend_dbaBase_sortby_num($b, $a, 'hits');
 }
 */
-function WikiDB_backend_dbaBase_sortby_num($aname, $bname, $field)
+function WikiDB_backend_dbaBase_sortby_num($aname, $bname, $field): int
 {
     global $request;
     $dbi = $request->getDbh();
@@ -910,7 +910,7 @@
 
     //TODO: try storing link lists as hashes rather than arrays.
     //      backlink deletion would be faster.
-    public function get_links($page, $reversed = true, $want_relations = false)
+    public function get_links($page, $reversed = true, $want_relations = false): array
     {
         if ($want_relations) {
             $this->found_relations = 0;
@@ -1086,7 +1086,7 @@
         $this->_set_links('i', $page, $backlinks);
     }
 
-    public function _has_link($which, $page, $link)
+    public function _has_link($which, $page, $link): bool
     {
         $links = $this->_get_links($which, $page);
         // NOTE: only backlinks are sorted, so need to do linear search

Modified: trunk/lib/WikiDB/backend/dumb/AllRevisionsIter.php
===================================================================
--- trunk/lib/WikiDB/backend/dumb/AllRevisionsIter.php	2023-07-14 10:33:04 UTC (rev 11051)
+++ trunk/lib/WikiDB/backend/dumb/AllRevisionsIter.php	2023-07-14 11:00:34 UTC (rev 11052)
@@ -35,23 +35,23 @@
     /**
      * @var WikiDB_backend
      */
-    private $_backend;
+    private WikiDB_backend $_backend;
 
     /**
      * @var int
      */
-    private $_lastversion;
+    private int $_lastversion;
 
     /**
      * @var string
      */
-    private $_pagename;
+    private string $_pagename;
 
     /**
      * @param WikiDB_backend $backend
      * @param string $pagename Page whose revisions to get.
      */
-    public function __construct($backend, $pagename)
+    public function __construct($backend, string $pagename)
     {
         $this->_backend = &$backend;
         $this->_pagename = $pagename;

Modified: trunk/lib/WikiDB/backend/dumb/LinkSearchIter.php
===================================================================
--- trunk/lib/WikiDB/backend/dumb/LinkSearchIter.php	2023-07-14 10:33:04 UTC (rev 11051)
+++ trunk/lib/WikiDB/backend/dumb/LinkSearchIter.php	2023-07-14 11:00:34 UTC (rev 11052)
@@ -170,7 +170,7 @@
     }
 
     // get the links of each page in advance
-    public function _get_links($pagename)
+    public function _get_links($pagename): array
     {
         $links = array();
         if ($this->linktype == 'attribute') {

Modified: trunk/lib/WikiDB/backend/dumb/MostPopularIter.php
===================================================================
--- trunk/lib/WikiDB/backend/dumb/MostPopularIter.php	2023-07-14 10:33:04 UTC (rev 11051)
+++ trunk/lib/WikiDB/backend/dumb/MostPopularIter.php	2023-07-14 11:00:34 UTC (rev 11052)
@@ -81,7 +81,7 @@
     }
 }
 
-function WikiDB_backend_dumb_MostPopularIter_sortf($a, $b)
+function WikiDB_backend_dumb_MostPopularIter_sortf($a, $b): int
 {
     $ahits = $bhits = 0;
     if (isset($a['pagedata']['hits'])) {
@@ -93,7 +93,7 @@
     return $bhits - $ahits;
 }
 
-function WikiDB_backend_dumb_MostPopularIter_sortf_rev($a, $b)
+function WikiDB_backend_dumb_MostPopularIter_sortf_rev($a, $b): int
 {
     $ahits = $bhits = 0;
     if (isset($a['pagedata']['hits'])) {

Modified: trunk/lib/WikiDB/backend/file.php
===================================================================
--- trunk/lib/WikiDB/backend/file.php	2023-07-14 10:33:04 UTC (rev 11051)
+++ trunk/lib/WikiDB/backend/file.php	2023-07-14 11:00:34 UTC (rev 11052)
@@ -85,7 +85,7 @@
 
     // *********************************************************************
     // common file load / save functions:
-    protected function _pagename2filename($type, $pagename, $version = 0)
+    protected function _pagename2filename($type, $pagename, $version = 0): string
     {
         if ($version == 0) {
             return $this->_dir_names[$type] . '/' . urlencode($pagename);
@@ -276,7 +276,7 @@
 
     // *********************************************************************
     // Load/Save Page-Links
-    protected function _loadPageLinks($pagename)
+    protected function _loadPageLinks($pagename): array
     {
         $pd = $this->_loadPage('links', $pagename, 0, false);
         if ($pd != null) {
@@ -306,7 +306,7 @@
      *                    don't think we need this...)
      * </dl>
      */
-    public function get_pagedata($pagename)
+    public function get_pagedata(string $pagename): array
     {
         return $this->_loadPageData($pagename);
     }
@@ -335,7 +335,7 @@
      * @param array $newdata hash New meta-data.
      *
      */
-    public function update_pagedata($pagename, $newdata)
+    public function update_pagedata(string $pagename, array $newdata)
     {
         $data = $this->get_pagedata($pagename);
         if (count($data) == 0) {
@@ -364,7 +364,7 @@
      * @return int The latest version number for the page.  Returns zero if
      *  no versions of a page exist.
      */
-    public function get_latest_version($pagename)
+    public function get_latest_version(string $pagename): int
     {
         return $this->_getLatestVersion($pagename);
     }
@@ -379,7 +379,7 @@
      *
      * FIXED: Check if this version really exists!
      */
-    public function get_previous_version($pagename, $version)
+    public function get_previous_version(string $pagename, int $version): int
     {
         $prev = ($version > 0 ? $version - 1 : 0);
         while ($prev and !file_exists($this->_pagename2filename('ver_data', $pagename, $prev))) {
@@ -412,7 +412,7 @@
      * For description of other version meta-data see WikiDB_PageRevision::get().
      * @see WikiDB_PageRevision::get
      */
-    public function get_versiondata($pagename, $version, $want_content = false)
+    public function get_versiondata(string $pagename, int $version, bool $want_content = false)
     {
         $vd = $this->_loadVersionData($pagename, $version);
         if ($vd == null) {
@@ -428,7 +428,7 @@
      * @param string $to       Future page name
      */
 
-    public function rename_page($pagename, $to)
+    public function rename_page(string $pagename, string $to): bool
     {
         global $request;
         $version = $this->_getLatestVersion($pagename);
@@ -456,7 +456,7 @@
     /*
      * See PDO for a better delete_page(), which can be undone and is seen in RecentChanges.
      */
-    public function delete_page($pagename)
+    public function delete_page(string $pagename)
     {
         $this->purge_page($pagename);
     }
@@ -466,7 +466,7 @@
      *
      * @param string $pagename Page name.
      */
-    public function purge_page($pagename)
+    public function purge_page(string $pagename)
     {
         $ver = $this->get_latest_version($pagename);
         while ($ver > 0) {
@@ -491,7 +491,7 @@
      * @param string $pagename Page name.
      * @param int $version int Version to delete.
      */
-    public function delete_versiondata($pagename, $version)
+    public function delete_versiondata(string $pagename, int $version)
     {
         if ($this->get_latest_version($pagename) == $version) {
             // try to delete the latest version!
@@ -522,7 +522,7 @@
      *
      * @see get_versiondata
      */
-    public function set_versiondata($pagename, $version, $data)
+    public function set_versiondata(string $pagename, int $version, array $data)
     {
         $this->_saveVersionData($pagename, $version, $data);
     }
@@ -539,7 +539,7 @@
      * @param array $newdata hash New revision metadata.
      * @see set_versiondata, get_versiondata
      */
-    public function update_versiondata($pagename, $version, $newdata)
+    public function update_versiondata(string $pagename, int $version, array $newdata)
     {
         $data = $this->get_versiondata($pagename, $version, true);
         if (!$data) {
@@ -561,7 +561,7 @@
      * @param string $pagename Page name
      * @param array  $links    List of page(names) which page links to.
      */
-    public function set_links($pagename, $links)
+    public function set_links(string $pagename, array $links)
     {
         $this->_savePageLinks($pagename, $links);
     }
@@ -581,13 +581,13 @@
      * @return object A WikiDB_backend_iterator.
      */
     public function get_links(
-        $pagename,
-        $reversed = true,
-        $include_empty = false,
-        $sortby = '',
-        $limit = '',
-        $exclude = '',
-        $want_relations = false
+        string $pagename,
+        bool   $reversed = true,
+        bool   $include_empty = false,
+        string $sortby = '',
+        string $limit = '',
+        string $exclude = '',
+        bool $want_relations = false
     )
     {
         if ($reversed == false) {
@@ -645,10 +645,10 @@
      * @return object A WikiDB_backend_iterator.
      */
     public function get_all_pages(
-        $include_empty = false,
-        $sortby = '',
-        $limit = '',
-        $exclude = ''
+        bool   $include_empty = false,
+        string $sortby = '',
+        string $limit = '',
+        string $exclude = ''
     )
     {
         require_once 'lib/PageList.php';
@@ -671,12 +671,12 @@
         return new WikiDB_backend_file_iter($this, $a);
     }
 
-    public function sortable_columns()
+    public function sortable_columns(): array
     {
         return array('pagename');
     }
 
-    public function numPages($filter = false, $exclude = '')
+    public function numPages($filter = false, $exclude = ''): int
     {
         $this->_loadLatestVersions();
         return count($this->_latest_versions);
@@ -695,7 +695,7 @@
      *
      *     All backends <em>should</em> support write locking.
      */
-    public function lock($tables = array(), $write_lock = true)
+    public function lock(array $tables = array(), bool $write_lock = true)
     {
     }
 
@@ -707,7 +707,7 @@
      *  unlock() is called as many times as lock() has been.  If $force is
      *  set to true, the the database is unconditionally unlocked.
      */
-    public function unlock($tables = array(), $force = false)
+    public function unlock(array $tables = array(), bool $force = false)
     {
     }
 
@@ -732,7 +732,7 @@
      *
      * @return bool
      */
-    public function optimize()
+    public function optimize(): bool
     {
         //trigger_error("optimize: Not Implemented", E_USER_WARNING);
         return true;
@@ -750,7 +750,7 @@
      * @param bool $args
      * @return bool True iff database is in a consistent state.
      */
-    public function check($args = false)
+    public function check(bool $args = false): bool
     {
         //trigger_error("check: Not Implemented", E_USER_WARNING);
         return true;
@@ -766,13 +766,13 @@
      * @param bool $args
      * @return bool True iff successful.
      */
-    public function rebuild($args = false)
+    public function rebuild(bool $args = false): bool
     {
         //trigger_error("rebuild: Not Implemented", E_USER_WARNING);
         return true;
     }
 
-    public function _parse_searchwords($search)
+    public function _parse_searchwords($search): array
     {
         $search = strtolower(trim($search));
         if (!$search) {
@@ -851,7 +851,7 @@
         return $this->_result;
     }
 
-    public function count()
+    public function count(): int
     {
         return count($this->_result);
     }

Modified: trunk/lib/WikiDB/backend/flatfile.php
===================================================================
--- trunk/lib/WikiDB/backend/flatfile.php	2023-07-14 10:33:04 UTC (rev 11051)
+++ trunk/lib/WikiDB/backend/flatfile.php	2023-07-14 11:00:34 UTC (rev 11052)
@@ -41,7 +41,7 @@
     // *********************************************************************
     // common file load / save functions:
     // FilenameForPage is from loadsave.php
-    protected function _pagename2filename($type, $pagename, $version = 0)
+    protected function _pagename2filename($type, $pagename, $version = 0): string
     {
         $fpagename = FilenameForPage($pagename);
         if (strstr($fpagename, "/")) {

This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.